如何使用openGL在窗口的左上角创建菜单

How to create menu at the top left corner of a window using openGL

本文关键字:左上角 创建 菜单 窗口 何使用 openGL      更新时间:2023-10-16

我正在用openGL、C++和windows编写一个游戏。

我需要在窗口的左上角添加一些菜单和子菜单。

我已经看到右键点击弹出菜单,但我希望菜单像firefox等任何程序一样。

我怎样才能做到这一点?

编辑#1:

当人民币被按下时,我添加了一个弹出菜单:

glutCreateMenu(MenuSelect);
glutAddMenuEntry("Option1Name", option1);
glutAddMenuEntry("Option2Name", option2);
glutAttachMenu(GLUT_RIGHT_BUTTON);

然后进入MenuSelect功能,我正在打印一些文本。

您至少有两个选择:

  • 使用某些Windows API(或MFC)或QT,这将在OpenGL的顶部绘制菜单(使用GDI或其他技术)
  • 使用某些第三方库,该库将在OpenGL中绘制GUI(使用其渲染命令)

对于后一种选择和简单的GUI,我建议http://www.antisphere.com/Wiki/tools:anttweakbar

我遇到了同样的问题,我使用Win32API解决了它。

  1. 使用CreateMenu功能创建菜单,然后使用SetMenu功能将菜单设置为窗口
  2. 因为当设置菜单时,程序的绘图区域将减少,导致单击鼠标时坐标偏移。我们需要使用AdjustWindowRectMoveWindow函数来调整窗口的大小
  3. 由于opengl将接管窗口的回调函数,我们设置的菜单命令无法被程序接受,我们需要使用SetWindowLongA函数将窗口的回调功能设置为我们定义的函数,并使用我们定义的最后一行的CallWindowProc函数来调用opengl回调函数

下面是一个示例代码:

#define IDM_MENU_1      (1)         // menu id
static WNDPROC gl_wnd_proc;         // legacy opengl window proc function
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_COMMAND:
    {
        switch(LOWORD(wParam))
        {
        case IDM_MENU_1: // Do menu command here...
        }
    }
    }
    // Here we have to use `CallWindowProc` function
    return CallWindowProc(gl_wnd_proc,hWnd, msg, wParam, lParam);
}
int main()
{
    // do `glutInit` first ...
    // 1. Create and set menu
    HMENU hMenu = CreateMenu();
    AppendMenuA(hMenu, MF_STRING, IDM_MENU_1, "Menu 1");
    HWND hWnd = FindWindowA("GLUT", NULL); // "GLUT" is opengl window class name
    SetMenu(hWnd, hMenu);
    // 2. Adjust window size
    RECT rt = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
    AdjustWindowRect(&rt, GetWindowLongA(hWnd, GWL_STYLE), TRUE);
    MoveWindow(hWnd, 0, 0, rt.right - rt.left, rt.bottom - rt.top, TRUE);
    // 3. Set window callback proc function
    gl_wnd_proc = (WNDPROC)SetWindowLongA(hWnd, GWLP_WNDPROC, (LONG)MyWndProc);
    // do `glutMainLoop`
}

对于子菜单,其创建方法也继续使用CreateMenuAppendMenu,可以参考Win32 API C++菜单栏