1、窗口中的空间在鼠标移动时需要更改状态
2、窗口行为: 鼠标事件、窗口刷新、输出到屏幕
3、绘制行为: 控件状态、具体绘制
win32:
wndproc: 开发者实现, 默认的处理函数
rander: vui2lib
user:
1)mousemove/lbutton/rbutton 到 wndproc
2) 转换为event到vui2lib, vui2lib更改控件状态
3)wndproc 判断改变, 并刷新
4)event的后续处理, 如: 事件回调
1、窗口中的空间在鼠标移动时需要更改状态
2、窗口行为: 鼠标事件、窗口刷新、输出到屏幕
3、绘制行为: 控件状态、具体绘制
win32:
wndproc: 开发者实现, 默认的处理函数
rander: vui2lib
user:
1)mousemove/lbutton/rbutton 到 wndproc
2) 转换为event到vui2lib, vui2lib更改控件状态
3)wndproc 判断改变, 并刷新
4)event的后续处理, 如: 事件回调
在对话框中设置焦点时,只调用SetFocus是不够的.
在MSDN介绍DM_SETDEFID的文档中指出, 对默认ID的不当操作可能导致奇怪的情况, 例如在对护框中包含连个默认按钮. 幸运的是, 你很少改变对护框的默认按钮.
一个更大的问题是使用SetFocus函数来在对护框中设置焦点. 如果这么做, 那就是直接进入到窗口管理器, 而绕过了对话框管理器. 这就意味着将可能出现一些“不合理”的情况, 例如吧焦点放到一个按钮上, 而这个按钮不是默认按钮.
为了避免这个问题, 不要使用SetFocus来改变对话框上的焦点,而是使用WM_NEXTDLGCTL消息.
void SetDialogFocus(HWND HDlg, HWND hwndControl) { SendMessage(Hdlg, WM_NEXTDLGCTRL, (WPARAM)hwndControl, TRUE); }
为什么SetFocus不会管理默认的ID
windows对话框管理器是建立在窗口管理器之上的. 由于SetFocus是窗口管理器中的函数. 因此, 它不知道接收焦点的窗口是否是在某个对话框内.如果只是检查父窗口的窗口类是不是对话框, 还是不够的. 同样, 在前面已经看到了, 在应用程序中可以使用IsDialogMessage函数在窗口中支持键盘导航(使用键盘控制窗口), 而这些窗口看你根本就不是对话框. 窗口管理器不能只是发送DM_GETDEFID消息到拥有焦点窗口的父窗口, 因为DM_GETDEFID在数值上等于WM_USER, 而WM_USER在窗口类内部定义的消息范围之内. 如果父窗口不是对话框, 那么当我们向窗口发送WM_USER消息时, 结果是不可预知的.