使用C#

时间:2015-05-28 13:46:03

标签: c# winforms ogre3d

更新:自从最初提出这个问题以来,我稍微改变了我的做法。我使用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的红色矩形,如图所示:

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

该黑色方块对应于上下文分配的图形缓冲区。为什么它总是显示为黑色基本上让我感到困惑的是......

2 个答案:

答案 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上绘图会产生所需的效果。