使用对话框控件而不偷窃焦点
我有一个无模式的CDialog,它包含控件,一些CButtons和一个CScrollbar。 CDialog是一个我希望始终关注的编辑框。 问题是,无论何时用户使用控件,单击按钮或滚动条上,控件都会从编辑框中窃取焦点,导致父窗口不带焦点地绘制(灰色标题栏),并导致控件采取所有的键盘输入。 有没有一种方法可以让控件响应鼠标操作而不是窃取焦点?
控件和对话框都是用WS_CHILD创建的。 这些控件是对话框的父对象,并且该对话框是编辑框的父对象。
在使用控件之后,我试着重新设置焦点,但是这会导致父窗口闪烁,然后重新获得焦点。 基本上我想要一个像组合框一样的东西,其中滚动条可以被点击或拖动,但键盘输入仍然会进入对话框本身,而不仅仅是滚动条,整个事情从不会失去焦点。
我很长一段时间没做过这样的事情,所以我确信有一百万个小细节,但我认为首先是重写WM_MOUSEACTIVATE
的处理。
我对你所描述的孩子 - 父母关系有点困惑。 你能解释一下你是什么意思:CDialog是一个编辑框,我希望始终关注它
托管客户区域内其他窗口的任何窗口都是这些窗口的父窗口。 如果没有其他窗口包含的WS_CHILD,则无法创建窗口。 因此,所有对话框的控件都是该对话框的子对象。 子窗口也可能托管另一个子窗口。
CDialog只是一个对话窗口的MFC表示; 这同样适用于其他控件。 例如,CButton是一个MFC类,它封装了预定义为窗口按钮控件的窗口句柄。
除非是空的,否则Dialog从不具有焦点(不具有任何控件)。 如果对话框甚至包含一个控件,则此控件始终具有焦点。
重点在于任何给定的窗口都会收到鼠标和键盘消息。 在任何给定时间只有一个控件可以有焦点。 为了滚动条处理鼠标点击或键盘来移动滑块,滚动条必须有焦点; 因此其他一些控制必须放弃。 组合框下拉框(我认为这是你所指的)不是对话框的孩子。 这是一个弹出窗口,持续时间有键盘焦点和捕捉鼠标。 当它下降时,对话框被禁用,并且一旦下拉框隐藏,对话框状态将变回激活,因此焦点不会改变,它将返回到停用对话框时焦点所在的控件。
你试图做的可能是可能的,但它需要大量的编码。 可能挂钩的信息可以完成这项工作,但我认为这将会违规。
链接地址: http://www.djcxy.com/p/6683.html