如何将SDL与Win32菜单一起使用

How to use SDL with Win32 Menus

本文关键字:菜单 一起 Win32 SDL      更新时间:2023-10-16

这是我从事过一段时间的游戏男孩模拟器。它最初仅在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;