2013-04-25 32 views
0

我一直在這裏5個小時信不信由你。我非常緊張,因爲它看起來很基本,當我真正掌握了所有這些資源時,讓程序變得更容易。我的窗戶無法打開

繼承人我的代碼:

#include <windows.h> 
#include "resource.h" 

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 
BOOL CALLBACK AboutDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        PSTR lpszCmdParam, int nCmdShow) 
    { 
    static char szAppName[] = "ErrorSample"; 
    HWND   hwnd; 
    MSG   msg; // Look how this struct is defined-see help/class notes NOW 
    WNDCLASSEX  wndclass; 
    HWND   hwndDialogBox = NULL; 
    HMENU hMenu; 

      wndclass.cbSize  = sizeof(wndclass); 
      wndclass.style   = CS_HREDRAW | CS_VREDRAW; 
      wndclass.lpfnWndProc = WndProc; 
      wndclass.cbClsExtra = 0; 
      wndclass.cbWndExtra = 0; 
      wndclass.hInstance  = hInstance; 
      wndclass.hIcon   = LoadIcon (NULL, IDC_ICON); 

      wndclass.hCursor  = LoadCursor (NULL, IDC_ARROW); 
      wndclass.hbrBackground = static_cast<HBRUSH>(GetStockObject (WHITE_BRUSH)); 
      wndclass.lpszMenuName = NULL; 
      wndclass.lpszClassName = szAppName; 
      wndclass.hIconSm  = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ERROR)); 

      RegisterClassEx (&wndclass); 

      hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(102)); 

    hwnd = CreateWindow (szAppName,   // window class name 
        "Trying my damndest",   // window caption 
        WS_OVERLAPPEDWINDOW,  // window style 
        CW_USEDEFAULT,   // initial x position 
        CW_USEDEFAULT,   // initial y position 
        CW_USEDEFAULT,   // initial x size 
        CW_USEDEFAULT,   // initial y size 
        NULL,     // parent window handle 
        hMenu,     // window menu handle 
        hInstance,    // program instance handle 
        NULL);     // creation parameters 


    ShowWindow (hwnd, nCmdShow); 
    UpdateWindow (hwnd); 

    while (GetMessage (&msg, NULL, 0, 0)) 
      { 
      TranslateMessage (&msg); 
      DispatchMessage (&msg); 
      } 
    return (int) msg.wParam; 
    } 

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 
          WPARAM wParam, LPARAM lParam) 
    { 
    static HINSTANCE hInstance; 

    switch (message) 
     { 

     case WM_CREATE: 
      hInstance = ((LPCREATESTRUCT) lParam) ->hInstance; 
      return 0; 

     case WM_COMMAND: 
      switch(LOWORD(wParam)) 
      { 
      case ID_HELP_ABOUT: 
       DialogBox(hInstance, "AboutBox", hwnd, AboutDlgProc); 
       break; 
      } 

      return 0; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 
     } 

    return DefWindowProc (hwnd, message, wParam, lParam); 
    } 

BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
    case WM_INITDIALOG: 
     return TRUE; 

    case WM_COMMAND: 
     switch(LOWORD(wParam)) 
     { 
     case IDOK: 
     case IDCANCEL: 
      EndDialog(hDlg, 0); 
      return TRUE; 
     } 
     break; 
    } 
    return FALSE; 
} 

當我點擊我的WndProc中WM_COMMAND我ID_HELP_ABOUT case語句,什麼都不會發生。它甚至沒有進入我的AboutDlgProc函數。

RESOURCE.H

//{{NO_DEPENDENCIES}} 
// Microsoft Visual C++ generated include file. 
// Used by Practice.rc 
// 
#define DIALOG_BOX      9 
#define IDR_MENU1      102 
#define ID_HELP_ABOUT     40001 

// Next default values for new objects 
// 
#ifdef APSTUDIO_INVOKED 
#ifndef APSTUDIO_READONLY_SYMBOLS 
#define _APS_NEXT_RESOURCE_VALUE  103 
#define _APS_NEXT_COMMAND_VALUE   40002 
#define _APS_NEXT_CONTROL_VALUE   1001 
#define _APS_NEXT_SYMED_VALUE   101 
#endif 
#endif 

rc文件

