在VS2008中使用C ++,我正处于DirectX程序的开端,该程序到目前为止可以显示令牌图像并在全屏和窗口模式之间切换而没有任何问题。
它有一个菜单栏,在全屏模式下按预期不可见。 ALT键仍然可以全屏激活此菜单,但它非常笨拙,因为它的项目在突出显示之前是不可见的,即便如此,它只响应了大约五分之一的ALT键按下。
所以我决定实现一个弹出菜单,它响应鼠标右键。我的问题是这个弹出菜单在全屏模式下也很不稳定。它还可以使用我正在使用的自定义光标。
错误的行为定义如下:
1·右键单击任意位置将激活弹出菜单,但也会取消激活自定义光标并将其替换为系统默认值。
2·菜单可见后,右键单击菜单会使其无效,但这会使默认光标保持打开状态。但是,再次右键单击将再次激活菜单,如果没有丢失的自定义光标,这将继续完美。
3·菜单可见后,在菜单外单击左键将取消激活,这将再次显示自定义光标。现在它变得更加凌乱,因为现在:
3a·如果我右键单击,它将返回步骤1.菜单上+光标关闭。
3b·如果我再次左键单击(好像我正在获得焦点或其他东西),然后右键单击,将激活默认光标但不激活菜单(就好像我一半做了一半没有重新获得焦点或其他东西)。菜单关闭+光标关闭。
3c·如果我移动鼠标然后右键单击,它将执行以上操作之一。步骤1或步骤3b。菜单开关+光标关闭,或菜单关闭+光标关闭。令人沮丧。
4·最明显的是,如果发生步骤3b(菜单关闭+光标关闭),用户可以永久地打开和关闭自定义光标。左键单击,右键单击。菜单不仅不会出现,而且这根本不是我希望用户在我的程序中看到的...光标无缘无故地改变。
我认为光标的变化与菜单本身的焦点或类似之处有关。我希望尽可能避免这种情况,但真正的问题是为什么菜单首先激活气质?
弹出菜单的代码是:
case WM_RBUTTONDOWN:
cout << "Right button in fullscreen" << endl;
TrackPopupMenu(GetSubMenu(g_menu,0), TPM_LEFTALIGN|TPM_HORPOSANIMATION,
30, 30, 0, g_parentWindow, NULL);
// SetActiveWindow(g_parentWindow); // Makes no difference.
// SetForegroundWindow(g_parentWindow); // Makes no difference.
break;
还有一件事。如果我使用 F3 来激活菜单,绝对没有任何反应。
问题1:我可以让菜单可靠地激活吗?
问题2:我可以阻止光标改变吗?
问题3:为什么键命令不起作用?
感谢您的阅读。有什么想法吗?
答案 0 :(得分:0)
您可以使用此小功能将光标设置回自定义光标SetCursor(CURSOR_ID);
,您可以在WM_RBUTTONDOWN