VisualC++設(shè)計(jì)超強(qiáng)仿QQ自動(dòng)伸縮窗口(1)

字號(hào):

一、觀察
    模仿前最重要的一步就是觀察,經(jīng)過(guò)半天對(duì)QQ的擺弄和摸索,總結(jié)出了以下一些特點(diǎn):
    1、窗口開(kāi)始粘附時(shí),檢測(cè)的是鼠標(biāo)坐標(biāo)與桌面邊界的距離,特別地,粘附在下面的時(shí)候,檢測(cè)的是與任務(wù)欄的距離;
    2、在向上移動(dòng)窗口時(shí),窗口邊界永遠(yuǎn)不會(huì)超出桌面上面邊界;
    3、窗口是個(gè)TopMost風(fēng)格;
    4、當(dāng)窗口粘附在上面、左邊或右邊并顯示時(shí),你把鼠標(biāo)移動(dòng)到最頂端,光標(biāo)變成改變窗口大小的圖標(biāo),而單單是把窗口的top坐標(biāo)設(shè)置為0是不行的;
    5、粘附在下面的時(shí)候,當(dāng)處于移動(dòng)狀態(tài),那么窗口的底邊是與任務(wù)欄頂邊對(duì)齊的,但從隱藏到顯示的時(shí)候,窗口的底端是與屏幕底邊對(duì)齊的;
    6、隱藏后顯露出來(lái)的那條線(xiàn)可能是一個(gè)Border,但肯定的是絕不包含Client區(qū)域;
    7、關(guān)于響應(yīng)鼠標(biāo)的進(jìn)入與移出窗口,絕對(duì)不是WM_MOUSEMOVE、WM_MOUSELEAVE。證明:你以及其慢的速度接觸隱藏狀態(tài)的QQ邊界,你會(huì)發(fā)現(xiàn)幾乎是“一觸即發(fā)”,你又以及其慢的速度移出顯示狀態(tài)的QQ,你會(huì)發(fā)現(xiàn)它的收縮反而不是“一觸即發(fā)”的,而是離邊緣10象素左右。而WM_MOUSEMOVE,WM_MOUSELEAVE,只有在進(jìn)入、移出Client區(qū)域才響應(yīng),明顯和QQ不同,其實(shí)從第6點(diǎn)也可以知道;
    8、粘附在兩邊的時(shí)候,高度會(huì)調(diào)整為桌面上邊界到任務(wù)欄下邊界的距離;
    9、在“拖動(dòng)時(shí)顯示窗口內(nèi)容”模式下(桌面屬性-外觀-效果),粘附在兩邊的拖動(dòng)出來(lái)時(shí);如果收縮之前高度比收縮后小則回復(fù)原來(lái)高度,在非“拖動(dòng)時(shí)顯示窗口內(nèi)容”模式下,光柵會(huì)回復(fù)原來(lái)高度,但釋放左鍵時(shí),高度卻是收縮時(shí)調(diào)整后的高度,一開(kāi)始我以為這是個(gè)BUG,但我編寫(xiě)時(shí)同樣出現(xiàn)這個(gè)問(wèn)題,發(fā)現(xiàn)這兩種模式會(huì)影響WM_MOVING參數(shù)的意義;
    10、粘附在兩邊的時(shí)候當(dāng)你設(shè)置任務(wù)欄自動(dòng)隱藏,QQ窗口會(huì)自動(dòng)調(diào)整高度充滿(mǎn)屏幕高度;
    11、窗口顯示或隱藏不是一瞬間的,這點(diǎn)在第9點(diǎn)提到的兩種模式下,會(huì)有所不同;
    12、任務(wù)欄并不顯示QQ窗口;
    二、編寫(xiě)代碼
    觀察完畢,就開(kāi)始編寫(xiě)了。
    首先新建一個(gè)基于對(duì)話(huà)框的MFC程序,命名為QQHideWnd,在對(duì)話(huà)框?qū)傩缘膕tyles頁(yè)把border改為Resizing,你也可同時(shí)把Entended styles 的 tool window 鉤上,對(duì)于這點(diǎn)我在程序了動(dòng)態(tài)修改了。