2009-10-02 4 views
1

Как добавить контекстное меню в поле списка в MFC? Я не вижу обработчика WM_CONTEXTMENU в свойствах списка. Есть идеи?Меню контекстного меню списка

EDIT: Я следовал этому руководству 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 Ahmed, я отредактировал свой ответ. Метод будет помещен в ваш класс диалога. –

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... 
    } 
} 
Смежные вопросы