2017-04-02 65 views
-1

我使用MSVC++嚮導來創建一個win32應用程序。我添加了一個新的菜單資源,並添加了典型的'文件' - >'退出'等。然後我將它添加到msvC++屬性下的主對話框中。當我運行窗體時,它會在窗體上顯示菜單,但是如果我單擊文件,它甚至不會執行懸停,也不會顯示Exit的彈出窗口。它幾乎就像它被禁用。我真的不認爲我需要添加任何代碼。任何幫助表示讚賞。謝謝。對話框菜單不響應點擊

#include "stdafx.h" 

#define MAX_LOADSTRING 100 

struct _globals { 
    HINSTANCE hInst; 
    HWND  hWnd; 
} g; 

LRESULT CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); 

int APIENTRY wWinMain(_In_  HINSTANCE hInstance, 
         _In_opt_ HINSTANCE hPrevInstance, 
         _In_  LPWSTR lpCmdLine, 
         _In_  int  nCmdShow) 
{ 

    InitCommonControls(); 

    g.hInst = hInstance; 

    g.hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)DialogProc); 
    if (g.hWnd == NULL) { 
     GetLastError(); 
     return FALSE; 
    } 

    ShowWindow(g.hWnd, nCmdShow); 
    UpdateWindow(g.hWnd); 

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ACCELLS)); 
    MSG msg; 

    while (GetMessage(&msg, NULL, 0, 0)) { 
     if (TranslateAccelerator(g.hWnd, hAccelTable, &msg)) 
      continue; 
     if (IsDialogMessage(g.hWnd, &msg)) 
      continue; 
     // process message 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return 0; 
} 


LRESULT CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_INITDIALOG: 
     break; 
    case WM_COMMAND: 
     { 
      int wmId = LOWORD(wParam); 
      switch (wmId) 
      { 
      case IDM_EXIT: 
       DestroyWindow(hWnd); 
       break; 
      default: 
       return DefWindowProc(hWnd, message, wParam, lParam); 
      } 
     } 
     break; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 

// Message handler for about box. 
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    UNREFERENCED_PARAMETER(lParam); 
    switch (message) 
    { 
    case WM_INITDIALOG: 
     return (INT_PTR)TRUE; 

    case WM_COMMAND: 
     if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
     { 
      EndDialog(hDlg, LOWORD(wParam)); 
      return (INT_PTR)TRUE; 
     } 
     break; 
    } 
    return (INT_PTR)FALSE; 
} 
+0

通常確實不需要添加任何代碼來進行彈出顯示。你的資源文件很可能有問題(你可以在這裏實際發佈)。這很奇怪,因爲默認的win32應用程序已經有了帶有Exit項目的工作菜單。 – dodo951

+0

爲什麼使用visual-studio標籤? – EJoshuaS

+0

@EJoshuaS因爲我使用visual studio資源編輯器製作菜單,並使用visual studio中的屬性將其設置爲對話框。 – trevercodes

回答

0

您的DialogProc函數看起來更像是一個窗口過程而不是對話框過程。與窗口過程不同,dalog過程不返回LRESULT值,它們返回BOOL值,並且它們不調用DefWindowProc。還有一些其他的不同之處。

+0

謝謝!我讓它創建了默認項目,並開始刪除東西來創建它基於對話框。儘管現在它的對話框仍然可以添加一個窗口類來設置WNDCLASSEX結構的屬性。這解決了我的問題。 – trevercodes