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

时间:2012-05-04 16:48:37

标签: c++ user-controls mfc dialog focus

我有一个无模式的CDialog,它包含控件,一些CButtons和一个CScrollbar。 CDialog是一个编辑框的父级,我希望它始终保持专注。问题是,无论何时用户使用控件,单击按钮或滚动条,控件都会从编辑框中窃取焦点,导致父窗口无需焦点绘制(灰色标题栏),并导致控件拿所有键盘输入。有没有办法让控件响应鼠标操作但不能窃取焦点?

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

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

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

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