Пустое всплывающее меню Win32 - PullRequest
2 голосов
/ 10 марта 2010

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

    HMENU   menu;
    POINT   pt;

    menu = CreatePopupMenu();

    SetForegroundWindow( receivingWindow );
    GetCursorPos( &pt );
    int i = 19;
    AppendMenu( menu, MF_STRING, i++, _TEXT("meh meh") );
    AppendMenu( menu, MF_STRING, i++, _TEXT("testo") );
    AppendMenu( menu, MF_STRING, i++, _TEXT("foobar foobar") );
    TrackPopupMenuEx( menu
                    , 0
                    , pt.x, pt.y
                    , receivingWindow
                    , NULL );

    DestroyMenu( menu );

_TEXT используется для обеспечения того, чтобы текст был в Unicode, а receivingWindow - это многоуровневое окно, созданное ранее и работающее хорошо.

При вызове TrackPopupMenuEx меню отображается с хорошим размером и в правильном положении, но во всплывающем меню текст не отображается. Кто-то понял, почему и как решить эту проблему?

РЕДАКТИРОВАТЬ: больше информации о моем окружении:

  • Windows 7 x64
  • сборка x86 в Visual Studio 2008

EDIT2: я тестировал то же самое на Windows XP x86, и он работает как чудо, и после дальнейшего тестирования меню хорошо отображается в Windows 7 x64 с классическим видом.

Ответы [ 6 ]

2 голосов
/ 25 октября 2011

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

0 голосов
/ 13 февраля 2016

В моем случае я создал меню с помощью «CreateMenu», но я должен использовать «CreatePopupMenu», чтобы использовать его с TrackPopupMenuEx.

Если меню создано в редакторе ресурсов, проверьте, установлен ли флаг.

0 голосов
/ 12 апреля 2014

Попробуйте:

call    GetSubMenu,mnu,0
call    TrackPopupMenu,eax,TPM_CENTERALIGN or TPM_BOTTOMALIGN,cposx,cposy,0,MainhWnd,0
0 голосов
/ 11 марта 2010

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

0 голосов
/ 10 марта 2010

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

Насколько я понимаю, вам нужно уничтожить меню после того, как ваше окно получило командное сообщение из пункта меню. Альтернативно используйте флаг TPM_RETURNCMD в TrackPopUpMenuEx, поскольку это заставляет trackpopupex возвращаться только после выбора пункта меню (в отличие от немедленного).

0 голосов
/ 10 марта 2010

Если ваш компилятор не настроен на компиляцию для Unicode (т.е. #ifndef UNICODE), тогда winuser.h отобразит AppendMenu на AppendMenuA, который не является версией Unicode, и интерпретирует ваши строки как многобайтовые. Возможно, это объясняет вашу проблему? Вы можете явно вызвать AppendMenuW () (версия в юникоде), чтобы проверить, является ли это вашей проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...