2015-05-28 157 views
0

更新:由于最初提出这个问题,我稍微改变了我的方法。而不是使用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块),如右图所示,在这里:

drawing problem

很显然,我不想失去我试图在上面画的场景。现在,我不知道为什么会发生这种情况。我试图做的是不可能的?如果需要任何附加信息/代码,我会很乐意提供,如果可能的话。

编辑: 为了尝试简化问题,我创建了一个非常简单的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(); 
     } 
    } 
} 

面板的背景色设置为透明。下面是结果:

Test app

那黑色方块对应,这是获得上下文分配的图形缓冲区。为什么它总是显示为黑色基本上是什么使我困惑...

回答

0

谢谢@Ron Beyer回答这个对我来说different question我张贴。

所以我在ElementHost控制的正确轨道上,但由于透明度问题,罗恩建议我尝试使用一个新的WPF窗口,我可以覆盖应用程序顶部(link)。 WPF窗口的背景设置为透明,因此在InkCanvas上绘图会产生所需的效果。

0

我认为你应该做的是使用SetStyle方法将背景设置为透明。更多的信息在https://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle%28v=vs.110%29.aspx

+0

我认为你应该在完成所有这些后将控件的背景颜色设置为透明。 this.BackColor = Color.Transparent; – BVintila

+0

使用'SetStyle()'不适合我。我下面的代码添加到我的窗体构造函数: 'this.SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint,真);'' this.UpdateStyles();' 也许我用错了? – WERUreo

+0

对不起,我试图重新格式化我的评论,并最终删除它并重新开始。我也尝试添加你建议的将BackColor设置为透明的那一行,但这也不起作用,我发现这很奇怪,因为在Designer中,背景颜色现在确实是透明的,没有任何黑色的迹象。但是当我运行时,我仍然看到一个黑色方块内的红色矩形.. – WERUreo