Toolbar 메뉴 작성 과정 상세 설명
현재 많은 사용자 인터페이스 에서 도구 모음 을 사용 하여 메뉴 를 만 들 고 있 습 니 다.동생 은 최근 에 이에 관심 이 있어 서 인터넷 에서 도움 을 청 했 습 니 다.그러나 도움 을 받 은 것 은 대부분 BCG Control Bar 의 소스 코드 나 SizableRebar 의 소스 코드 입 니 다.자신의 인터페이스 만 이 기능 을 가지 기 를 바 라 는 친구 에 게 좋 은 선택 일 수도 있 습 니 다.demo 를 보면그 다음 에 다른 사람의 라 이브 러 리 를 직접 호출 하면 되 지만 저 등 이 화제 에 관심 이 있 습 니 다.그 경 위 를 알 고 싶 은 독자 에 게 상세 하 게 설명 되 지 않 은 소스 코드 를 직접 보고 그 중에서 그 이 유 를 찾 는 것 이 쉽 지 않 습 니 다.적어도 저 같은 풋내기 에 게 는 이 렇 습 니 다.본 고 는 이런 이유 에서 비롯 되 었 습 니 다.아직도 이 도움 을 구하 고 있 는 독자 들 에 게 도움 이 되 기 를 바 랍 니 다.
다음은 우리 가 보면 서 이야기 합 시다.
toolbarbutton 이 메 시 지 를 눌 렀 을 때 우 리 는 보통 Track PopupMenuEx 팝 업 메뉴 를 사용 합 니 다.문 제 는 메뉴 가 닫 히 지 않 았 을 때 Track PopupMenuEx 가 되 돌아 오지 않 고 마우스 와 키보드 메 시 지 를 차단 하 는 것 입 니 다.spy 를 사용 하면 이 도구 모음 에서 아무런 메 시 지 를 받 지 못 합 니 다.물론 이 슈 를 바 꿀 수 없습니다.마우스 위 치 를 탐지 하고 마우스 가 다음 핫 이 슈 로 이동 할 때 이전 메뉴 를 닫 고 다음 메뉴 를 표시 해 야 합 니 다.여기 갈고리 함수 SetWindowsHookEx 를 사용 하여 TrackPupupMenuEx 를 호출 하기 전에 WH 를 설치 합 니 다.MSGFILTER 갈고리,코드 는 다음 과 같 습 니 다.
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc 는 갈고리 함수 입 니 다.코드 는 다음 과 같 습 니 다.
LRESULT CALLBACK MessageProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code == MSGF_MENU)
{
HookMessageProc(lParam);
}
return CallNextHookEx(m_hMsgHook, code, wParam, lParam);
}
함수 검사 메시지,메뉴 에서 왔 다 면 함수 HookMessage Proc 에 메 시 지 를 전달 합 니 다.우리 가 해 야 할 일 은 이 함수 에서 메시지 WM 을 감지 하 는 것 입 니 다.마우스 EMOVE,마우스 위 치 를 테스트 하고 마우스 가 다른 단추 로 이동 했다 면 메뉴 를 닫 고 다음 메뉴 를 표시 합 니 다.메뉴 를 닫 고 메시지 WM 사용 하기CANCELMODE,메뉴 가 닫 힌 후에 우 리 는 갈 고 리 를 풀 고 다음 메뉴 가 팝 업 될 때 갈 고 리 를 다시 설치 해 야 합 니 다.팝 업 메뉴 예제 코드 는 다음 과 같 습 니 다.
void TrackPopup(HWND hWndToolBar, int iButton)
{
while (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);
}
(경험 치 와 제안:button 이 스타일 TBSTYLE 를 사용 하면DROPDOWN,소식 에 TBNDROPDOWN 에서 이 함 수 를 직접 호출 하려 면 중간 메 시 지 를 사용 한 다음 PostMessa 개 를 사용 하여 이 메 시 지 를 보 내야 합 니 다.TBNDROPDOWN 은 직접 돌아 갈 수 있 습 니 다.그렇지 않 으 면 첫 번 째 하 이 라 이 트 를 없 애 는 것 은 번 거 로 운 일 입 니 다.)
ipopup 은 현재 팝 업 항목 입 니 다.iNextPop 은 다음 팝 업 항목 입 니 다.이 변 수 는 함수 HookMessage Proc 에서 처리 해 야 합 니 다.예제 코드 는 다음 과 같 습 니 다.
void HookMessageProc(MSG * pMsg)
{
if (pMsg->message == WM_MOUSEMOVE)
{
int iButton, iCount;
POINT pt = { LOWORD(pMsg->lParam), HIWORD(pMsg->lParam) };
ScreenToClient(hWndToolbar, &pt);
iButton = SendMessage(hWndToolbar, TB_HITTEST, 0, &pt);
iCount = SendMessage(hWndToolbar, TB_BUTTONCOUNT, 0, 0);
if (iPopup != iButton && iButton < iCount && iButton >= 0)
{
iNextPop = iButton;
SendMessage(hWndMain, WM_CANCELMODE, 0, 0);
}
else
{
iNextPop = -1;
}
}
}
(경험 과 제안:여기 서 TrackPopup 을 호출 하려 고 하지 마 십시오.이 함수 의 while 순환 을 취소 하려 고 했 습 니 다.이 함 수 를 직접 호출 했 습 니 다.결 과 는 TrackPopupMenuEx 가 돌아 오지 않 기 전에 이 함수 가 호출 되 었 습 니 다)
여기 서 마우스 이동 메시지 만 처 리 했 을 뿐 실제 메뉴 는 키보드 네 비게 이 션 메 시 지 를 처리 해 야 합 니 다.상세 한 코드 는 참고 할 수 있 습 니 다.
BCGControlBar(http://www.vckbase.com/code/downcode.asp?id=1382)
또는 SizableRebar(http://www.codeproject.com/docking/sizablerebar/SizableRebar_demo.zip
)
이 바 텀 프레임 워 크 가 있 으 면 이런 처리 과정 은 더 이상 어렵 지 않 을 것 입 니 다.글 에서 언급 한 일부 API 함 수 는 msdn 을 참고 할 수 있 습 니 다.
Msdn 에서 관련 자료:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/faq/iemenubar.asp
http://www.microsoft.com/msj/0199/c/c0199.aspx
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LeetCode – 768. Max Chunks To Make Sorted IIThis question is the same as "Max Chunks to Make Sorted" except the integers of the given array are not necessarily dist...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.