使用 Opengl 在窗口上显示菜单

Posted

技术标签:

【中文标题】使用 Opengl 在窗口上显示菜单【英文标题】:Show menu on Window with Opengl 【发布时间】:2013-03-11 20:32:45 【问题描述】:

我在我的窗口中创建了一个编辑框,但是当我尝试用 OpenGl 绘制一些东西时消失了。我应该改变什么?

代码如下:

#include <windows.h>
#include <gl/gl.h>
#include <math.h>
#define IDC_MAIN_EDIT 102 
HWND hEdit;

// Function Declarations
HMENU men;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);
void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);

// WinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int iCmdShow)

    WNDCLASS wc;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;
    MSG msg;
    BOOL quit = FALSE;
    float theta = 0.0f;

    // register window class
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "GLSample";
    RegisterClass( &wc );

    // create main window
    hWnd = CreateWindow( 
        "GLSample", "OpenGL Sample", 
        WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
        0, 0, 800, 800,
        NULL, NULL, hInstance, NULL );

    // enable OpenGL for the window
    EnableOpenGL( hWnd, &hDC, &hRC );

    // program main loop
    while ( !quit )
    

        // check for messages
        if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )  )
        

            // handle or dispatch messages
            if ( msg.message == WM_QUIT ) 
            
                quit = TRUE;
             
            else 
            
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            

         
        else 
        

            // OpenGL animation code goes here
           glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
           glClear(GL_COLOR_BUFFER_BIT);
           glPushMatrix();
           glRotatef( theta, 0.0f, 0.0f, 1.0f );
           glBegin( GL_TRIANGLES );
           glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 0.25f );
           glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.21f, -0.12f );
           glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.21f, -0.12f );
           glEnd();
            glPopMatrix();

            SwapBuffers( hDC );

            theta += 1.0f;

        

    

    // shutdown OpenGL
    DisableOpenGL( hWnd, hDC, hRC );

    // destroy the window explicitly
    DestroyWindow( hWnd );

    return msg.wParam;



// Window Procedure

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)


    switch (message)
    

    case WM_CREATE:
        
            hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,
                "EDIT",
                "",
                WS_CHILD|WS_VISIBLE|
                ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL,
                50,
                20,
                60,
                30,
                hWnd,
                (HMENU)IDC_MAIN_EDIT,
                GetModuleHandle(NULL),
                NULL);
            HGDIOBJ hfDefault=GetStockObject(DEFAULT_GUI_FONT);
            SendMessage(hEdit,
                WM_SETFONT,
                (WPARAM)hfDefault,
                MAKELPARAM(FALSE,0));
            SendMessage(hEdit,
                WM_SETTEXT,
                NULL,
                (LPARAM)"Length");
            return 0;
        
    case WM_CLOSE:
        PostQuitMessage( 0 );
        return 0;

    case WM_DESTROY:
        return 0;

    case WM_KEYDOWN:
        switch ( wParam )
        

        case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;

        
        return 0;

    default:
        return DefWindowProc( hWnd, message, wParam, lParam );

    



// Enable OpenGL

void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC)

    PIXELFORMATDESCRIPTOR pfd;
    int format;

    // get the device context (DC)
    *hDC = GetDC( hWnd );

    // set the pixel format for the DC
    ZeroMemory( &pfd, sizeof( pfd ) );
    pfd.nSize = sizeof( pfd );
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;
    format = ChoosePixelFormat( *hDC, &pfd );
    SetPixelFormat( *hDC, format, &pfd );

    // create and enable the render context (RC)
    *hRC = wglCreateContext( *hDC );
    wglMakeCurrent( *hDC, *hRC );



// Disable OpenGL

void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)

    wglMakeCurrent( NULL, NULL );
    wglDeleteContext( hRC );
    ReleaseDC( hWnd, hDC );

【问题讨论】:

修复你的随机垂直空白。这让人分心。 在哪里?在节目中?这个随机的空白是我遇到问题的编辑框。我想修复它,但我需要帮助) 【参考方案1】:

答案很简单——我只是把函数CreateWindow的参数改成了

hWnd = CreateWindow( 
        "GLSample", "OpenGL Sample", 
         WS_SYSMENU|WS_VISIBLE|WS_MINIMIZEBOX|WS_OVERLAPPED|WS_BORDER|WS_CAPTION|
  WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
        0, 0, 800, 800,
        NULL, NULL, hInstance, NULL );

这个,瞧——一切正常^_^

【讨论】:

【参考方案2】:

它可能会用默认的WM_ERASEBKGND 代码覆盖您的绘画。解决此问题的一种方法是将您的 OpenGL 代码移动到 WM_PAINT 处理程序,然后在每次您希望动画前进时使您的窗口无效。

【讨论】:

以上是关于使用 Opengl 在窗口上显示菜单的主要内容,如果未能解决你的问题,请参考以下文章

在OpenGL中的窗口上显示两个不同的图像

在 Windows 桌面应用程序中的 OpenGL 窗口上显示 WPF 控件

有没有办法在 OpenGL 上显示一个 pygame 窗口?

为啥在 glfw 窗口上没有使用 opengl 显示位图图像?在 C++ 中读取位图图像文件时出现问题

OpenGL 2 和 Primusrun 在单个缓冲区上无显示(透明窗口)

打开全屏 OpenGL 窗口