2012-04-19 3 views
4

Нужно ли всегда создавать и регистрировать новый WNDCLASS (EX) для вашего приложения? А затем используйте lpszClassName для главного окна?Создать окно без регистрации WNDCLASS?

Не существует ли какое-либо предварительно заданное имя класса, которое мы можем использовать для главного окна, например, есть кнопки «Button» и «Edit» для кнопок и текстовых полей и т. Д.?

ответ

6

Вы можете создать мини-приложение из ресурса диалога, вместо CreateWindow() вы используете CreateDialog(). Шаблонный код может выглядеть следующим образом, минус требуется проверка ошибок:

#include "stdafx.h" 
#include "resource.h" 

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_INITDIALOG: 
     return (INT_PTR)TRUE; 
    case WM_COMMAND: 
     if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { 
      DestroyWindow(hDlg); 
      PostQuitMessage(LOWORD(wParam)-1); 
      return (INT_PTR)TRUE; 
     } 
     break; 
    } 
    return (INT_PTR)FALSE; 
} 

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { 
    HWND hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); 
    if (hWnd == NULL) DebugBreak(); 
    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 
    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return (int) msg.wParam; 
} 

Который предполагает, что вы создали диалог с редактором ресурсов с помощью ID IDD_DIALOG1.

+1

Вы можете, если вы чувствуете себя очень храбрым, создавать диалоги непосредственно через CreateWindowEx, используя стиль WC_DIALOG. –

+0

Кажется, что [EndDialog()] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645472%28v=vs.85%29.aspx) предполагается использовать с модальными диалогами (созданных такими функциями, как [DialogBox()] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645452%28v=vs.85%29.aspx). Для _ [немодальной] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645434%28v=vs.85%29.aspx)_, как описано выше, следует использовать [DestroyWindow()] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632682%28v=vs.85%29.aspx). –

+0

Вы правы. Он был очень доволен EndDialog(), вероятно, достаточно распространенной ошибкой для обработки его в winapi :) –

2

Предварительно не определены классы окон для окон приложений верхнего уровня. Вы должны зарегистрировать класс окна для своего приложения или использовать диалог.

Смежные вопросы