更新:自从最初提出这个问题以来,我稍微改变了我的做法。我使用InkCanvas托管WPF用户控件,而不是使用System.Drawing.Graphics
进行绘制。这就是我需要做的一切。问题仍然是我不能让ElementHost的背景透明。我看到了之前看到的同样的黑色方块。
原始问题:我有一个C#WinForms应用程序,使用该面板的句柄将使用Ogre3D的3D场景渲染到表单中的面板。我正在尝试使用C#的System.Drawing.Graphics
添加在该场景之上绘制的能力(想象Madden在电视屏幕上绘图)。
我正在使用BufferedGraphics
类来执行此操作。作为测试,我试图在3D场景的顶部绘制一个矩形。下面是我用来设置所有内容的代码片段。
namespace TestApp
{
public partial class TestForm
{
private BufferedGraphics graphicsBuffer;
private BufferedGraphicsContext bufferContext = BufferedGraphicsManager.Current;
public TestForm()
{
InitializeComponent();
UpdateGraphicsBuffer();
}
private void UpdateGraphicsBuffer()
{
bufferContext.MaximumBuffer = new Size(panelRender.Width + 1, panelRender.Height + 1);
graphicsBuffer = bufferContext.Allocate(Graphics.FromHwnd(panelRender.Handle), new Rectangle(49, 49, 100, 100));
graphicsBuffer.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
}
private void TestForm_Load(object sender, EventArgs e)
{
graphicsBuffer.Graphics.DrawRectangle(new Pen(Color.Red), 50, 50, 50, 50);
}
}
}
我遗漏了很多专有代码(在专有代码的一部分中调用了graphicsBuffer.Render();
)并重命名了一些东西,但希望我提供的内容会给你一个要点。此外,3D场景也使用panelRender.Handle
绘制到该面板,panelRender.BackColor
为黑色。
简而言之,我所看到的是我的3D场景的一大块(特别是一个100x100块),里面画着50x50的红色矩形,如图所示:
显然,我不想失去我想要绘制的场景。现在,我不知道为什么会这样。我想做的就是不可能吗?如果需要任何其他信息/代码,我将很乐意提供,如果可能的话。
编辑: 为了尝试简化问题,我创建了一个非常简单的WinForms应用程序,该应用程序只有一个面板,并使用上面的代码重新创建问题。代码隐藏在这里:
using System.Drawing;
using System.Windows.Forms;
namespace DoubleBufferTest
{
public partial class Form1 : Form
{
private BufferedGraphics graphicsBuffer = null;
private BufferedGraphicsContext bufferContext = BufferedGraphicsManager.Current;
public Form1()
{
this.SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
this.UpdateStyles();
InitializeComponent();
UpdateGraphicsBuffer();
}
private void UpdateGraphicsBuffer()
{
bufferContext.MaximumBuffer = new Size(panel1.Width + 1, panel1.Height + 1);
graphicsBuffer = bufferContext.Allocate(Graphics.FromHwnd(panel1.Handle), new Rectangle(10, 10, 50, 50));
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
graphicsBuffer.Graphics.DrawRectangle(new Pen(Color.Red, 3.0f), 20, 20, 10, 10);
graphicsBuffer.Render();
}
}
}
面板的背景颜色设置为透明。结果如下:
该黑色方块对应于上下文分配的图形缓冲区。为什么它总是显示为黑色基本上让我感到困惑的是......
答案 0 :(得分:0)
我认为你应该做的是使用SetStyle方法将背景设置为透明。有关详情,请访问https://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle%28v=vs.110%29.aspx
答案 1 :(得分:0)
感谢@Ron Beyer在我发布的different question中为我回答此问题。
所以我使用ElementHost
控件走在正确的轨道上,但由于透明度问题,Ron建议我尝试使用可覆盖在应用程序顶部的新WPF窗口({{3} })。 WPF窗口的背景设置为透明,因此在InkCanvas上绘图会产生所需的效果。