2017-12-11 2 views
-1

이것은 꽤 오랫동안 작업 해 온 GameBoy 에뮬레이터입니다. 원래는 MacOS에서만 작동했지만 최근에는 Windows 포트에서 작업했습니다. 창 생성 및 렌더링에 SDL을 사용하고 있습니다. 내가 뭘하고 싶은 건 Win32 API (CreateMenu, AppendMenu, 등)를 사용하여 일반적인 Windows 메뉴 막대를 만드는 것입니다. 지금까지 메뉴 막대를 창에 존재시킬 수 있지만 CALLBACK WndProc()을 사용하여 콜백을 추가하려고합니다. 따라서 메뉴에서 옵션을 클릭한다는 것을 알 수 있습니다. 이것은 성공적이지 못했습니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까? Win32 메뉴로 SDL을 사용하는 방법

은의 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; 
} 

를 호출되지 않습니다. 도움을 주시면 감사하겠습니다. 감사합니다.

+2

는이 [mcve] ... –

답변

1

종료를 위해 생성 한 항목의 ID로 exit HMENU를 지정합니다.이 경우 "case 2 :"와 일치하지 않습니다.

AppendMenu(file, MF_STRING, 2, _T("Exit")); 

난 당신이 어떤 상수 이름 (#DEFINE 또는 열거 중 하나)을 할당하는 것이 제안하고, AppendMenu 및 사례 문 모두에서이 식별자를 사용

전화를 확인하십시오 "HMENU 출구"제거하십시오 .

+0

아니, 그것은 여전히 ​​작동하지 않습니다 표시합니다. 그것을 클릭해도 아무 것도하지 않습니다. –

0

일반 메뉴 항목에는 HMENU 핸들이 아닌 숫자 ID가 있습니다. Submenus should be created with 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; 
관련 문제