2017-04-08 200 views
-2

我正在构建我的第一个GUI。“DialogProc未声明”错误显示,但肯定会声明

以下是我的代码。

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

const char g_szClassName[] = "home"; 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { 
    switch(msg) 
    { 
     case WM_CLOSE: 
      DestroyWindow(hwnd); 
      break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     default: 
      return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

BOOL CALLBACK HomeDialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { 
    switch (msg) { 
     case WM_COMMAND: 
      switch(LOWORD(wParam)){ 
       case IDC_ABOUT: 
        CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDT_ABOUTDIALOG), hwnd, AboutDlgProc); 
        break; 
      } 
      break; 
     default: 
      return FALSE; 
    } 
    return FALSE; 
} 

BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { 
    switch(Msg) 
    { 
     case WM_COMMAND: 
      switch(LOWORD(wParam)) 
      { 
       case IDC_DLG_EXIT: 
        DestroyWindow(hwnd); 
        break; 
      } 
      break; 
     default: 
      return FALSE; 
    } 
    return FALSE; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    WNDCLASSEX wc; 
    HWND hwnd; 
    HWND dialog; 
    MSG Msg; 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = 0; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON)); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); 
    wc.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU); 
    wc.lpszClassName = g_szClassName; 
    wc.hIconSm = (HICON) LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0); 

    if (!RegisterClassEx(&wc)) { 
     MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); 
     return 0; 
    } 

    hwnd = CreateWindowEx(
      WS_EX_CLIENTEDGE, 
      g_szClassName, 
      "Have faith, we will succeed", 
      WS_OVERLAPPEDWINDOW, 
      CW_USEDEFAULT, CW_USEDEFAULT, 800, 500, 
      NULL, NULL, hInstance, NULL); 

    if (hwnd == NULL) { 
     MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); 
     return 0; 
    } 

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

    dialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDT_HOMEDIALOG), hwnd, HomeDialogProc); 

    if (!dialog) { 
     MessageBox(NULL, "Could not create Dialog", "CreateDialog", MB_ICONERROR); 
     return 1; 
    } 

    ShowWindow(dialog, nCmdShow); 
    UpdateWindow(dialog); 

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

我想简单介绍一下我想要做的事情。我在主窗口中嵌入了一个对话框,所以它“成为窗口的一部分”。然后在这个对话框中有一个About按钮,它应该打开About对话框。我对编译错误很沮丧:

C:\Workspace_cpp\twodlg\main.cpp:28:97: error: 'AboutDlgProc' was not declared in this scope 
       CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDT_ABOUTDIALOG), hwnd, AboutDlgProc); 

正如你所看到的,我有明确的规定AboutDlgProc。另一方面,从我的阅读中,所有的功能并不一定需要声明才能起作用。最后,即使在我明确地声明了声明之后,错误仍然存​​在。非常感谢你的帮助。

+2

您需要在*** HomeDialogProc之前声明'AboutDlgProc' ***,或者用*前向引用*声明它。 (查看它。) –

+0

@MikeNakis OMG这是完美的。非常感谢你! – Jraxon

回答

0

我解决了它,当我搬到AboutDlgProc了。 @MikeNakis在评论中提供了答案,我只是在结束这个问题。