duilib進階教程 -- 改進窗口拖動 (12)

  現在大家應該都知道caption="0,0,0,32",是指示標題欄區了吧,如果想要整個窗口都能拖動呢? 那直接把高度改成和窗口一樣不就得了~O(∩_∩)O~

  嗯,這樣是可以,比如窗口高度是600,那么我們指定caption="0,0,0,600",這樣整個窗口就可以拖動了,但是如果窗口大小改變了呢?假如調整窗口的大小到800,這個時候最下面的200個像素的高度就不能拖動啦,因此這里進行一個改進,也是舉手之勞,在WindowImplBase::OnNcHitTest里的

  RECT rcCaption = m_PaintManager.GetCaptionRect(); 下面添加

    if (-1 == rcCaption.bottom){rcCaption.bottom = rcClient.bottom;}

  這樣只需要指定caption="0,0,0,-1",不管窗口大小如何變,都可以整個窗口拖動啦~

  不過問題又來了,當鼠標移到Slider、TreeView等控件上面時,可以發現這些控件都沒有響應啦。這是因為下面只判斷了ButtonUI、OptionUI、TextUI,所以我們需要排除掉其他控件,Slider好辦,加上SliderUI的判斷就OK了,TreeView控件就不能這么加啦,因為TreeView是由很多子控件組成的,很顯然,這里需要遍歷獲取到父窗口,判斷父窗口的類型。然而還有一個問題就是,改了SliderUI之后,可以發現還有ActiveX、Edit、List等一大波控件需要處理,就這樣直接加上十幾個判斷當然可以解決問題,但是如果后面又加了幾個控件呢? 這里不就得跟著改? 因此這里采用排除法,不管之后加一個還是十個控件,都不需要再改動這里。而TreeView控件的遍歷也是一樣,采用排除法,因此Alberl提供了一個函數IsInStaticControl用來判斷是否在靜態控件中,這里的靜態控件和MFC一樣,指的是Static、Text、Picture等文本控件。

  這時,我們只需將這段代碼

    RECT rcCaption = m_PaintManager.GetCaptionRect();if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) {CControlUI* pControl = static_cast<CControlUI*>(m_PaintManager.FindControl(pt));if( pControl && _tcsicmp(pControl->GetClass(), _T("ButtonUI")) != 0 && _tcsicmp(pControl->GetClass(), _T("OptionUI")) != 0 &&_tcsicmp(pControl->GetClass(), _T("TextUI")) != 0 )return HTCAPTION;}return HTCLIENT;

  換成這段代碼即可:

    // bottom為-1時,則整個窗口的高度都可以拖動RECT rcCaption = m_PaintManager.GetCaptionRect();if (-1 == rcCaption.bottom){rcCaption.bottom = rcClient.bottom;}if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) {CControlUI* pControl = m_PaintManager.FindControl(pt);if (IsInStaticControl(pControl)){return HTCAPTION;}}return HTCLIENT;

  

  

  IsInStaticControl函數的代碼如下:

// 包含頭文件#include <algorithm>
BOOL WindowImplBase::IsInStaticControl(CControlUI *pControl)
{BOOL bRet = FALSE;if (! pControl){return bRet;}CDuiString strClassName;std::vector<CDuiString> vctStaticName;strClassName = pControl->GetClass();strClassName.MakeLower();vctStaticName.push_back(_T("controlui"));vctStaticName.push_back(_T("textui"));vctStaticName.push_back(_T("labelui"));vctStaticName.push_back(_T("containerui"));vctStaticName.push_back(_T("horizontallayoutui"));vctStaticName.push_back(_T("verticallayoutui"));vctStaticName.push_back(_T("tablayoutui"));vctStaticName.push_back(_T("childlayoutui"));vctStaticName.push_back(_T("dialoglayoutui"));std::vector<CDuiString>::iterator it = std::find(vctStaticName.begin(), vctStaticName.end(), strClassName);if (vctStaticName.end() != it){CControlUI* pParent = pControl->GetParent();while (pParent){strClassName = pParent->GetClass();strClassName.MakeLower();it = std::find(vctStaticName.begin(), vctStaticName.end(), strClassName);if (vctStaticName.end() == it){return bRet;}pParent = pParent->GetParent();}bRet = TRUE;}return bRet;
}

  

  這樣不管大小怎么變,窗口都可以全屏拖動啦~O(∩_∩)O~



來自為知筆記(Wiz)



轉載于:https://www.cnblogs.com/Alberl/p/3404208.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273953.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python- 基礎 range方法的使用

1、第一種用法 index[1,2,0,5,9,8,10,6,4,7] for i in range(len(index)): print(index[i]) 結果&#xff1a; λ py test.py 1 2 0 5 9 8 10 6 4 7 2、第二種用法&#xff1a; index[1,2,0,5,9,8,10,6,4,7] for i in range(0,len(index),2): print(index[i]) 運…

Oracle行列轉換小結

目錄結構如下&#xff1a;行轉列列轉行[一]、行轉列 1.1、初始測試數據 表結構&#xff1a;TEST_TB_GRADE Sql代碼 create table TEST_TB_GRADE ( ID NUMBER(10) not null, USER_NAME VARCHAR2(20 CHAR), COURSE VARCHAR2(20 CHAR), SCORE FLOAT ) 初始…

python- 進階 與flask的搭配使用---定時任務框架APScheduler學習詳解

APScheduler簡介 在平常的工作中幾乎有一半的功能模塊都需要定時任務來推動&#xff0c;例如項目中有一個定時統計程序&#xff0c;定時爬出網站的URL程序&#xff0c;定時檢測釣魚網站的程序等等&#xff0c;都涉及到了關于定時任務的問題&#xff0c;第一時間想到的是利用ti…

Mingw下g++編譯執行順序錯誤

