2
HWND button = CreateWindowEx(0, "BUTTON", ...);
SetFocus(button); // Button no get focus! :(

此外,我的表单上还有其他控件,我可以 SetFocus() 到。

谢谢,马丁

4

4 回答 4

3

自从我不得不这样做以来,它已经永远了,但是......

如果这是一个对话框,我会告诉你通过 PostMessage() 发送一个 WM_NEXTDLGCTL。默认的对话框项消息处理程序会为您设置键盘焦点和选择激活来处理其余的事情。但是,如果我正确阅读,情况就不同了。您正在动态创建父窗口和子窗口。如果是这种情况,则将 SetFocus() 设置为父窗口,并通过将父窗口置于顶部来处理父窗口上的 WM_SETFOCUS,然后将焦点设置在子窗口上。WM_SETFOCUS 和 WM_KILLFOCUS 旨在允许您切换控件的“激活”状态,并且大多数会为您处理它(除非您的窗口是所有者绘制控件或类似的)。但是在原始窗口中,当您的基本父窗口被发送焦点时,您需要适当地确保正确的子窗口拥有它,如果您 重新托管任何(将其视为管理您自己的“对话”)。同样,如果这是一个对话框,通常这是由默认的对话框过程为您完成的,但是作为原始窗口,您有点难以自己管理它。

虽然我无法想象如何,但我希望这有所帮助。

于 2012-07-16T06:55:54.877 回答
0

SetFocus 是一个函数,而不是一个过程。将其作为函数调用并检查其返回值。重新调整的值为 null,因为您在 CreateWindowEx() 调用中出错并且“按钮”不是有效的句柄,或者它是一个与您的线程的消息队列没有关联的窗口,或者返回值不为 null(它现在是先前聚焦窗口的句柄)并且您确实拥有焦点(但不知何故未能检测到它)。

于 2010-08-12T00:09:11.133 回答
0

如果您创建该按钮以响应 WM_INITDIALOG 消息,则应返回 FALSE 以防止对话框过程更改焦点。

于 2010-08-12T07:57:27.480 回答
0

尝试WS_TABSTOP在按钮上设置样式。

于 2010-08-12T00:44:58.770 回答