C++ 空Win32弹出菜单
我试图在我的应用程序中创建一个动态弹出菜单,我使用的生成代码如下:C++ 空Win32弹出菜单,c++,c,windows,winapi,contextmenu,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") );
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 );
\u TEXT
用于确保文本为Unicode格式,而receivingWindow
是以前创建的分层窗口,工作正常
调用TrackPopupMenuEx
时,菜单将以良好的大小和位置显示,但弹出菜单中绝对不会显示任何文本。有人知道为什么,以及如何解决这个问题吗
编辑:有关我的环境的更多信息:
- Windows 7 x64
- VisualStudio2008中的x86内部版本
EDIT2:我在Windows XP x86上测试过同样的功能,它工作起来很有魅力,经过进一步测试,菜单在Windows 7 x64中以经典的外观显示得很好。如果您的编译器未设置为unicode编译(即#ifndef unicode)然后winuser.h将AppendMenu映射到AppendMenuA,AppendMenuA是非unicode版本,并将字符串解释为多字节。也许这就解释了你的问题?
您可以显式调用AppendMenuW()(unicode版本)来检查这是否是您的问题。我认为问题在于函数TrackPopUpMenuEx不会立即返回;因此,在它启动后(可能会选择它的大小和位置),但在它第一次显示之前,您正在破坏菜单
据我所知,在您的窗口收到来自菜单选择的命令消息后,您需要销毁菜单。或者在TrackPopUpMenuEx中使用TPM_RETURNCMD标志,因为这会强制trackpopupex仅在选择菜单项后返回(而不是立即返回)。我找到了解决此问题的方法。我没有使用我的主窗口(
receivingWindow
),而是使用一个只显示消息的窗口来接收事件。出于我不理解的原因,文本通常以这种方式显示。确保对未以其他方式处理的消息调用::DefWindowProc()。我在TrackPopupMenu()中也遇到了类似的问题,在TrackPopupMenu()中,菜单将以正确的大小弹出并允许选择项目,但项目上没有文本,因为代码忽略了一些消息,而没有调用::DefWindowProc()。请尝试:
call GetSubMenu,mnu,0
call TrackPopupMenu,eax,TPM_CENTERALIGN or TPM_BOTTOMALIGN,cposx,cposy,0,MainhWnd,0
在我的例子中,我使用“CreateMenu”创建了菜单,但我必须使用“CreatePopupMenu”将其与TrackPopupMenuEx一起使用
如果菜单是在资源编辑器中创建的,请检查是否设置了该标志。遗憾的是,UNICODE已经定义,AppendMenuW调用得很好。_TEXT()还受到UNICODE define的存在或缺乏的影响。如果未定义UNICODE,则AppendMenu()将映射到AppendMenuA(),但_text()中的文本也将映射到Ansi而不是UNICODE。所以这里没有冲突。当我在菜单上放置断点时,它只有在我单击菜单中的任何空白项后才会中断。我再次看到菜单,文本是不可见的:(您没有在TrackPopupMenuEx()的fuFlags参数中设置任何值。请尝试指定一些对齐和鼠标选项。这可能有助于它更好地决定如何操作。即使使用fuFlags,也没有显示文本。对她没有帮助:-(