如何使用openGL在窗口的左上角创建菜单
How to create menu at the top left corner of a window using openGL
我正在用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解决了它。
- 使用
CreateMenu
功能创建菜单,然后使用SetMenu
功能将菜单设置为窗口 - 因为当设置菜单时,程序的绘图区域将减少,导致单击鼠标时坐标偏移。我们需要使用
AdjustWindowRect
和MoveWindow
函数来调整窗口的大小 - 由于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`
}
对于子菜单,其创建方法也继续使用CreateMenu
和AppendMenu
,可以参考Win32 API C++菜单栏
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 如何使用openGL在窗口的左上角创建菜单