使用对话框控件而不窃取焦点



我有一个无模式的CDialog,其中包含控件,一些CButtons和一个CScrollbar。CDialog 的父级来自一个编辑框,我希望始终保持专注。问题在于,每当用户使用控件、单击按钮或滚动条时,控件都会从编辑框中窃取焦点,从而导致父窗口在没有焦点的情况下绘制(灰显标题栏(,并导致控件采用所有键盘输入。有没有办法让控件响应鼠标操作但不窃取焦点?

控件和对话框都是使用 WS_CHILD 创建的。控件的父级位于对话框之外,对话框的父级位于编辑框之外。

我尝试在使用控件后重新设置焦点,但这会导致父窗口在失去焦点时闪烁,然后重新获得焦点。基本上,我想要一些类似于组合框的东西,可以在其中单击或拖动滚动条,但键盘输入仍然转到对话框本身,而不仅仅是滚动条,并且整个事情永远不会失去焦点。

我已经很久

没有做过这样的事情了,所以我确定有一百万个小细节,但我认为出发点是覆盖WM_MOUSEACTIVATE的处理。

我对你描述的父母关系有点困惑。你能解释一下你的意思吗:CDialog 的父级来自一个编辑框,我想始终保持专注

托管工作区内其他窗口的任何窗口都是这些窗口的父窗口。如果没有其他窗口包含的WS_CHILD,则无法创建窗口。因此,所有对话框的控件都是此对话框的子控件。子窗口也可能承载另一个子窗口。

CDialog 只是对话框窗口的 MFC 表示形式;这同样适用于其他控件。例如,CButton 是一个 MFC 类,它包装预定义为窗口按钮控件的窗口句柄。

对话框永远不会有焦点,除非为空(没有任何控件(。如果对话框包含一个控件,则此控件始终具有焦点。

焦点的意思是任何给定的窗口接收鼠标和键盘消息。在任何给定时间,只有一个控件可以具有焦点。为了使滚动条处理鼠标单击或键盘移动滑块,滚动条必须具有焦点;因此,必须放弃其他一些控制。组合框下拉框(我认为这就是您所指的(不是对话框的子项。这是一个弹出窗口,在此期间具有键盘焦点并捕获鼠标。当它下拉时,对话框被停用,一旦下拉列表隐藏,对话框状态将更改回活动状态,因此焦点永远不会改变,它会返回到在停用对话框时具有焦点的控件。

您正在尝试做的事情可能是可能的,但它需要大量编码。可能钩子消息可以完成这项工作,但我认为它会与流背道而驰。

最新更新