2017-04-02 9 views
-1

私はMSVC++ウィザードを使用してwin32アプリケーションを作成しました。私は新しいメニューリソースを追加し、典型的な 'File' - > 'Exit'などを追加しました。そして、それを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アプリケーションには、すでに終了項目がある作業メニューがあるので、奇妙です。 – dodo951

+0

なぜvisual-studioタグですか? – EJoshuaS

+0

@EJoshuaS私はビジュアルスタジオのリソースエディタを使用してメニューを作成していたので、ビジュアルスタジオのプロパティを使用してダイアログに設定していました。 – trevercodes

答えて

0

DialogProc関数は、ダイアログプロシージャよりもウィンドウプロシージャのように見えます。ウィンドウプロシージャとは異なり、dalogプロシージャはLRESULT値を戻さず、BOOL値を戻し、DefWindowProcをコールしません。他にもいくつかの違いがあります。

+0

ありがとう!私はそれがデフォルトのプロジェクトを作成し、ダイアログベースを作成するために物事を取り除くことを始めました。そのダイアログベースは今でもWNDCLASSEX構造体でプロパティを設定するためのウィンドウクラスを追加することができます。それは私の問題を解決しました。 – trevercodes

関連する問題