Кто писал GUI на голом WinAPI, отзовитесь...

Тема в разделе "WASM.WIN32", создана пользователем sasha_s, 21 апр 2008.

  1. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Надо:
    Создать диалог, две кнопки OK, CANCEL и обычный Tree...

    Сделал (в VS2005):

    Создал пустой проектик, вставил туда ресурс типа диалог, он пустой, там только кнопки OK, CANCEL. Так вот зацикливается мой DialogProc, в него падает мессага 0x0030 (WM_SETFONT вроде как) и все, далее рекурсия...

    Вот мой код:

    Код (Text):
    1. INT_PTR CALLBACK DialogProc(HWND hwndDlg,
    2.                             UINT uMsg,
    3.                             WPARAM wParam,
    4.                             LPARAM lParam)
    5. {
    6.     switch(uMsg)
    7.     {
    8.     case WM_COMMAND:
    9.         switch(LOWORD(wParam))
    10.         {
    11.         case IDOK:
    12.             EndDialog(hwndDlg, TRUE);
    13.             PostQuitMessage(0);
    14.             return TRUE;
    15.  
    16.         case IDCANCEL:
    17.             EndDialog(hwndDlg, FALSE);
    18.             PostQuitMessage(0);
    19.             return TRUE;
    20.  
    21.         default:
    22.             return FALSE;
    23.         }
    24.         break;
    25.     }
    26.     return DefDlgProc(hwndDlg, uMsg, wParam, lParam);
    27. }
    28.  
    29. int APIENTRY WinMain(HINSTANCE hInstance,
    30.                        HINSTANCE hPrevInstance,
    31.                        LPTSTR    lpCmdLine,
    32.                        int       nCmdShow)
    33. {
    34.  
    35.     BOOL bRet;
    36.     MSG msg;
    37.     HWND hwndDlg = NULL;
    38.  
    39.     hwndDlg =
    40.         CreateDialog(
    41.         hInstance,
    42.         MAKEINTRESOURCE(IDD_DIALOG),
    43.         NULL,
    44.         DialogProc);
    45.     bRet = ShowWindow(hwndDlg, SW_SHOW);
    46.     bRet = UpdateWindow(hwndDlg);
    47.  
    48.     while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 )
    49.     {
    50.         if (bRet == -1 )
    51.         {
    52.             // handle the error and possibly exit
    53.         }
    54.         else if (!IsWindow(hwndDlg) || !IsDialogMessage(hwndDlg, &msg))
    55.         {
    56.             TranslateMessage(&msg);
    57.             DispatchMessage(&msg);
    58.         }
    59.     }
    60.     return 0;
    61. }
    Чего не сделал, подскажите, или отошлите на сампл где можно подсмотреть?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    что вот это?
     
  3. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Блин, сам точно тебе не скажу, из МСДНа спер...
     
  4. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    так.
    ты, я вижу, из ресурса диалог грузишь.. а, ну ты и написал что из ресурса.
    ок, тогда почему бы тебе просто не сделать
    DialogBoxParam(0х400000, ТвойРесурс, 0, &WindowProc, 0);
    ?

    на этом месте этот тред зависнет до окончания диалога,
    зато WindowProc будет стабильно получать сообщения.
    кароче это я к тому, что после DialogBoxParam() код писать не стоит ¦)
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    sasha_s
    По вашему коду - надо бы вам почитать, например, Iczelion-а (см. доки на этом сайте).
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    sasha_s
    Из описания DialogProc в MSDN:
    Из описания DefDlgProc в MSDN:
    [offtop]Когда же народ начнёт читать MSDN?[/offtop]