• <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>

            逛奔的蝸牛

            我不聰明,但我會很努力

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

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


            最近做項目遇到的問題,總結下。

            有時候我們覺得系統的標題欄和按鈕太丑太呆板,想做自己的標題欄以及最大化、最小化、關閉,菜單按鈕,我們就需要 

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

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

            1.自己對mouseMoveEvent,mousePressEvent,mouseReleaseEvent 等事件進行處理。

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


            我剛開始使用第一種方法去實現的。移動窗口很容易做,大家可以去看看這個大大寫的,比網上其他版本問題少些。

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

            在窗口邊緣按下鼠標拖動改變窗口大小就比較麻煩了。

            我是這樣做的:

            在mousePressEvent 按下設置m_bPressed為真。

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

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

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


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

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

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

            這里我們要重新實現winEvent ( MSG * message, long * result ) 

            該虛函數在QWidget和QWizard以及QSizeGrip以及他們的子類中都可以實現。

            如果你想停止Qt處理消息就返回true,并且設置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的消息響應函數會根據鼠標當前的坐標來判斷鼠標命中了窗口的哪個部位,消息響應函數的返回值指出了部位,例如它可能會返回HTCAPTION,或者HTCLIENT等。(其返回值有很多,請查閱MSDN)。

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

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

            頭文件申明:

            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實現

            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肯定比我們自己實現的效果要好多了。

            以上的18 以及 22 是我對程序的邊緣進行判斷的范圍。

            因為

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

            1. xPos > 18 && xPos < 22 其實就是我們假定的邊框了。  
            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 逛奔的蝸牛 閱讀(4156) 評論(0)  編輯 收藏 引用 所屬分類: Qt
            国产精品成人99久久久久| 精品无码久久久久久久动漫| 久久无码人妻精品一区二区三区| 久久久久久久综合综合狠狠| 国产日韩久久免费影院| A级毛片无码久久精品免费| 久久人人爽人人爽人人片AV麻烦| 青青草原1769久久免费播放| 久久久久一本毛久久久| 久久无码人妻一区二区三区| 国产精品免费久久久久影院| 亚洲狠狠婷婷综合久久久久| 97精品国产97久久久久久免费| 久久久久久久久久久精品尤物| 国产成人精品久久免费动漫| 久久综合九色综合网站| 国产精品久久久天天影视香蕉 | 亚洲乱码日产精品a级毛片久久| 久久亚洲AV成人无码国产| 色偷偷偷久久伊人大杳蕉| 久久久久国产| 一本久久a久久精品综合香蕉| 99久久国产热无码精品免费久久久久| 久久亚洲精品中文字幕| 99久久久精品免费观看国产| 性欧美丰满熟妇XXXX性久久久| 狠狠色狠狠色综合久久| 嫩草伊人久久精品少妇AV| 色欲久久久天天天综合网精品| 亚洲人成伊人成综合网久久久| 人妻无码αv中文字幕久久琪琪布| 狠狠色丁香久久婷婷综合| 久久精品aⅴ无码中文字字幕不卡| 久久久久亚洲AV无码专区体验| 国产成人久久精品区一区二区| 东京热TOKYO综合久久精品| 国产精品永久久久久久久久久| 亚洲色欲久久久久综合网| 久久精品夜夜夜夜夜久久| 欧美日韩中文字幕久久久不卡| 久久久久亚洲AV无码永不|