如何将SDL与Win32菜单一起使用
How to use SDL with Win32 Menus
这是我从事过一段时间的游戏男孩模拟器。它最初仅在MacOS上工作,但我最近一直在Windows端口上工作。我正在使用SDL进行窗口创建和渲染。我想做的是使用Win32 API(CreateMenu,AppendMenu等)创建一个普通的Windows菜单栏。到目前为止,我可以将菜单栏存在于窗口上,但是我正在尝试使用回调WNDPROC()添加回调,因此菜单知道您要单击一个选项。这并不成功。有人知道该怎么做吗?
这是Winmain入口点:
/***************** INSTANCES *******************/
static Core::GameBoy* mGameBoy_Instance;
static FrontEnd::SDLContext* mSDL_Instance;
/***********************************************/
INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
{
// Load options
Core::Settings settings;
Util::CreateSettingsFromFile(OPTIONS_FILE_PATH, settings);
settings.skip_bootrom = true;
// Create the system instance
mGameBoy_Instance = new Core::GameBoy(settings, WIN_WIDTH, WIN_HEIGHT);
// Initalize Render Context
const char* windowTitle = mGameBoy_Instance->GetCurrentROM()->GetRomName();
mSDL_Instance = new FrontEnd::SDLContext(WIN_WIDTH, WIN_HEIGHT, WIN_SCALE, windowTitle);
// Initialize menubar
SDL_SysWMinfo sysInfo;
SDL_VERSION(&sysInfo.version);
SDL_GetWindowWMInfo(mSDL_Instance->GetWindow(), &sysInfo);
HWND hwnd = sysInfo.info.win.window;
/*********************************/
HMENU menubar = CreateMenu();
/*********************************/
HMENU file = CreateMenu();
HMENU exit = CreateMenu();
/*********************************/
AppendMenu(menubar, MF_POPUP, (UINT_PTR)file, "File");
AppendMenu(file, MF_STRING, (UINT_PTR)exit, "Exit");
SetMenu(hwnd, menubar);
// start sdl thread and main loop
}
这是回调功能代码:
LRESULT CALLBACK WndProc(_In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
switch (uMsg) {
case WM_COMMAND:
{
switch (LOWORD(wParam)) {
case 2: // Should be the Exit button in the order of the menu
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
return NULL;
}
当我这样做时,没有调用回调。任何帮助都将受到赞赏。谢谢!
您将退出hmenu分配为ou创建的项目的ID,这与"案例2:"。
不匹配。摆脱" hmenu出口"打电话:
AppendMenu(file, MF_STRING, 2, _T("Exit"));
我建议您分配一些常数名称(#define或Enum),并在AppendMenu和案例语句中使用该标识符。
普通菜单项具有数字ID,而不是Hmenu句柄。应该使用CreatePopupMenu
而不是CreateMenu
创建子菜单:
#define ID_EXIT 50
...
HMENU menubar = CreateMenu();
HMENU filemenu = CreatePopupMenu();
AppendMenu(filemenu, MF_STRING, ID_EXIT, "Exit");
AppendMenu(menubar, MF_POPUP, (UINT_PTR) filemenu, "File");
SetMenu(hwnd, menubar);
...
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_EXIT:
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
break;
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 无法获取菜单选择以运行函数.C++
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何将SDL与Win32菜单一起使用