WM_COMMAND не получен процедурой диалога - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь использовать контекстное меню, которое я создал для диалогового окна, но сообщение WM_COMMAND, которое должно быть отправлено, когда я щелкаю по пункту меню, не достигает процедуры диалога.

Я поместил оператор if в цикл обработки сообщений, чтобы проверить WM_COMMAND, и он регистрируется, но не отправляется в мою процедуру диалога.

Да, я использую if( !IsDialogMessage( hwndListDialog, &msg ) ) для вызова TranslateMessage и DispatchMessage.

Вот как я инициализировал свое контекстное меню:

listitemmenu = CreatePopupMenu();

listmenuitem1.cbSize = sizeof( menuitem1 );
listmenuitem1.fMask = MIIM_TYPE;
listmenuitem1.fType = MFT_STRING;
listmenuitem1.hSubMenu = NULL;
listmenuitem1.dwTypeData = "Copy Imgur Link";
InsertMenuItem( listitemmenu, 0, true, &listmenuitem1 ); //insert menu item

listmenuitem2.cbSize = sizeof( menuitem1 );
listmenuitem2.fMask = MIIM_TYPE;
listmenuitem2.fType = MFT_STRING;
listmenuitem2.hSubMenu = NULL;
listmenuitem2.dwTypeData = "Copy Imgur Delete Link";
InsertMenuItem( listitemmenu, 1, true, &listmenuitem2 ); //insert menu item

listmenuitem3.cbSize = sizeof( menuitem1 );
listmenuitem3.fMask = MIIM_TYPE;
listmenuitem3.fType = MFT_STRING;
listmenuitem3.hSubMenu = NULL;
listmenuitem3.dwTypeData = "Rename";
InsertMenuItem( listitemmenu, 2, true, &listmenuitem3 ); //insert menu item

listmenuitem4.cbSize = sizeof( menuitem1 );
listmenuitem4.fMask = MIIM_TYPE;
listmenuitem4.fType = MFT_STRING;
listmenuitem4.hSubMenu = NULL;
listmenuitem4.dwTypeData = "Remove from list";
InsertMenuItem( listitemmenu, 3, true, &listmenuitem4 ); //insert menu item

Вот как я отслеживаю меню:

TrackPopupMenuEx( listitemmenu, TPM_LEFTBUTTON | TPM_NOANIMATION | TPM_HORIZONTAL | TPM_VERTICAL, cpos.x, cpos.y, ListControl, NULL );

Это случай переключения, который я пытаюсь использовать для взаимодействия с моим меню:

case WM_COMMAND:
        switch( LOWORD(lParam) )
        {
        case 0:
            printf("copy link");
            break;
        case 1:
            printf("copy deletion link");
            break;
        case 2:
            printf("Rename");
            break;
        case 3:
            printf("Remove");
            break;
        }
        break;

Ответы [ 4 ]

1 голос
/ 12 марта 2012

С документация для TrackPopupMenuEx:

hwnd [in]

Тип: HWND

Дескриптор окна, которому принадлежит контекстное меню. Это окно принимает все сообщения из меню.

Вы передали ListControl в качестве параметра hwnd, поэтому WM_COMMAND идет к этому окну, а не к вашему диалоговому окну. Если вы хотите, чтобы WM_COMMAND перешел в ваше диалоговое окно, тогда передайте это диалоговое окно как hwnd.

1 голос
/ 11 марта 2012

Я полагаю (хотя не помню точно, это было давно ...), проблема в том, что вы не указываете ID для своих пунктов меню.WM_COMMAND, который ожидается в вашей оконной процедуре, должен содержать lParam, что равно идентификатору выбранного элемента.Однако, если вы не укажете идентификатор элемента, он получит IDC_STATIC по умолчанию, что является недопустимым значением.

Попробуйте выполнить следующее:

listmenuitem1.cbSize = sizeof( menuitem1 );
listmenuitem1.fMask = MIIM_TYPE | MIIM_ID;
// ...
listmenuitem1.wID = /* the ID you want to see in processing WM_COMMAND */;
// ...
InsertMenuItem( listitemmenu, 0, true, &listmenuitem1 ); //insert menu item

PS Вы также можете указать TPM_RETURNCMD в TrackPopupMenuEx, так что возвращаемым значением будет идентификатор выбранного элемента

0 голосов
/ 15 марта 2012

Разве ваш переключатель не должен быть с wParam, а не с lParam при обработке WM_COMMAND? Для меню старшее слово wParm равно 0, а идентификатор меню находится в младшем слове wParam. Вам также следует заменить ListControl дескриптором вашего диалогового окна, чтобы получать сообщения в TrackPopupMenu, как говорили другие.

0 голосов
/ 12 марта 2012

Я нашел решение, но это своего рода обходной путь гетто.

Вместо обработки WM_COMMAND в Dialog Proc, где его нельзя получить, я обрабатываю его в цикле сообщений.

if( !IsDialogMessage( hwndListDialog, &msg ) )
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
} else {
    if( WM_COMMAND == msg.message )
    {
        switch( LOWORD( msg.wParam ) )
        {
        case 200:
            break;
        case 201:
            break;
        case 202:
            break;
        case 203:
            break;
        }
    }
}

Я все еще надеюсь, что кто-то может помочь мне получить WM_COMMAND в моей процедуре диалога (тем более, что WM_COMMAND из других диалоговых элементов управления достигает диалогового окна), но это помогает мне двигаться вперед на данный момент.

...