在WinForms中使用OpenGL32.dll和HDC

时间:2016-01-27 00:28:30

标签: c# winforms opengl

我正在尝试在OpenGL32.dll中使用Windows API函数执行一些基本的OpenGL。如何使用本机API使用C#创建纹理和上下文?

例如:

    public static IntPtr CreateContext(IntPtr DeviceContext){
        return wglCreateContext(DeviceContext);
    }

问题是我不知道如何将OpenGL与Forms HDC一起使用。如何在Windows Forms HDC中使用OpenGL?

这就是我得到的,有什么不对吗?我找不到任何关于此的示例或文档,我发现只使用TAO或openTK。

public partial class MainForm : Form
{
    public MainForm()
    {

        InitializeComponent();
        this.SetStyle(ControlStyles.EnableNotifyMessage | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
        IntPtr HDC = OpenGL.CreateContext(CreateGraphics().GetHdc());
        OpenGL.EnableDoubleBuffer(HDC);

        OpenGL.DrawRectangle(10, 100, 10, 100);

    }

    protected override void WndProc(ref Message m)
    {
        if(m.Msg == WindowsMessages.WM_ERASEBACKGROUND) return;

        base.WndProc(ref m);
    }

}

public static class OpenGL{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    [DllImport( "opengl32.dll" )]
    static extern IntPtr wglCreateContext(IntPtr HDC);

    [DllImport( "gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true )]
    static extern bool SwapBuffers(IntPtr hdc);

    [DllImport( "opengl32.dll" )]
    static extern void glRecti(int x1, int y1, int x2, int y2);

    [DllImport( "opengl32.dll" )]
    static extern void glBegin(UInt32 type);

    [DllImport( "opengl32.dll" )]
    static extern void glEnd();

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public static IntPtr CreateContext(IntPtr DeviceContext){
        return wglCreateContext(DeviceContext);
    }

    public static Boolean EnableDoubleBuffer(IntPtr DeviceContext){
        return SwapBuffers(DeviceContext);
    }

    public static void DrawRectangle(Int32 X1, Int32 Y1, Int32 X2, Int32 Y2){
        glBegin(GLEnum.POLYGON);
        glRecti(X1, Y1, X2, Y2);
        glEnd();
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////

    public static class GLEnum{
        public static UInt32 POLYGON = 0x0009;
    }


}

public static class WindowsMessages{
    public static int WM_ERASEBACKGROUND = 0x14;
}

Pd积。不建议使用TAO或TK,我不能使用它们,我需要本地化。

0 个答案:

没有答案