1

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

控件和对话框都是用 WS_CHILD 创建的。控件是对话框的父级,对话框是编辑框的父级。

我尝试在使用控件后重新设置焦点,但这会导致父窗口在丢失然后重新获得焦点时闪烁。基本上我想要一个像组合框一样工作的东西,可以点击或拖动滚动条,但键盘输入仍然进入对话框本身,而不仅仅是滚动条​​,整个事情永远不会失去焦点。

4

2 回答 2

1

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

于 2012-05-04T18:06:50.617 回答
1

我对你描述的亲子关系有点困惑。你能解释一下你的意思是什么: CDialog 是一个编辑框的父级,我想一直保持焦点

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

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

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

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

您尝试做的事情可能是可能的,但它需要大量的编码。可能挂钩消息可以完成这项工作,但我认为它会违背流程。

于 2012-05-04T21:46:18.083 回答