2009-10-18 4 views
1

VC++ MFC 응용 프로그램이 있고 CMainFrame 메뉴 모음을 통해 컨텍스트 메뉴를 표시해야합니다. 나는를 CMainFrame에 WM_CONTEXTMENU에 대한 처리기를 추가하고 나는 도구 모음 (또한 창 제목)을 통해 나의 상황에 맞는 메뉴를 표시 할 수 있어요하지만 난 바로 스파이에게 ++ 유틸리티를 사용하여 도구 모음MFC 응용 프로그램 메인 프레임 menubar를 통해 컨텍스트 메뉴 표시

답변

3

에서 클릭 할 때 핸들이 호출되지 않습니다 다음과 같은 메시지 추적 정보의 일반적인 응용 프로그램 결과의 클라이언트 도구 모음이나 캡션 영역을 마우스 오른쪽 버튼으로 클릭 : 메뉴에

<02620> 005503AE P WM_RBUTTONDOWN fwKeys:MK_RBUTTON xPos:1048 yPos:7 
<02621> 005503AE P WM_RBUTTONUP fwKeys:0000 xPos:1048 yPos:7 
<02622> 005503AE S WM_CONTEXTMENU hwnd:005503AE xPos:1174 yPos:63 

그러나 마우스 오른쪽 버튼으로 클릭은 스파이 ++ 메시지 창에 해당하는 추적 정보를 생성하지 않습니다. 그래서 표준 Windows 동작처럼 보입니다.

나는 Windows가 WM_RBUTTONDOWNWM_RBUTTONUP에 응답 메시지를 WM_CONTEXTMENU 메시지를 생성하는 것으로 의심하고 마우스 오른쪽 메뉴를 클릭 할 때이 있기 때문에, 더 팝업 컨텍스트 메뉴가 표시되지 생성되지 않습니다.

당신이 정말로이 동작을 원한다면, 당신이 할 수있는 것은 함정이 WM_NCRBUTTONDOWN 클라이언트 마우스 메시지이며,이 메시지 핸들러 내부 프레임 창에 자신의 WM_CONTEXTMENU 메시지를 게시 할 수 있습니다.

1

올바른 방향으로 나를 안내해 주셔서 감사합니다. WM_NCRBUTTONUP 메시지를 처리하고 핸들러 내부에서 메뉴 막대에 점이 있는지 여부를 확인하여이를 수행 할 수있었습니다.

 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
ON_WM_CONTEXTMENU() 
ON_WM_NCRBUTTONUP() 
END_MESSAGE_MAP() 

void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point) { 

    // do not display our popup menu for title bar, etc 
    CRect rcClient; 
    GetClientRect(rcClient); 
    ClientToScreen(rcClient); 

    if (rcClient.PtInRect(point)) 
     PopupMenu(point); 
    else 
     __super::OnContextMenu(pWnd, point); 
} 

void CMainFrame::OnNcRButtonUp(UINT nHitTest, CPoint point) { 

    if (nHitTest == HTMENU) 
     PopupMenu(point); 

    CFrameWnd::OnNcRButtonUp(nHitTest, point); 
} 

int CMainFrame::PopupMenu(CPoint &point) { 
    // display popup menu 
    .... 
} 
관련 문제