2013-06-21 116 views
0

如果我在主窗口中創建了一個子窗口(在這種情況下窗口「關於」),由於某種原因不會調用該對話框。如果你不這個子窗口是一個對話框稱爲正常,並正常工作。 GetLastError返回錯誤號1812(指定的圖像文件不包含資源部分。)。但從資源文件一切都很好。正如我所說,如果你不創建一個子窗口,那麼一切正常。有什麼問題?未創建對話框WinAPI

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

LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM); 
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); 
LRESULT CALLBACK PointsProc(HWND hPoints, UINT message, WPARAM wParam,LPARAM lParam); 

HINSTANCE hInst; 
HWND hPoints; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    hInst = hInstance; 
    HWND hwnd; 
    MSG msg; 
    WNDCLASS w; 
    memset(&w,0,sizeof(WNDCLASS)); 
    w.style = CS_HREDRAW | CS_VREDRAW; 
    w.lpfnWndProc = WndProc; 
    w.hInstance = hInstance; 
    w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
    w.lpszClassName = L"My Class"; 
    RegisterClass(&w); 
    hwnd = CreateWindow(L"My Class", L"My title", WS_OVERLAPPEDWINDOW, 
    300, 200, 200, 180, NULL, NULL, hInstance, NULL); 

    HMENU main_menu = CreateMenu(); 
    AppendMenu(main_menu, MF_STRING, 1111, L"Box"); 

    WNDCLASS w2; 
    memset(&w2, 0, sizeof(WNDCLASS)); 
    w2.lpfnWndProc = (WNDPROC)PointsProc; 
    w2.hInstance = hInst; 
    w2.lpszClassName = L"About"; 
    w2.hCursor = LoadCursor(NULL, IDC_ARROW); 
    w2.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(111, 111, 111)); 
    RegisterClass(&w2); 

    hPoints = CreateWindowEx(0, L"About", (LPCTSTR) NULL, 
    WS_CHILD | WS_BORDER | WS_VISIBLE | WS_DISABLED, 10, 10, 
    100, 100, hwnd, (HMENU)1112, hInst, NULL); 

    ShowWindow(hPoints,SW_NORMAL); 
    UpdateWindow(hPoints); 

    SetMenu(hwnd, main_menu); 

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

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

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam) 
{ 
    switch (Message) 
    { 
     case WM_COMMAND: 
      switch(LOWORD(wparam)) 
      { 
       case 1111: 
        DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, About); 
        return 0; 
      } 
      break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
     break; 
     default: 
      return DefWindowProc(hwnd, Message, wparam, lparam); 
    } 
    return 0; 
} 

LRESULT CALLBACK PointsProc(HWND hPoints, UINT message, WPARAM wParam,LPARAM lParam) 
{ 
    switch(message) 
    { 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     case WM_PAINT: 
      break; 
     default: 
      return DefWindowProc(hPoints, message, wParam, lParam); 
    } 
    return 0; 
} 

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) == IDCANCEL) 
      { 
       EndDialog(hDlg, LOWORD(wParam)); 
       return (INT_PTR)TRUE; 
      } 
     break; 
    } 
    return (INT_PTR)FALSE; 
} 

回答

0

對話框被稱爲,只需要花費很長的時間,因爲PointsProc()是循環...

問題是break;同時處理在PointsProc()WM_PAINT - 它然後跳過調用DefWindowProc(),所以窗口不斷收到WM_PAINT消息,因爲窗口保持無效。

//  case WM_PAINT: 
//   break;