DuiLib学习笔记5——标题栏不能正常隐藏问题
我之前代碼都是照著官方那個Duilib入門文檔.doc來學習的。但是遇到一個問題,雖然他隱藏了windows的自帶標題欄,可以自己繪畫一個標題欄了,但是在這個標題欄下方,用力亂戳,就可能把系統自帶的,最小化,最大化,關閉按鈕戳出來。如下圖:
我問了群里的朋友,都說可能是WM_NCHITTEST的問題。于是我去handle里多加了一個if判斷
else if( uMsg == WM_NCHITTEST) {return 0; }結果雖然解決了問題,但是我自己的按鈕都失效了。通過debug發現,只要鼠標進入我們程序界面,就會觸發WM_NCHITTEST。所以return掉太暴力了。
后來在一個博客里發現了一個解決方案http://tunps.com/ws_caption-cause-duilib-program-title-bar-cannot-hide
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);//..... }我試著去寫了個OnCreate無效。后來把代碼試著改了下,在創建窗體后,就對窗體進行set,生效了。
官方教程里的創建代碼如下:
CFrameWindowWnd* pFrame = new CFrameWindowWnd();if( pFrame == NULL ) return 0;pFrame->Create(NULL, _T("測試"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);pFrame->ShowWindow(true);我改了一下改成這樣:
CFrameWindowWnd* pFrame = new CFrameWindowWnd();
if( pFrame == NULL ) return 0;
pFrame->Create(NULL, _T("測試"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
LONG styleValue = ::GetWindowLong(*pFrame, GWL_STYLE);
styleValue &= ~WS_CAPTION;
::SetWindowLong(*pFrame, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
pFrame->CenterWindow();
pFrame->ShowWindow(true);
運行后,果然一切正常了。在此代碼基礎上,我覺得既然是set,那么原來create的時候就應該可以控制這兩個參數。跟上面create代碼一對比,我就做了一個嘗試,把這兩個屬性替換掉,改成如下:
CFrameWindowWnd* pFrame = new CFrameWindowWnd();
if( pFrame == NULL ) return 0;
pFrame->Create(NULL, _T("測試"), WS_CLIPSIBLINGS, WS_CLIPCHILDREN);
pFrame->CenterWindow();
pFrame->ShowWindow(true);
官方文檔創建時的參數是UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE把他們換成WS_CLIPSIBLINGS, WS_CLIPCHILDREN就可以了
運行后一切正常,很努力的戳也戳不出那些隱藏按鈕了。
由于整個沒有官方文檔,本人也不太可能去慢慢閱讀源碼,所以這樣的代碼試出來的,多少以后可能存在隱患。群里很多朋友都是靠讀官方的demo,看其他朋友寫的demo來學習的,的確沒有其他快捷有效途徑,但是現在就只能先這樣了。
?
轉載于:https://www.cnblogs.com/duguxue/p/3818243.html
總結
以上是生活随笔為你收集整理的DuiLib学习笔记5——标题栏不能正常隐藏问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVa 10420 List of Co
- 下一篇: Android Activity初探