使用对话框控件而不窃取焦点
Use dialog controls without stealing focus
我有一个无模式的CDialog,其中包含控件,一些CButtons和一个CScrollbar。CDialog 的父级来自一个编辑框,我希望始终保持专注。问题在于,每当用户使用控件、单击按钮或滚动条时,控件都会从编辑框中窃取焦点,从而导致父窗口在没有焦点的情况下绘制(灰显标题栏(,并导致控件采用所有键盘输入。有没有办法让控件响应鼠标操作但不窃取焦点?
控件和对话框都是使用 WS_CHILD 创建的。控件的父级位于对话框之外,对话框的父级位于编辑框之外。
我尝试在使用控件后重新设置焦点,但这会导致父窗口在失去焦点时闪烁,然后重新获得焦点。基本上,我想要一些类似于组合框的东西,可以在其中单击或拖动滚动条,但键盘输入仍然转到对话框本身,而不仅仅是滚动条,并且整个事情永远不会失去焦点。
没有做过这样的事情了,所以我确定有一百万个小细节,但我认为出发点是覆盖WM_MOUSEACTIVATE
的处理。
我对你描述的父母关系有点困惑。你能解释一下你的意思吗:CDialog 的父级来自一个编辑框,我想始终保持专注
托管工作区内其他窗口的任何窗口都是这些窗口的父窗口。如果没有其他窗口包含的WS_CHILD,则无法创建窗口。因此,所有对话框的控件都是此对话框的子控件。子窗口也可能承载另一个子窗口。
CDialog 只是对话框窗口的 MFC 表示形式;这同样适用于其他控件。例如,CButton 是一个 MFC 类,它包装预定义为窗口按钮控件的窗口句柄。
对话框永远不会有焦点,除非为空(没有任何控件(。如果对话框包含一个控件,则此控件始终具有焦点。
焦点的意思是任何给定的窗口接收鼠标和键盘消息。在任何给定时间,只有一个控件可以具有焦点。为了使滚动条处理鼠标单击或键盘移动滑块,滚动条必须具有焦点;因此,必须放弃其他一些控制。组合框下拉框(我认为这就是您所指的(不是对话框的子项。这是一个弹出窗口,在此期间具有键盘焦点并捕获鼠标。当它下拉时,对话框被停用,一旦下拉列表隐藏,对话框状态将更改回活动状态,因此焦点永远不会改变,它会返回到在停用对话框时具有焦点的控件。
您正在尝试做的事情可能是可能的,但它需要大量编码。可能钩子消息可以完成这项工作,但我认为它会与流背道而驰。
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 如何在对话框首次启动时禁用编辑控件的焦点?
- MFC 结束对话框崩溃时模式对话框没有焦点
- 将焦点设置在MFC视图中托管的无模式对话框上
- 使用对话框控件而不窃取焦点
- MFC:如何在一个函数中捕获对话框的每个控件的设置焦点
- Qt应用程序在使用文件打开对话框后将焦点切换到其他应用程序
- MFC 对话框在失去焦点时冻结
- 隐藏的对话框暂时占据焦点
- 实现不会从全屏应用程序中窃取焦点的通知对话框?
- 显示对话框后无法将焦点返回到主窗口
- 如何在 TabCtrl 内的子对话框中将焦点设置为 CEdit