空Win32弹出菜单

时间:2010-03-10 16:46:21

标签: c++ c windows winapi contextmenu

我正在尝试在我的应用程序中创建一个动态弹出菜单,我使用的生成代码是这样的:

    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 build in Visual Studio 2008

EDIT2:我在Windows XP x86上测试了它,它就像一个魅力,经过进一步测试,菜单在Windows 7 x64中以经典外观很好地显示。

6 个答案:

答案 0 :(得分:2)

确保为未处理的消息调用:: DefWindowProc()。我在TrackPopupMenu()中遇到了类似的问题,其中菜单会以正确的大小弹出并允许选择项目,但项目上没有文本,因为代码忽略了一些消息而没有调用:: DefWindowProc()。

答案 1 :(得分:0)

如果您的编译器未设置为unicode编译(即#ifndef UNICODE),则winuser.h会将AppendMenu映射到AppendMenuA,这是一个非unicode版本,并将您的字符串解释为多字节。也许这解释了你的问题? 您可以显式调用AppendMenuW()(unicode版本)来检查这是否是您的问题。

答案 2 :(得分:0)

我认为问题是TrackPopUpMenuEx函数不会立即返回;因此,在它启动(并且可能选择它的大小和位置)之后,但在它首次显示之前,你正在销毁菜单。

据我了解,您需要在窗口从菜单选择中收到命令消息后销毁菜单。或者在TrackPopUpMenuEx中使用TPM_RETURNCMD标志,因为这会强制trackpopupex仅在选择菜单项后返回(而不是立即)。

答案 3 :(得分:0)

我找到了解决此问题的方法。我没有使用我的主窗口(receivingWindow),而是使用仅消息窗口来接收事件。由于我不理解的原因,文本通常以这种方式显示。

答案 4 :(得分:0)

尝试:

call    GetSubMenu,mnu,0
call    TrackPopupMenu,eax,TPM_CENTERALIGN or TPM_BOTTOMALIGN,cposx,cposy,0,MainhWnd,0

答案 5 :(得分:0)

在我的情况下,我用“CreateMenu”创建了菜单,但我必须使用“CreatePopupMenu”将它与TrackPopupMenuEx一起使用。

如果在资源编辑器中创建了菜单,请检查是否已设置标志。