Причина сбоя созданного окна в C - PullRequest
0 голосов
/ 22 марта 2020

Когда я создаю окно в C с помощью функции CreateWindow(), оно отлично работает, просто мгновенно исчезает, поэтому я использовал функцию getch(), чтобы попытаться решить проблему, но она не работает. Окно не отображает кнопку и вылетает.

Но когда я использовал MessageBox() вместо getch(), оно остается и работает нормально. Я пытаюсь выяснить, почему это происходит.

Я пробовал много вещей, например, используя MessageBox() и getch() вместе, используя getch() до и после ShowWindow(), но каждый раз это дает мне немного Интересный результат, но не нормальная функциональность окна.

Код, который работает:

#include <windows.h>

int _stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    HWND h;
    HINSTANCE i;
    h = CreateWindow("Button", "XYZ", WS_OVERLAPPEDWINDOW, 15, 20, 250, 200, 0, 0, i, 0);
    ShowWindow(h, nCmdShow);
    MessageBox(0, "Stop", "Wait", MB_OK);
    return 0;
}

Код, который не работает:

#include <windows.h>

int _stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    HWND h;
    HINSTANCE i;
    h = CreateWindow("Button", "XYZ", WS_OVERLAPPEDWINDOW, 15, 20, 250, 200, 0, 0, i, 0);
    ShowWindow(h, nCmdShow);
    getch();
    return 0;
}

Я хочу знать причина этой ошибки. Я думаю, это потому, что getch() является функцией DOS, но все же компилятор должен по крайней мере показать предупреждение.

1 Ответ

5 голосов
/ 22 марта 2020

В этом коде нет cra sh.

В вашем примере getch() просто отсутствует сообщение l oop, необходимое для обслуживания окна, а также getch() не имеет смысла в консольное приложение. Таким образом, ваш WinMain() выходит сразу после отображения окна кнопки.

В то время как в вашем примере MessageBox() есть сообщение l oop (внутри самого MessageBox()), которое поддерживает работу WinMain(), и кнопка окно обрабатывает сообщения пользовательского интерфейса, пока не закроется диалоговое окно MessageBox.

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

...