Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 空Win32弹出菜单_C++_C_Windows_Winapi_Contextmenu - Fatal编程技术网

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,也没有显示文本。对她没有帮助:-(