HWND button = CreateWindowEx(0, "BUTTON", ...);
SetFocus(button); // Button no get focus! :(
另外,我的表单上还有其他控件,我可以将SetFocus()设置为。
谢谢,马丁
答案 0 :(得分:2)
自从我必须这样做以来,它已经永远,但是......
如果这是一个对话框,我会告诉你通过PostMessage()发送WM_NEXTDLGCTL。默认对话框项消息处理程序将负责设置键盘焦点和选择激活。但是,如果我正确阅读,这是一个不同的情况。您正在动态创建父窗口和子窗口。如果是这种情况,请将SetFocus()添加到父窗口,并通过将父窗口置于顶部来处理父窗口上的WM_SETFOCUS,然后将焦点设置在子窗口上。 WM_SETFOCUS和WM_KILLFOCUS旨在允许您切换控件的“激活”状态,并且大多数都为您处理(除非您的窗口是所有者绘制控件或某些此类)。但是在原始窗口中,当您的基本父窗口被发送焦点时,您需要适当地确保正确的孩子拥有它,如果您正在托管任何(将其视为管理您自己的“对话框”)。同样,通常这是由默认的对话框程序完成的,如果这是一个对话框,但是作为原始窗口,你有点不管自己管理它。
虽然我无法想象如何,但我希望这有所帮助。
答案 1 :(得分:0)
SetFocus是一个函数,而不是一个过程。将其作为函数调用并检查其返回值。重新调整的值为null,因为您在CreateWindowEx()调用中出错并且“button”不是有效句柄,或者它是与您的线程的消息队列无关的窗口,或者返回值不为null(现在是先前聚焦窗口的句柄)你确实有焦点(但不知何故无法检测到它)。
答案 2 :(得分:0)
尝试在按钮上设置WS_TABSTOP
样式。
答案 3 :(得分:0)
如果在响应WM_INITDIALOG消息时创建该按钮,则应返回FALSE以防止对话框过程更改焦点。