【问题标题】:How to render an image on the screen C#如何在屏幕上渲染图像C#
【发布时间】:2018-02-25 06:32:28
【问题描述】:

一段时间以来,我一直在尝试创建一个仅在屏幕上显示位图图像的测试程序。理想情况下,图像将是半透明的(具有 Alpha 通道)并且“可点击”。但是,我还没有找到任何方法来做到这一点。

我为此拥有的应用程序是一个键盘指示器应用程序,它在后台运行,并在按下诸如 num lock 或 caps lock 之类的修饰符时在屏幕上显示一个弹出图像几秒钟。

我发现的是一个 MSDN 示例 for how to render an image on the screen,但我无法在 Windows 窗体应用程序中使其正常工作。在空白 WFA 应用程序的 Form1.cs 中,我有:

using System.Drawing;
using System.Windows.Forms;

namespace KeyboardIndicators
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            PictureBox pictureBox1 = new PictureBox();
            pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
        }

        private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs pe)
        {
            Bitmap myBitmap = new Bitmap("Profile Image.jpg");
            Graphics g = pe.Graphics;
            g.DrawImage(myBitmap, 100, 100);
        }
    }
}

我可能在这里遗漏了很多东西,但我在 Visual Studio 中调试它的运气并不好。

我还没有找到一个在线网站,它可以完全描述如何做我想做的事情。我以前在其他应用程序中看到过这种事情,所以我知道它可以通过某种方式完成。

【问题讨论】:

  • 要使“点击可通过”部分,覆盖CreateParams(),设置WS_EX_TRANSPARENT 标志。
  • @Idle_Mind Override ... 在什么范围内?表格1?
  • 没错,无论您希望以何种形式对点击不可见。

标签: c# .net winforms


【解决方案1】:

感谢@Habeeb 对这个问题的初步回答,我找到了我的问题的答案,这启发了我研究这种方法。通过查看this Q/A,我意识到我不需要创建辅助函数来执行此操作。对于@Idle_Mind 的观点,我set the WS_EX_TRANSPARENT flag to transparent

这是我在Form1.cs 文件中最终得到的代码:(我最终将测试图像更改为cube.png,一个带有alpha 通道的.png 图像)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KeyboardIndicators {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();

      PictureBox pictureBox = new PictureBox();

      Image myBitmap = Image.FromFile("cube.png");
      Size bitmapSize = new Size(myBitmap.Width, myBitmap.Height);

      this.Size = bitmapSize;
      pictureBox.ClientSize = bitmapSize;

      pictureBox.Image = myBitmap;
      pictureBox.Dock = DockStyle.Fill;
      this.Controls.Add(pictureBox);
      this.FormBorderStyle = FormBorderStyle.None;
    }

    protected override CreateParams CreateParams {
      get {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT

        return createParams;
      }
    }
  }
}

运行时,屏幕显示如下:

这对我有用,因为它覆盖在我需要的所有应用程序上,是半透明的并且可以点击。

【讨论】:

    【解决方案2】:

    从您的代码中,我没有看到将位图图像设置为 PictureBox。 请尝试以下代码:

    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage ;
    MyImage = new Bitmap(fileToDisplay);
    pictureBox1.ClientSize = new Size(xSize, ySize);
    pictureBox1.Image = (Image) MyImage ;
    

    如果要通过代码添加PictureBox,见下图:

    private void Form1_Load(object sender, EventArgs e)
    {
        var picture = new PictureBox
        {
            Name = "pictureBox1",
            Size = new Size(xSize, ySize),
            Location = new Point(100, 100),
            Image = Image.FromFile("hello.jpg"),
    
        };
        this.Controls.Add(picture);
    }
    

    第一段代码展示了如何更新图像,但方法不同。

    【讨论】:

    • 如果我只使用您建议的代码,(将路径和大小替换为正确的值)不会显示任何内容。如果将图像导入项目,文件路径只是文件名(作为字符串)?我的解决方案资源管理器看起来 like this。测试图片为Profile Image.jpg
    • 你在窗体中添加了pictureBox1控件吗?
    • 我应该添加什么控件?
    • 图片框。我应该被添加到表格中。例如,您在代码中创建了一个新的 PictureBox 控件,但没有添加到 Form。
    • 当然可以,但是我该怎么做呢?
    猜你喜欢
    • 2013-12-31
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多