Странное поведение кнопки 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;
}

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

OldBoy 15.08.2024 12:25

«Это работает нормально, когда размер кнопки больше, чем примененный текст». - на самом деле это не так. Поначалу это может показаться нормальным, однако если вы заставите окно перерисовать себя (например, изменив его размер или свернув/восстановив), фон будет испорчен. Поэтому вам следует либо предоставить фоновую кисть при регистрации класса окна, либо нарисовать ее самостоятельно.

user7860670 15.08.2024 12:33

Фоновая кисть по умолчанию решает эту проблему. Я добавил wcex.hbrBackground = CreateSolidBrush(RGB(255, 255, 255)); в WNDCLASSEX и теперь всё работает нормально. Это также решает некоторые другие проблемы при изменении размера, как сказал @user7860670. Большое спасибо!!

Theofanis kouniakis 15.08.2024 17:30

@OldBoy, который должен быть опубликован как ответ, а не как комментарий.

Remy Lebeau 15.08.2024 18:06

@RemyLebeau Вероятно, потребуется более подробное объяснение. И поскольку ОП решил свою проблему, я пока оставлю все как есть.

OldBoy 15.08.2024 18:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Похожие вопросы

Можно ли с уверенностью предположить, что 32-битные числа с плавающей запятой можно напрямую сравнивать друг с другом, если значение соответствует мантиссе?
Практическое руководство: функция C++, которая настраивает тип возвращаемого значения в соответствии с потребностями вызывающей стороны
Возвращает ли low_bound() один и тот же результат с обратными итераторами вектора в порядке возрастания и прямыми итераторами вектора в порядке убывания?
Почему std::make_format_args ожидает неконстантную ссылку
C++ Существует ли быстрый многомерный массив, который позволяет использовать подмассивы разного размера?
Необходим ли std::atomic или voluty при установке переменных из обработчика сигналов?
Могу ли я вызвать CreateString встроенным при создании таблицы?
Строка повреждена после перекодирования
Нужна помощь в понимании указателей и разыменования в этом коде
Может ли этот поток функции ждать бесконечно?