@legacy_js

Как отлавливать курсор при наведении на дочернее окно?

Не могу понять, почему при наведении на кнопку не срабатывает событии, а на родительском окне срабатывает.
#include <Windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

HWND g_hwnd = nullptr;
HWND g_button = nullptr;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // Создание окна
    WNDCLASSEX wc = { 0 };

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = L"MyWindowClass";

    RegisterClassEx(&wc);

    g_hwnd = CreateWindowEx(
        0,
        L"MyWindowClass",
        L"Пример",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        300, 200,
        NULL,
        NULL,
        hInstance,
        NULL);

    ShowWindow(g_hwnd, nCmdShow);
    UpdateWindow(g_hwnd);

    // Создание дочерней кнопки
    g_button = CreateWindowEx(
        0,
        L"BUTTON",
        L"Кнопка",
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        0, 0, 100, 30,
        g_hwnd,
        nullptr,
        nullptr,
        nullptr);

    // Цикл обработки сообщений
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_MOUSEMOVE:
    {
        MessageBox(NULL, L"Наведение на кнопку", L"Сообщение", MB_OK);
        
        break;
    }
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        break;
    }
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}

Как заставить что бы при наведении курсора на кнопку, выводилось сообщение с MessageBox?
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
Подключите с помощью subclassing свою оконную процедуру к окну кнопки и отслеживайте WM_MOUSEMOVE в ней.

PS Поскольку subclassing для новой версии comctl32 улучшен, рекомендую также заглянуть сюда
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы