Странное поведение кнопки EnableWindow при нажатии

У меня есть простое приложение Win32, которое создает кнопку. Сразу после создания кнопки я отключил ее с помощью функции EnableWindow(FALSE) из файла <windows.h>. Это работает нормально, когда размер кнопки больше, чем примененный текст. Но когда размер кнопки меньше текста кнопки, клиентская область всего окна, похоже, копирует содержимое экрана.

Код, вызывающий ошибку:

#include <Windows.h>

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR    lpCmdLine, _In_ int       nCmdShow)
{
    WNDCLASSEX wcex = { 0 };

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.lpfnWndProc = WndProc;
    wcex.hInstance = hInstance;
    wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wcex.lpszClassName = L"MYWINDOWCLASS";
    
    if (RegisterClassExW(&wcex) == 0)
        return -1;

    HWND hWnd = CreateWindowW(L"MYWINDOWCLASS", L"MYWINDOW", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

    if (!hWnd)
        return -1;

    HWND buttonHWnd = CreateWindowW(L"BUTTON", L"MYWINDOW", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        100, 100, 40, 30, hWnd, nullptr, hInstance, nullptr);

    if (!buttonHWnd)
        return -1;

    EnableWindow(buttonHWnd, FALSE);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

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

🤔 А знаете ли вы, что...
C++11, C++14, C++17 и C++20 - это различные версии стандарта C++, каждая из которых внесла свои улучшения.


73
1

Ответ:

Решено

Как сказал @RemyLebeau, комментарий @OldBoy должен быть опубликован как ответ. Продвигайте комментарий @OldBoy для ответа.

Ваш код неполный по двум причинам: 1. Вы не объявили кисть для фона в вашей структуре WNDCLASSEX, поэтому вы можете не получить ожидаемый фон. 2. У вас нет обработчика для WM_PAINT сообщения, поэтому все, что отображается на фоне окна, не является гарантировано.


Интересные вопросы для изучения

Можно ли с уверенностью предположить, что 32-битные числа с плавающей запятой можно напрямую сравнивать друг с другом, если значение соответствует мантиссе?Практическое руководство: функция C++, которая настраивает тип возвращаемого значения в соответствии с потребностями вызывающей стороныВозвращает ли low_bound() один и тот же результат с обратными итераторами вектора в порядке возрастания и прямыми итераторами вектора в порядке убывания?Почему std::make_format_args ожидает неконстантную ссылкуC++ Существует ли быстрый многомерный массив, который позволяет использовать подмассивы разного размера?Можно ли установить для функции сна в C значение от 0 до 1 в ОС Windows?Почему мне отказывают в доступе с помощью Invoke-Command на локальном хосте?Переменная в переменной cmd batПеременная ведет себя странно в этом простом пакетном скриптеКак запускать команды после установки в автоматическом режиме с помощью установки Inno?