空的Win32popup菜单

我试图在我的应用程序中创build一个dynamic的popup菜单,我使用的代码是这样的:

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是之前创build并运行良好的分层窗口。

当调用TrackPopupMenuEx ,菜单显示的尺寸和位置都很好,但popup菜单中绝对没有文字出现。 有人知道为什么,以及如何解决这个问题?

编辑:关于我的环境的更多信息:

  • Windows 7 x64
  • x86构build在Visual Studio 2008中

编辑2:我已经testing了相同的Windows XP x86,它的作品就像一个魅力,经过进一步的testing,菜单很好地显示在Windows 7 x64与经典的外观。

确保:: DefWindowProc()被调用,否则不处理的消息。 我有TrackPopupMenu()类似的问题,其中菜单将弹出正确的大小,并允许项目被选中,但项目上没有文字,因为代码忽略了一些消息,没有调用:: DefWindowProc()。

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

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

据我所知,当你的窗口收到来自菜单选择的命令信息后,你需要销毁菜单。 或者使用TrackPopUpMenuEx中的TPM_RETURNCMD标志,因为这会强制trackpopupex仅在选择菜单项(而不是立即)之后返回。

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

尝试:

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

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

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