2009-10-02 5 views
1

MFC의 목록 상자에 상황에 맞는 메뉴를 추가하려면 어떻게합니까? 목록 상자의 속성에서 WM_CONTEXTMENU 처리기를 볼 수 없습니다. 어떤 아이디어?목록 상자 상황에 맞는 메뉴

편집 :이 자습서는 MFC List Control: How to use a context menu in a list control?에 있습니다. 이 튜토리얼은 내가 한 CListBox에서 내 자신의 클래스를 파생한다고 말하지만, 어떻게 파생 클래스의 목록 상자를 대화 상자에 추가합니까?

답변

0

대화 상자 처리기를 추가하십시오. 즉,이를 생성합니다

void YourDialogClass::OnContextMenu(CWnd* pWnd, CPoint point) { 
    ... 
} 

pWnd은 사용자가 마우스 오른쪽 버튼을 클릭하는 창/제어를 가리 킵니다.

+0

그러나 어디에서 추가합니까? 목록 상자에 클래스가 없다는 의미입니다. – akif

+0

내 소스 코드의 목록 상자에 클래스가 표시되지 않습니다. 단 두 가지 클래스 CDialog, CWinApp – akif

+0

@ Manzoor 아메드, 내 대답을 편집했습니다. 메서드는 대화 상자 클래스에 배치됩니다. –

4

상위 클래스에 OnContextMenu 처리기를 추가하십시오. 그런 다음 팝업 메뉴를 추가하십시오.

편집 OnContextMenu 핸들러를 추가하려면 이벤트 핸들러를 PARENT 창 (즉, 목록 클래스가 아닌)에 추가하십시오. 이것은 자원 편집기를 통해 가장 쉽게 수행됩니다. 속성 페이지로 이동 한 다음 메시지 섹션으로 이동하십시오. 그런 다음 WM_CONTEXTMENU에 대한 함수를 추가하십시오. 당신이 클래스를 소유 도출 할 수있는 튜토리얼을 따라하면

void CYourDialog::OnContextMenu(CWnd* pWnd, CPoint point) 
{ 
    CListCtrl* pList = (CListCtrl*)GetDlgItem(ID_YOUR_LIST); 

    if ((CWnd*)pList == pWnd) 
    { 
     CMenu menu; 
     // Create your menu items. 

     int retVal = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this); 

     // Handle your returns here. 
    } 
} 
0

, ON_WM_CONTEXTMENU() 새로운 클래스의 메시지 맵에 추가되어 있는지 확인하십시오.

파생 클래스의 목록 상자를 추가하려면 ListBox 컨트롤에 대한 변수를 추가하고 변수 클래스를 파생 클래스로 지정하기 만하면됩니다.

그러나 @ Goz의 대답은 유효한 해결책이며 더 간단한 것으로 생각합니다.

2

내 편집이 "너무 많이 변경됨"의 이유와 함께 거부되었으므로 원본 코드가 잘못된 코딩 방법을 권장하기 때문에 제안서를 여기에 올립니다.

void CYourDialog::OnContextMenu(CWnd* pWnd, CPoint point) 
{ 
    int CtrlID = pWnd->GetDlgCtrlID(); 

    if (CtrlID == ID_YOUR_LIST) { 
     CMenu menu; 
     // Create your menu items... 
     int retVal = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this); 
     // Handle selected options here... 
    } 
}