// Microsoft Visual C++ generated resource script. 
// 
#include "resource.h" 

#define APSTUDIO_READONLY_SYMBOLS 
///////////////////////////////////////////////////////////////////////////// 
// 
// Generated from the TEXTINCLUDE 2 resource. 
// 
#include "afxres.h" 

///////////////////////////////////////////////////////////////////////////// 
#undef APSTUDIO_READONLY_SYMBOLS 

///////////////////////////////////////////////////////////////////////////// 
// English (United States) resources 

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 

#ifdef APSTUDIO_INVOKED 
///////////////////////////////////////////////////////////////////////////// 
// 
// TEXTINCLUDE 
// 

1 TEXTINCLUDE 
BEGIN 
    "resource.h\0" 
END 

2 TEXTINCLUDE 
BEGIN 
    "#include ""afxres.h""\r\n" 
    "\0" 
END 

3 TEXTINCLUDE 
BEGIN 
    "\r\n" 
    "\0" 
END 

#endif // APSTUDIO_INVOKED 


///////////////////////////////////////////////////////////////////////////// 
// 
// Dialog 
// 

DIALOG_BOX DIALOGEX 32, 32, 309, 178 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_SYSMENU 
FONT 8, "MS Shell Dlg", 400, 0, 0x1 
BEGIN 
    DEFPUSHBUTTON "OK",IDOK,198,157,50,14 
END 


///////////////////////////////////////////////////////////////////////////// 
// 
// DESIGNINFO 
// 

#ifdef APSTUDIO_INVOKED 
GUIDELINES DESIGNINFO 
BEGIN 
    DIALOG_BOX, DIALOG 
    BEGIN 
     LEFTMARGIN, 7 
     RIGHTMARGIN, 302 
     TOPMARGIN, 7 
     BOTTOMMARGIN, 171 
    END 
END 
#endif // APSTUDIO_INVOKED 


///////////////////////////////////////////////////////////////////////////// 
// 
// Menu 
// 

IDR_MENU1 MENU 
BEGIN 
    MENUITEM "&File",      0 
    POPUP "&Help" 
    BEGIN 
     MENUITEM "&About",      ID_HELP_ABOUT 
    END 
END 

#endif // English (United States) resources 
///////////////////////////////////////////////////////////////////////////// 



#ifndef APSTUDIO_INVOKED 
///////////////////////////////////////////////////////////////////////////// 
// 
// Generated from the TEXTINCLUDE 3 resource. 
// 


///////////////////////////////////////////////////////////////////////////// 
#endif // not APSTUDIO_INVOKED 

請幫助! =)

+1

如此瘋狂的想法:檢查對話框()''的返回結果,如果(-1),調用'GetLastError函數()'找爲什麼它失敗了。並請將您的'resource.h'和項目.rc文件附加到您的問題中。如果這些問題存在,則很明顯。 – WhozCraig 2013-04-25 01:33:30

+0

已編輯。現在嘗試檢查返回結果 – 2013-04-25 01:36:29

+0

我從LastError()得到錯誤1814並且它說沒有找到資源名稱。 – 2013-04-25 01:40:15

回答

3

更改對話框中調用這個:

DialogBox(hInstance, MAKEINTRESOURCE(DIALOG_BOX), hwnd, AboutDlgProc); 
+0

有些簡單。謝謝。你能向我解釋你如何知道如何使用DIALOG_BOX?而不是ID_HELP_ABOUT?是不是因爲那個會被打開的東西就是那個對話框,我的命名方案太可怕了,我沒有注意到? – 2013-04-25 01:46:08

+0

您的DIALOG的資源ID是'DIALOG_BOX',在'resource.h'中定義幷包含在.rc文件中。我可以簡單地告訴你將.rc文件中的資源聲明更改爲「AboutBox DIALOGBOX ... etc」,但這可能會破壞Visual Studio集成設計器。我必須看看你是否(a)在resource.h中有一個資源ID,(b)它在.rc文件中正確使用。對兩者都是肯定的,所以剩下的唯一東西就是不正確地在調用中使用它(你不是)。 – WhozCraig 2013-04-25 01:49:21

+0

謝謝你克雷格。你應該寫一本書;)。 Petzold只是沒有爲我完成它。 – 2013-04-25 01:51:20