기사 출처: 인터넷 작성자: ggg82/CSDN
요즘에는 많은 사용자 인터페이스가 메뉴 표시줄을 만들기 위해 툴바를 사용합니다. 최근 이에 관심을 갖고 온라인으로 도움을 요청했지만, 제가 받은 도움의 대부분은 단지 원하는 사람들을 위한 BCGControlBar의 소스 코드였습니다. 기능적인 친구인 사람들에게는 이것이 좋은 선택이 될 수 있습니다. 데모를 살펴보고 나서. 그러면 그냥 다른 사람의 클래스 라이브러리에 직접 전화해 보아야 하지만, 이 주제에 관심이 있고 내용을 이해하고 싶은 독자라면 자세한 설명 없이 직접 이 소스 코드를 보고 그 이유를 알아내야 하는 것은 아닙니다. 적어도 나 같은 초보자에게는 쉽습니다. 이러한 이유로 이 기사가 여전히 도움을 찾고 있는 독자들에게 도움이 되기를 바랍니다.
아래를 보고 이야기해 봅시다.
도구 모음 버튼 누름 메시지를 받을 때 일반적으로 TrackPopupMenuEx를 사용하여 메뉴를 팝업합니다. 문제의 핵심은 메뉴가 닫히지 않으면 TrackPopupMenuEx가 반환되지 않고 마우스 및 키보드 메시지를 가로채는 것입니다. 이때 메시지가 수신되지 않으면 핫스팟을 변경할 수 있는 방법이 없습니다. 이를 위해서는 마우스 위치를 직접 감지하고 마우스가 다음 핫스팟으로 이동할 때 이전 메뉴를 닫고 다음 메뉴를 표시해야 합니다. 여기서는 TrackPupupMenuEx를 호출하기 전에 후크 함수 SetWindowsHookEx를 사용하여 WH_MSGFILTER 후크를 설치합니다.
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc는 후크 함수이며 코드는 다음과 같습니다.
무효 TrackPopup(HWND hWndToolBar, int iButton)
{
동안(iButton >= 0)
{
SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);
아이팝업 = 아이버튼;
//훅 설치
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 함수에서 처리되어야 합니다.