VisualC++設計超強仿QQ自動伸縮窗口(1)

字號:

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