WS_CAPTION样式造成duilib程序标题栏按钮无法“隐藏”
duilib里面有个测试项目叫做TestApp。按照官方发布的“Duilib入门文档.doc”。用以下代码可以停止非客户区域的响应:
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { if( uMsg == WM_CREATE ) { //.... } else if( uMsg == WM_DESTROY ) { //... } else if( uMsg == WM_NCACTIVATE ) { if( !::IsIconic(m_hWnd) ) { return (wParam == 0) ? TRUE : FALSE; } } else if( uMsg == WM_NCCALCSIZE ) { return 0; } else if( uMsg == WM_NCPAINT ) { return 0; } //... }
可是再点击界面右上角的时候会把系统的标题栏按钮给弹出来,而且奇怪的是要点击按钮位置的靠左边20px才会出来。不知道为什么。
如上图,点击红色按钮的位置,最小化按钮就出来了。有个方法可以临时的解决此问题,就是响应WM_NCHITTEST消息,将系统按钮显示的区域表示为HTCAPTION而非HTCLIENT。
我编译了duilib的其他几个项目发现即便是没有HTCAPTION区域,系统按钮也照样不会弹出来。所以肯定另有蹊跷。果不其然,在HttpDownloader项目中发现如下代码:
LRESULT CMainDlg::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { LONG styleValue = ::GetWindowLong(*this, GWL_STYLE); styleValue &= ~WS_CAPTION; ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); //..... }
以上代码目的是去掉了WS_CAPTION属性。果然将以上代码贴到TestApp响应位置解决了此问题。系统按钮再也没有乱弹出来了。