Вам нужно зарегистрировать диалоговое окно?

StackOverflow https://stackoverflow.com/questions/36991

  •  09-06-2019
  •  | 
  •  

Вопрос

Итак, я абсолютный новичок в любом программировании, связанном с Windows . Я играл с Windows API и наткнулся на пару примеров, как инициализировать создание окон и тому подобное.

Один пример создает обычное окно (я сократил часть кода):

int WINAPI WinMain( [...] )
{

    [...]

    // Windows Class setup
    wndClass.cbSize = sizeof( wndClass );
    wndClass.style  = CS_HREDRAW | CS_VREDRAW;
    [...]    

    // Register class
    RegisterClassEx( &wndClass );

    // Create window
    hWnd = CreateWindow( szAppName, "Win32 App",
                         WS_OVERLAPPEDWINDOW,
                         0, 0, 512, 384,
                         NULL, NULL, hInstance, NULL );
    [...]
}

Во втором примере создается диалоговое окно (без сокращений, кроме аргументов WinMain):

int WINAPI WinMain( [...] )
{
    // Create dialog box
    DialogBox(hInstance, 
              MAKEINTRESOURCE(IDD_MAIN_DLG), 
              NULL, 
              (DLGPROC)DialogProc);
}

Второй пример не содержит никакого вызова функции регистрации. Он просто создает DialogBox с прикрепленным к нему процессом DialogProc.

Это работает нормально, но мне интересно, есть ли преимущество в регистрации класса окна и последующем создании диалогового окна (если это вообще возможно).

Это было полезно?

Решение

Вам не нужно регистрировать диалоговое окно.

Диалоговые окна предопределены, поэтому (как вы заметили) при создании диалога нет ссылки на класс окна. Если вы хотите больше контроля над диалогом (как вы получаете, когда создаете свой собственный класс окна), вы бы создали подкласс диалога, который является методом, с помощью которого вы заменяете процедуру окна диалога своей собственной. Когда ваша процедура вызывается, вы изменяете поведение диалогового окна; Затем вы можете или не можете вызвать исходную оконную процедуру в зависимости от того, что вы пытаетесь сделать.

Другие советы

Прошло много времени с тех пор, как я это сделал, но IIRC, первый случай - это динамическое создание диалога из шаблона в памяти. Второй пример - для гораздо более распространенного случая создания диалога с использованием ресурса. Динамический диалог в Win32 был довольно сложным, но он позволил вам создать настоящий управляемый данными интерфейс и избежать проблем с объединением ресурсов с DLL.

Что касается использования Win32 - если вам нужно приложение для Windows, и вы не хотите зависеть от MFC или среды выполнения .NET, то это то, что вы используете.

Это только косвенно связано с вопросом, но если вы новичок в программировании Windows, почему вы используете Win32? Если нет большого количества низкоуровневого кода (который в любом случае должен быть отделен от GUI), возможно, имеет смысл использовать .NET, что также должно привести к гораздо меньшим травмам головы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top