void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
if (nItemID == 0)
SetWindowText("");
else
{
CString str;
str.LoadString(nItemID);
SetWindowText( (LPCTSTR)str );
}
}
Не могу отловить событие класса CMenu
Я работаю над созданием статус-бара, где будут отображаться подсказки к элементам различных меню приложения (на данный момент - всплывающих меню).
Для этого я отлавливаю событие WM_MENUSELECT. В принципе, это работает: когда пользователь наводит курсор на определённый элемент меню или меню закрывается, вызывается обработчик события MENUSELECT.
Но мне нужно каким-то образом распознавать момент, когда курсор мыши оказывается за пределами окна меню (меню при этом ещё не закрыто), чтобы в этот момент обновить статус-бар.
Если бы CMenu был снаследован от CWnd, то я бы просто отлавливал событие WM_MOUSELEAVE.
Подскажите, пожалуйста, что является для класса CMenu аналогом CWnd::WM_MOUSELEAVE.
Цитата: Denis1986
Но мне нужно каким-то образом распознавать момент, когда курсор мыши оказывается за пределами окна меню (меню при этом ещё не закрыто), чтобы в этот момент обновить статус-бар.
В этом случае родительскому окну приходит сообщение WM_MENUSELECT с ItemID равным 0.
В том-то и дело, что сообщение WM_MENUSELECT с ItemID, равным 0, приходит уже при закрытии всплывающего меню, а не в момент, когда курсор мыши оказывается за пределами окна меню (по крайней мере у меня всё функционирует именно так).
Цитата: Denis1986
nikitozz
В том-то и дело, что сообщение WM_MENUSELECT с ItemID, равным 0, приходит уже при закрытии всплывающего меню, а не в момент, когда курсор мыши оказывается за пределами окна меню (по крайней мере у меня всё функционирует именно так).
В том-то и дело, что сообщение WM_MENUSELECT с ItemID, равным 0, приходит уже при закрытии всплывающего меню, а не в момент, когда курсор мыши оказывается за пределами окна меню (по крайней мере у меня всё функционирует именно так).
Вообще-то странно. У меня в 2005 вот такой кусок кода
Код:
работает как должен работать. Т.е. при выделении какого-то пункта меню, соответствующим образом изменяется и заголовок окна, после того, как курсор убран с меню, но меню все еще открыто, заголовок окна становится пустым.
Выложи, пожалуйста, свой тестовый проект с меню. Я сравню со своим вариантом (по куску кода отличий выявить не удалось).
Цитата: Denis1986
nikitozz
Выложи, пожалуйста, свой тестовый проект с меню. Я сравню со своим вариантом (по куску кода отличий выявить не удалось).
Выложи, пожалуйста, свой тестовый проект с меню. Я сравню со своим вариантом (по куску кода отличий выявить не удалось).
Вот, выкладываю.
Спасибо! Благодаря твоему проекту я понял, что всплывающие и обычные меню генерируют несколько различный набор сообщений. Обычное меню генерирует событие WM_MENU_SELECT при выходе курсора за границы меню, а выплывающие меню - нет.
Поэтому я пошёл другим путём. Я снаследовал свой класс от CMenu и переопределил метод DrawItem():
Код:
void CMyMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CPoint l_cursor_point;
GetCursorPos(&l_cursor_point);
//if mouse cursor is going out of menu item rectangle.
if ((l_cursor_point.x <= m_menu_coordinates.x + lpDIS -> rcItem.left + m_left_border_thickness
|| l_cursor_point.y <= m_menu_coordinates.y + m_top_border_thickness
|| l_cursor_point.x > m_menu_coordinates.x + lpDIS -> rcItem.right
|| l_cursor_point.y >= m_menu_coordinates.y + lpDIS -> rcItem.bottom)
&& m_status_bar_event_handler != NULL && m_status_bar_event_handler -> GetSafeHwnd() != NULL)
{
m_status_bar_event_handler -> SendMessage(CStatusBarHelper::WM_CURSOR_OVER_MENU_BOUND);
}
__super::DrawItem(lpDIS);
}
{
CPoint l_cursor_point;
GetCursorPos(&l_cursor_point);
//if mouse cursor is going out of menu item rectangle.
if ((l_cursor_point.x <= m_menu_coordinates.x + lpDIS -> rcItem.left + m_left_border_thickness
|| l_cursor_point.y <= m_menu_coordinates.y + m_top_border_thickness
|| l_cursor_point.x > m_menu_coordinates.x + lpDIS -> rcItem.right
|| l_cursor_point.y >= m_menu_coordinates.y + lpDIS -> rcItem.bottom)
&& m_status_bar_event_handler != NULL && m_status_bar_event_handler -> GetSafeHwnd() != NULL)
{
m_status_bar_event_handler -> SendMessage(CStatusBarHelper::WM_CURSOR_OVER_MENU_BOUND);
}
__super::DrawItem(lpDIS);
}
Экземпляру класса CMyMenu предварительно задаются координаты, которые затем будут переданы в функцию TrackPopUpMenu(), а также CWnd*, который будет получать сообщения о выходе курсора за границы меню.
Тему можно считать закрытой :)
Цитата: Denis1986
nikitozz
Спасибо! Благодаря твоему проекту я понял, что всплывающие и обычные меню генерируют несколько различный набор сообщений.
Спасибо! Благодаря твоему проекту я понял, что всплывающие и обычные меню генерируют несколько различный набор сообщений.
Я немного затупил. Невнимательно прочел тему. Думал речь идет об обычном меню.