gpt4 book ai didi

c# - 如何覆盖 Winforms 控件的绘制方法以使其绘制到纹理?

转载 作者:可可西里 更新时间:2023-11-01 10:08:11 25 4
gpt4 key购买 nike

我正在尝试将 Winforms 与 SharpDX 项目集成,以便在我的 3D 应用程序中使用 Winforms(并最终通过 HostElement 使用 WPF)。

我需要创建或配置一个控件或表单,以便我可以:

一个。将其渲染为纹理(我可以将其显示为 Sprite *)
b.过滤其输入以在控件未激活时删除鼠标/键盘事件。

我已经尝试子类化 Control 和 Form,以覆盖 OnPaint 和 OnPaintBackground,但这些对子控件没有影响 - 或者就此而言,表单边框(即使他们这样做了,它们本身也不够,就像我一样)仍然留下一个白色方 block ,我认为已经绘制了“父级”)。

如何停止在屏幕上绘制控件或表单,而只绘制位图?(例如,有什么方法可以在绘制树之前覆盖图形?)

*它需要以这种方式完成(而不是让控件呈现到屏幕上),因为 Winforms 不支持真正的透明度,所以我需要在我的像素着色器中剪切颜色编码的像素。

(确认一下,我并不是指特定的 DirectX 纹理 - 我很高兴(事实上更喜欢)一个简单的 System.Drawing 位图)

最佳答案

这是开始着手的一种方法:

  • 创建一个派生控件类,以便我们可以公开 protected InvokePaint
  • 调用我们的自定义方法获取控件的图像
  • 测试表单需要一个图片框和一个 Mybutton 实例


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

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

private void Form1_Load(object sender, EventArgs e)
{
// create image to which we will draw
var img = new Bitmap(100, 100);

// get a Graphics object via which we will draw to the image
var g = Graphics.FromImage(img);

// create event args with the graphics object
var pea = new PaintEventArgs(g, new Rectangle(new Point(0,0), new Size(100,100)));

// call DoPaint method of our inherited object
btnTarget.DoPaint(pea);

// modify the image with algorithms of your choice...

// display the result in a picture box for testing and proof
pictureBox.BackgroundImage = img;
}
}

public class MyButton : Button
{
// wrapping InvokePaint via a public method
public void DoPaint(PaintEventArgs pea)
{
InvokePaint(this, pea);
}
}
}

关于c# - 如何覆盖 Winforms 控件的绘制方法以使其绘制到纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com