我有一个带有控件的普通窗口。其中一些是所有者吸引的。我发现创建控件时需要初始化状态。
SendMessage(m_hWnd, WM_UPDATEUISTATE, MAKEDWORDHL(0, UIS_INITIALIZE), 0);
SendMessage(m_hWnd, WM_UPDATEUISTATE, MAKEDWORDHL(UISF_HIDEFOCUS, UIS_SET), 0);
我在UIS_INITIALIZE的高位单词中使用0的原因是,这就是Raymond通过Who sends the initial WM_UPDATEUISTATE message?
所拥有的我通过以下方法管理控件子类中的状态:
case WM_KILLFOCUS:
SendMessage(hwnd, WM_UPDATEUISTATE, MAKEDWORDHL(UISF_HIDEFOCUS, UIS_SET), 0);
break;
case WM_SETFOCUS:
SendMessage(hwnd, WM_UPDATEUISTATE, MAKEDWORDHL(UISF_HIDEFOCUS, UIS_CLEAR), 0);
break;
使用WM_CHANGEUISTATE
的效果不佳,因此被WM_UPDATEUISTATE
困住了
在WM_DRAWITEM
期间,我检查状态,如果没有隐藏焦点,则检查DrawFocusRect()
。
现在是问题。当我隐藏窗口的控件然后再次显示它们时,所有状态均为0,因此所有控件最终在它们周围都有一个焦点矩形。我可以重设WM_SHOWWINDOW
上的所有内容,但似乎有点笨拙。
当使用普通窗口而不是对话框(而不使用IsDialogMsg()
)时,是否存在适当的方法来处理状态。特别是ShowWindow()
会改变状态吗?