Winapi обнаруживает зависание кнопки

У меня есть проект на C ++, в котором я использую Winapi для разработки окна с кнопкой, и я хочу изменить текст кнопки при ее наведении. Например, изменив «Click me» на «Click me NOW!», Когда завис. Я пытался искать, но я не нашел хороших способов сделать это.

Я заметил, что когда пользователь зависает, WM_NOTIFY сообщение получено, но я не знаю, как его вызвать при наведении курсора мыши. Я обнаружил, что могу использовать TrackMouseEvent чтобы обнаружить зависание, но оно ограничено периодом времени, и я хочу выполнять действие каждый раз, когда пользователь наводит кнопку.

Вот как я создаю кнопку:

HWND Button = CreateWindow("BUTTON", "Click me",
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | BS_NOTIFY,
20, 240, 120, 20,
hwnd, (HMENU)101, NULL, NULL);

И это моя оконная процедура:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch (msg)
{
case WM_NOTIFY:
{
//??? Here is where I get a message everytime I hover the button, But I don't know any proper way to see if it has been executed by the button.
}
case WM_CREATE: //On Window Create
{
//...
}
case WM_COMMAND: //Command execution
{
//...
break;
}
case WM_DESTROY: //Form Destroyed
{
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}

3

Решение

Предполагая, что вы используете общие элементы управления Здесь BCN_HOTITEMCHANGE код уведомления для WM_NOTIFY сообщение. Сообщение включает в себя NMBCHOTITEM структура, которая включает в себя информацию о том, входит ли мышь в область наведения или покидает ее.

Вот пример:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_NOTIFY:
{
LPNMHDR header = *reinterpret_cast<LPNMHDR>(lParam);

switch (header->code)
{
case BCN_HOTITEMCHANGE:
{
NMBCHOTITEM* hot_item = reinterpret_cast<NMBCHOTITEM*>(lParam);

// Handle to the button
HWND button_handle = header->hwndFrom;

// ID of the button, if you're using resources
UINT_PTR button_id = header->idFrom;

// You can check if the mouse is entering or leaving the hover area
bool entering = hot_item->dwFlags & HICF_ENTERING;

return 0;
}
}

return 0;
}
}

return DefWindowProcW(hwnd, msg, wParam, lParam);
}
3

Другие решения

Вы можете проверить код WM_NOTIFY сообщение, чтобы увидеть, если это NM_HOVER сообщение.

switch(msg)
{
case WM_NOTIFY:
if(((LPNMHDR)lParam)->code == NM_HOVER)
{
// Process the hover message
}
else if (...) // any other WM_NOTIFY messages you care about
{}
}
0

По вопросам рекламы [email protected]