【发布时间】:2011-12-15 11:12:06
【问题描述】:
我正在尝试为 C++ 应用程序运行 GUI,但我遇到了按键事件问题。基本上,只要我不点击任何按钮(主窗口注册关键事件),一切正常,但只要我点击一个按钮,主窗口就会失去焦点并且不再捕获关键事件。这可能是一个愚蠢的问题,但我对 C++ 很陌生。这是我正在使用的一些代码:
主窗口的创建:
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Application Name", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
540, /* The programs width */
250, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
创建其中一个按钮:
CreateWindow(TEXT("button"), TEXT("Start"),
WS_VISIBLE | WS_CHILD,
x, y, width, height,
hwnd, (HMENU) 6, NULL, NULL);
我还注意到,每当我单击按钮时,都会触发 WM_KILLFOCUS 事件,这就是为什么我认为这是一个焦点问题。我也尝试过捕获 WM_KILLFOCUS 事件,然后使用 SetActiveWindow 再次设置焦点,但这会使我的程序崩溃。
任何帮助将不胜感激:)
【问题讨论】:
-
按钮是主窗口的一部分,那么谁获得焦点?或者你是在创建一个带有按钮的对话框,当你在对话框中按下一个按钮时,对话框就会获得焦点?
-
我只有一个带有按钮的主窗口。我在提供的代码中创建窗口和按钮,我不创建任何对话框。我不知道谁获得焦点,因为每个按钮看起来都是一个窗口,我假设一旦我点击按钮,按钮就会获得焦点。
-
我无法理解:(HMENU) 6 为什么需要它?
-
这将允许我确定在 WindowProcedure 函数中按下了哪个按钮。我尝试只传入 6,但这会导致以下错误:从 'int' 到 'HMENU__'| 的无效转换错误:初始化 'HWND__ 的参数 10 CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, int, int, int, int, HWND__, HMENU__, HINSTANCE__,无效)'|