标签 duilib 下的文章

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响应位置解决了此问题。系统按钮再也没有乱弹出来了。