Toolbar 메뉴 작성 과정 상세 설명

3773 단어 Toooollbbaar
글 출처:인터넷 작성 자:ggg 82/CSDN
현재 많은 사용자 인터페이스 에서 도구 모음 을 사용 하여 메뉴 를 만 들 고 있 습 니 다.동생 은 최근 에 이에 관심 이 있어 서 인터넷 에서 도움 을 청 했 습 니 다.그러나 도움 을 받 은 것 은 대부분 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

좋은 웹페이지 즐겨찾기