今天寫一個簡單的線性表時&#xff0c;用Mingw中的g編譯、調試、運行時發現一個奇怪的現象&#xff1a;程序的執行順序與實際編寫順序不一致。 編譯環境&#xff1a;代碼編寫 win7下 editplus Mingw 4.3.3 g 代碼片段如下&#xff1a; 1 //function: create a list 2 //ti…

python系統學習1-程序設計的基本方法

一、程序設計基本方法 計算機與程序設計 編譯和解釋 程序的基本編寫方法 計算機編程 1、計算機與程序設計 &#xff08;1&#xff09;、計算機是根據指令操作數據的設備 功能性&#xff1a;對數據的操作、表現為數據計算、輸出輸入處理和結果存儲。 可編程性&#xff1a;…

python 系統學習實例1.1 - 華氏度與攝氏度的轉換

# C ( F - 32 ) / 1.8???????????????????????????????????????????????????????????????????????????????? # F C * 1.8 32?????????????????????????????…

EMS問題

如果EMS啟動后在運行時報出 JMS error: "Not allowed to create destination這個錯誤&#xff0c;可能就是你啟動方式的問題了進入到EMS的安裝目錄的bin目錄下&#xff0c;運行tibemsca.bat那個文件就好使了。轉載于:https://www.cnblogs.com/xiaotianyu/p/3421737.html

python 系統學習實例1.2 - 人民幣與美元的轉換

# RMB USD / 6.78???????????????????????????????????????????????????????????????????????????????? # USD RMB* 6.78 def tempConvert(): t input("請輸入數值:") …

HDTV(1920x1080)碼率和視頻質量關系的研究 2 (實驗結果)

上一篇文章中介紹了實驗的準備工作&#xff0c; HDTV&#xff08;1920x1080&#xff09;碼率和視頻質量關系的研究 1 &#xff08;前期準備&#xff09; 本文介紹一下實驗的結果。 首先來看一下主觀評價的試驗結果&#xff1a; 從實驗結果來看&#xff0c;可以得出以下結論&…

python爬蟲--如何爬取翻頁url不變的網站

參考 https://blog.csdn.net/c350577169/article/details/80410133

POJ 1745 Divisibility DP

POJ:http://poj.org/problem?id1745 A完這題去買福鼎肉片&#xff0c;和舍友去買滴~舍友感慨“這一天可以賣好幾百份&#xff0c;每份就算賺一塊錢。。那么一個月。。一年。。。” 我說“那我們以后去賣這個吧&#xff0c;餓了還能自己煮著吃” 哈哈&#xff0c;一群天真的少…

NGUI如何創建自己的精靈圖集

說實話其實很簡單,但是在不知道的情況下真的不好弄啊. 1. 選擇你要制作精靈圖集的圖片,可以選擇多張 2. 提倡使用快捷鍵Alt Shift M 會有如下窗口彈出,也可以NGUI --> Open-->Atlas Maker打開 我們看到在Sprites里面就是我們選擇的要制作圖集的圖片 當在Replace后面的輸…

C++ - 進階 1002

This time, you are supposed to find AB where A and B are two polynomials. Input Specification: Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N?1?? a?N?1???? N?2??…

修改6S Fortran77 代碼,建立查找表

逐像元大氣校正&#xff0c;常預先計算查找表&#xff08;LUT&#xff0c;LookUp Tabel&#xff09;&#xff0c;6S大氣輻射傳輸模式也可以用來計算LUT。但6S源程序輸出信息多&#xff0c;且浮點數輸出精度低&#xff0c;不利于提取關鍵信息生成LUT&#xff0c;本文描述了怎樣修…

c++ 實例

#include "stdafx.h" #include <iostream> using namespace std; int main() { int a; a 4; cout<<a<<endl; return 0; }

VMware虛擬機與宿主無法復制的解決辦法

由于工作需要&#xff0c;上網機器使用虛擬機&#xff0c;因此需要經常來回的拷貝文件&#xff0c;而vmware從6.5一直走來到10.0.1&#xff0c;總是有一個問題很讓人苦惱---共享粘貼板總是會無故失效。經常實驗&#xff0c;發現可以經過以下方法臨時解決一下&#xff0c;雖然不…

c++ pat 乙級 --1001?害死人不償命的(3n+1)猜想

1001 害死人不償命的(3n1)猜想 &#xff08;15 分&#xff09; 卡拉茲(Callatz)猜想&#xff1a; 對任何一個正整數 n&#xff0c;如果它是偶數&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇數&#xff0c;那么把 (3n1) 砍掉一半。這樣一直反復砍下去&#xff0c;最后…

【開源項目之路】jquery的build問題

在剛開始clone了jquery到本地build的時候&#xff0c;就遇到了問題。 “ENORESTARGET No tag found that was able to satisfy ...” 提示為bower install失敗&#xff0c;反復查找原因&#xff0c;最后在這兒看到同樣類似的問題&#xff0c;貌似是git協議的連接問題&#xff0…

適配ios7

if ([self respondsToSelector:selector(edgesForExtendedLayout)]){self.edgesForExtendedLayout UIRectEdgeNone;self.extendedLayoutIncludesOpaqueBars NO;self.modalPresentationCapturesStatusBarAppearance NO;} 轉載于:https://www.cnblogs.com/jiackyan/p/3441378.…

c++ pat 乙級 -------1002 讀入一個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。

1002 寫出這個數 &#xff08;20 分&#xff09; 讀入一個正整數 n&#xff0c;計算其各位數字之和&#xff0c;用漢語拼音寫出和的每一位數字。 輸入格式&#xff1a; 每個測試輸入包含 1 個測試用例&#xff0c;即給出自然數 n 的值。這里保證 n 小于 10?100??。 輸出…