Контекстное меню списка - PullRequest
       17

Контекстное меню списка

1 голос
/ 02 октября 2009

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

РЕДАКТИРОВАНИЕ: Я следовал этому руководству Элемент управления списком MFC: Как использовать контекстное меню в элементе управления списком? . В руководстве говорится, что я получаю свой собственный класс из CListBox, что я и сделал, но как теперь добавить в диалоговое окно список моего производного класса?

Ответы [ 4 ]

4 голосов
/ 02 октября 2009

Поместите обработчик 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.
    }
}
2 голосов
/ 27 октября 2012

Поскольку мое редактирование было отклонено с обоснованием «слишком большого изменения», я добавлю свое предложение сюда, потому что, по моему мнению, исходный код поддерживает плохие методы кодирования.

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...
    }
}
0 голосов
/ 06 октября 2009

Если вы следовали руководству, чтобы получить свой собственный класс, убедитесь, что ON_WM_CONTEXTMENU() добавлено в новую карту сообщений класса.

Чтобы добавить список вашего производного класса, просто добавьте переменную для элемента управления ListBox и укажите класс переменной в качестве производного класса.

Однако я думаю, что ответ @ Goz также является верным и более простым решением.

0 голосов
/ 02 октября 2009

Добавьте обработчик для вашего диалогового окна. Это сгенерирует это:

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

pWnd будет указывать на окно / элемент управления, в котором пользователь щелкнул правой кнопкой мыши.

...