Источник статьи: Интернет Автор: ggg82/CSDN
В настоящее время многие пользовательские интерфейсы используют панели инструментов для создания строк меню. Недавно я заинтересовался этим и обратился за помощью в Интернете. Однако большая часть помощи, которую я получил, была исходным кодом BCGControlBar или исходным кодом SizableRebar. Для тех, кто просто хочет. собственный интерфейс для этого. Для тех, кто является функциональным другом, это может быть хорошим выбором. Просто посмотрите демо, а затем. Тогда просто вызывайте чужие библиотеки классов напрямую, но для таких же читателей, как мы, интересующихся этой темой и надеющихся понять всю подноготную, следует напрямую посмотреть на эти исходники без подробных пояснений и выяснить причину из них. легко, по крайней мере, для такого новичка, как я. По этой причине я надеюсь, что эта статья сможет помочь читателям, которые все еще ищут помощи.
Давайте посмотрим и поговорим ниже:
При получении сообщения о нажатии кнопки на панели инструментов мы обычно используем TrackPopupMenuEx для открытия меню. Ключ к проблеме заключается в том, что, когда меню не закрыто, TrackPopupMenuEx не возвращается и перехватывает сообщения мыши и клавиатуры. Вы можете увидеть это с помощью шпиона. панель инструментов в это время. Если сообщение не получено, конечно, нет возможности изменить активную точку. Для этого нам необходимо самостоятельно определить положение мыши, закрыть предыдущее меню и отобразить следующее меню, когда мышь перемещается к следующей горячей точке. Здесь мы используем функцию-перехватчик SetWindowsHookEx для установки перехватчика WH_MSGFILTER перед вызовом TrackPupupMenuEx. Код выглядит следующим образом:
m_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
MssageProc — это функция-перехватчик, код следующий:
void TrackPopup (HWND hWndToolBar, int iButton)
{
пока (iButton >= 0)
{
SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iButton;
//Установим хук
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
//Всплывающее меню
TrackPopupMenuEx(…);
//Удалить хук
UnhookWindowsHookEx(g_hMsgHook);
iButton = iNextPop; //Следующий всплывающий элемент, если он отрицательный, выходим
}
SendMessage(hWndToolBar,TB_SETHOTITEM,-1,0);
}
(Опыт и предложения: если кнопка использует стиль TBSTYLE_DROPDOWN, не вызывайте функцию непосредственно в сообщении TBN_DROPDOWN. Вам следует использовать промежуточное сообщение, а затем использовать PostMessa для отправки сообщения, чтобы TBN_DROPDOWN мог вернуться напрямую, в противном случае первое выделенная точка доступа будет устранена. Это очень хлопотно.)
iPopup — текущий всплывающий элемент, а iNextPop — следующий всплывающий элемент. Эти переменные необходимо обработать в функции HookMessageProc. Пример кода выглядит следующим образом: