我正在尝试在我的应用程序中创建一个动态弹出菜单,我使用的生成代码是这样的:
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
时,菜单显示的大小和位置都很好,但弹出菜单中绝对没有文字显示。有人知道为什么,以及如何解决这个问题?
编辑:有关我的环境的更多信息:
EDIT2:我在Windows XP x86上测试了它,它就像一个魅力,经过进一步测试,菜单在Windows 7 x64中以经典外观很好地显示。
答案 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一起使用。
如果在资源编辑器中创建了菜单,请检查是否已设置标志。