2017-04-02 74 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