更新:由于最初提出这个问题,我稍微改变了我的方法。而不是使用System.Drawing.Graphics
进行绘图,而是使用InkCanvas托管WPF用户控件。这就是我需要它做的一切。问题仍然是我无法获得ElementHost的背景透明。我看到了我之前看到的同一个黑色方块。使用C绘制3D渲染场景#
原文出处:我有一个C#WinForms应用程序,它使用Ogre3D将3D场景呈现给使用该面板句柄的窗体中的面板。我正在尝试使用C#的System.Drawing.Graphics
添加在该场景上绘制的能力(想象迈登在电视屏幕上绘图)。
我正在使用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场景的失踪里面绘制的50×50的红色矩形块(具体为100×100块),如右图所示,在这里:
很显然,我不想失去我试图在上面画的场景。现在,我不知道为什么会发生这种情况。我试图做的是不可能的?如果需要任何附加信息/代码,我会很乐意提供,如果可能的话。
编辑: 为了尝试简化问题,我创建了一个非常简单的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();
}
}
}
面板的背景色设置为透明。下面是结果:
那黑色方块对应,这是获得上下文分配的图形缓冲区。为什么它总是显示为黑色基本上是什么使我困惑...
我认为你应该在完成所有这些后将控件的背景颜色设置为透明。 this.BackColor = Color.Transparent; – BVintila
使用'SetStyle()'不适合我。我下面的代码添加到我的窗体构造函数: 'this.SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint,真);'' this.UpdateStyles();' 也许我用错了? – WERUreo
对不起,我试图重新格式化我的评论,并最终删除它并重新开始。我也尝试添加你建议的将BackColor设置为透明的那一行,但这也不起作用,我发现这很奇怪,因为在Designer中,背景颜色现在确实是透明的,没有任何黑色的迹象。但是当我运行时,我仍然看到一个黑色方块内的红色矩形.. – WERUreo