我正在尝试将Winforms与SharpDX项目集成,以便在我的3D应用程序中使用Winforms(以及最终通过HostElement的WPF)。
我需要创建或配置一个控件或表单,以便我可以:
一个。将其渲染为纹理(我可以显示为精灵*)
湾当控件未激活时,过滤其输入以删除鼠标/键盘事件。
我已经尝试了继承Control和Form,以覆盖OnPaint和OnPaintBackground但这些对子控件没有影响 - 或者就形式边界而言(即使他们这样做他们自己也不够,因为我是仍然留下一个白色方块,我认为已经绘制了“父母”。
如何在屏幕上停止控件或表格绘画,而只是绘制到位图?(例如,在绘制树之前,我是否可以覆盖图形?)< / p>
*它需要以这种方式完成(而不是让控件渲染到屏幕上),因为Winforms不支持真正的透明度,所以我需要在像素着色器中剪切彩色编码像素。
(要确认,我并不是指具体的DirectX纹理 - 我很满意(实际上更喜欢)一个简单的System.Drawing Bitmap)
答案 0 :(得分:3)
以下是开始实现目标的一种方法:
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);
}
}
}