• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會(huì)很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::

            From: http://blog.csdn.net/kfbyj/article/details/9284923


            最近做項(xiàng)目遇到的問題,總結(jié)下。

            有時(shí)候我們覺得系統(tǒng)的標(biāo)題欄和按鈕太丑太呆板,想做自己的標(biāo)題欄以及最大化、最小化、關(guān)閉,菜單按鈕,我們就需要 

            1. setWindowFlags(Qt::FramelessWindowHint);  
            但是這樣過后,我們就不能拖動(dòng)窗口改變位置,以及拖動(dòng)邊緣改變窗口大小了。

            有兩種方案處理這種情況:

            1.自己對(duì)mouseMoveEvent,mousePressEvent,mouseReleaseEvent 等事件進(jìn)行處理。

            2.Qt可以處理windows的消息。大家重新實(shí)現(xiàn)bool winEvent(MSG *message, long *result);(在此又一次感覺Qt的NB)


            我剛開始使用第一種方法去實(shí)現(xiàn)的。移動(dòng)窗口很容易做,大家可以去看看這個(gè)大大寫的,比網(wǎng)上其他版本問題少些。

            http://blog.csdn.net/aqtata/article/details/8902889

            在窗口邊緣按下鼠標(biāo)拖動(dòng)改變窗口大小就比較麻煩了。

            我是這樣做的:

            在mousePressEvent 按下設(shè)置m_bPressed為真。

            在mouseMoveEvent中m_bPressed為真且event->x() 在窗口邊緣 及處理算出鼠標(biāo)移動(dòng)的增量 然后不斷resize窗口。

            至于如何為邊緣的斷定,就自己設(shè)定一個(gè) 差值 假如 在窗口邊緣 ±4個(gè)px 就算在在該邊緣就處理該resize。

            這樣做缺點(diǎn)很多,1.拖快了不行,很容易超過該差值 , 2.窗口抖動(dòng)的厲害,一直在resize,3.要處理太多情況


            鑒于上訴缺點(diǎn)于是乎就到處問人百度google。有了第二種方法:

            第二種方法很好用,效果和有標(biāo)題邊框程序一樣~~~

            Qt居然可以處理windows消息。。

            這里我們要重新實(shí)現(xiàn)winEvent ( MSG * message, long * result ) 

            該虛函數(shù)在QWidget和QWizard以及QSizeGrip以及他們的子類中都可以實(shí)現(xiàn)。

            如果你想停止Qt處理消息就返回true,并且設(shè)置result到你想要保存的值返回給window處理。否者的話返回false。

            這里我們主要想處理WM_NCHITTEST消息。

            The WM_NCHITTEST message is sent to a window in order to determine what part of the window corresponds to a particular screen coordinate. This can happen, for example, when the cursor moves, when a mouse button is pressed or released, or in response to a call to a function such as WindowFromPoint. If the mouse is not captured, the message is sent to the window beneath the cursor. Otherwise, the message is sent to the window that has captured the mouse.

            A window receives this message through its WindowProc function. 

            WM_NCHITTEST的消息響應(yīng)函數(shù)會(huì)根據(jù)鼠標(biāo)當(dāng)前的坐標(biāo)來判斷鼠標(biāo)命中了窗口的哪個(gè)部位,消息響應(yīng)函數(shù)的返回值指出了部位,例如它可能會(huì)返回HTCAPTION,或者HTCLIENT等。(其返回值有很多,請查閱MSDN)。

            知道這個(gè)就好了,我們還是要判斷下鼠標(biāo)的位置,然后通過該位置保存到result給window處理。

            其實(shí)就是我們的程序沒有邊框不能發(fā)送這些消息,我們把它告訴windows,然后windows幫我們處理拖動(dòng),改變大小等效果。所以效果和有邊框有標(biāo)題程序效果一樣的。

            頭文件申明:

            1. class MainWindow : public QMainWindow  
            2. {  
            3.     Q_OBJECT  
            4. public:  
            5.     MainWindow(QWidget *parent = 0);  
            6.     ~MainWindow();  
            7.   
            8. protected:  
            9.     bool winEvent(MSG *message, long *result);  
            10. };  
            CPP實(shí)現(xiàn)

            1. bool MainWindow::winEvent(MSG *message, long *result)  
            2. {  
            3.     switch(message->message)  
            4.     {  
            5.     case WM_NCHITTEST:  
            6.         int xPos = GET_X_LPARAM(message->lParam) - this->frameGeometry().x();  
            7.         int yPos = GET_Y_LPARAM(message->lParam) - this->frameGeometry().y();  
            8.         if(this->childAt(xPos,yPos) == 0)  
            9.         {  
            10.             *result = HTCAPTION;  
            11.         }else{  
            12.             return false;  
            13.         }  
            14.         if(xPos > 18 && xPos < 22)  
            15.             *result = HTLEFT;  
            16.         if(xPos > (this->width() - 22) && xPos < (this->width() - 18))  
            17.             *result = HTRIGHT;  
            18.         if(yPos > 18 && yPos < 22)  
            19.             *result = HTTOP;  
            20.         if(yPos > (this->height() - 22) && yPos < (this->height() - 18))  
            21.             *result = HTBOTTOM;  
            22.         if(xPos > 18 && xPos < 22 && yPos > 18 && yPos < 22)  
            23.             *result = HTTOPLEFT;  
            24.         if(xPos > (this->width() - 22) && xPos < (this->width() - 18) && yPos > 18 && yPos < 22)  
            25.             *result = HTTOPRIGHT;  
            26.         if(xPos > 18 && xPos < 22 && yPos > (this->height() - 22) && yPos < (this->height() - 18))  
            27.             *result = HTBOTTOMLEFT;  
            28.         if(xPos > (this->width() - 22) && xPos < (this->width() - 18) && yPos > (this->height() - 22) && yPos < (this->height() - 18))  
            29.             *result = HTBOTTOMRIGHT;  
            30.   
            31.         return true;  
            32.     }  
            33.     return false;  
            34. }  

            把各種邊界情況保存到result給windows處理,我們就省去很多事情,我想windows肯定比我們自己實(shí)現(xiàn)的效果要好多了。

            以上的18 以及 22 是我對(duì)程序的邊緣進(jìn)行判斷的范圍。

            因?yàn)?/p>

            我做了邊框陰影。陰影邊框設(shè)定為20px所以在

            1. xPos > 18 && xPos < 22 其實(shí)就是我們假定的邊框了。  
            1.   
            @import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
            posted on 2013-07-11 19:45 逛奔的蝸牛 閱讀(4178) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Qt
            久久强奷乱码老熟女| 久久亚洲精品中文字幕| AA级片免费看视频久久| 久久九九全国免费| 国产综合免费精品久久久| 久久九九久精品国产免费直播| 老司机午夜网站国内精品久久久久久久久| www性久久久com| 国产精品热久久毛片| 亚洲а∨天堂久久精品| 久久亚洲欧美国产精品| 久久久久18| 久久精品国产影库免费看| 伊人色综合九久久天天蜜桃| 久久精品国产亚洲AV大全| 狠狠精品干练久久久无码中文字幕| 久久精品中文字幕大胸| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 韩国三级中文字幕hd久久精品 | 7777精品久久久大香线蕉| 99热成人精品免费久久| 亚洲国产精品久久久天堂| 久久综合九色综合欧美就去吻| 婷婷五月深深久久精品| 久久久久久免费视频| 色综合久久天天综合| 久久99亚洲网美利坚合众国| 超级97碰碰碰碰久久久久最新| 国产精品久久久久乳精品爆| 久久久久久九九99精品| 免费精品国产日韩热久久| 久久se这里只有精品| 欧美一区二区精品久久| 国产精品禁18久久久夂久| 亚洲精品乱码久久久久久蜜桃不卡 | 欧洲精品久久久av无码电影| 91麻豆国产精品91久久久| 久久受www免费人成_看片中文| 欧美国产成人久久精品| 久久电影网| 日批日出水久久亚洲精品tv|