熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Visual C++設計超強仿QQ自動伸縮窗口[1]

2013-11-13 11:10:23  來源: .NET編程 

  觀察

  模仿前最重要的一步就是觀察經過半天對QQ的擺弄和摸索總結出了以下一些特點

  窗口開始粘附時檢測的是鼠標坐標與桌面邊界的距離特別地粘附在下面的時候檢測的是與任務欄的距離

  在向上移動窗口時窗口邊界永遠不會超出桌面上面邊界

  窗口是個TopMost風格

  當窗口粘附在上面左邊或右邊並顯示時你把鼠標移動到最頂端光標變成改變窗口大小的圖標而單單是把窗口的top坐標設置為是不行的

  粘附在下面的時候當處於移動狀態那麼窗口的底邊是與任務欄頂邊對齊的但從隱藏到顯示的時候窗口的底端是與屏幕底邊對齊的

  隱藏後顯露出來的那條線可能是一個Border但肯定的是絕不包含Client區域

  關於響應鼠標的進入與移出窗口絕對不是WM_MOUSEMOVEWM_MOUSELEAVE證明你以及其慢的速度接觸隱藏狀態的QQ邊界你會發現幾乎是一觸即發你又以及其慢的速度移出顯示狀態的QQ你會發現它的收縮反而不是一觸即發而是離邊緣象素左右而WM_MOUSEMOVEWM_MOUSELEAVE只有在進入移出Client區域才響應明顯和QQ不同其實從第點也可以知道

  粘附在兩邊的時候高度會調整為桌面上邊界到任務欄下邊界的距離

  拖動時顯示窗口內容模式下(桌面屬性-外觀-效果)粘附在兩邊的拖動出來時如果收縮之前高度比收縮後小則回復原來高度在非拖動時顯示窗口內容模式下光柵會回復原來高度但釋放左鍵時高度卻是收縮時調整後的高度一開始我以為這是個BUG但我編寫時同樣出現這個問題發現這兩種模式會影響WM_MOVING參數的意義

  粘附在兩邊的時候當你設置任務欄自動隱藏QQ窗口會自動調整高度充滿屏幕高度

  窗口顯示或隱藏不是一瞬間的這點在第點提到的兩種模式下會有所不同

  任務欄並不顯示QQ窗口

  編寫代碼

  觀察完畢就開始編寫了

  首先新建一個基於對話框的MFC程序命名為QQHideWnd在對話框屬性的styles頁把border改為Resizing你也可同時把Entended styles 的 tool window 鉤上對於這點我在程序了動態修改了

  在QQHideWndDlgh頭文件添加以下成員函數

  protected

//修正移動時窗口的大小
void FixMoving(UINT fwSide LPRECT pRect);
//從收縮狀態顯示窗口
void DoShow();
//從顯示狀態收縮窗口
void DoHide();
//重載函數只是為了方便調用實際調用CWnd的SetWindowPos(…)
BOOL SetWindowPos(const CWnd* pWndInsertAfterLPCRECT pCRect
  UINT nFlags = SWP_SHOWWINDOW);

  繼續添加成員變量

private::BOOL m_isSizeChanged;//窗口大小是否改變了
BOOL m_isSetTimer;//是否設置了檢測鼠標的Timer
INTm_oldWndHeight;//舊的窗口寬度INTm_taskBarHeight;
  //任務欄高度INTm_edgeHeight;//邊緣高度
INTm_edgeWidth;//邊緣寬度
INTm_hideMode;//隱藏模式
BOOL m_hsFinished;//隱藏或顯示過程是否完成
BOOL m_hiding;//該參數只有在!m_hsFinished才有效
//真:正在隱藏假:正在顯示

  增加消息響應需要注意的是有些消息你只有把右下角的 Filter for message設置為window才能看到

WM_ NCHITTEST
WM_MOVING
WM_CREATE
WM_TIMER

  然後來到對應的cpp文件在頭部定義一些宏

//收縮模式#define HM_NONE//不收縮
#define HM_TOP//向上收縮
#define HM_BOTTOM//向下收縮
#define HM_LEFT//向左收縮
#define HM_RIGHT//向右收縮
#define CM_ELAPSE //檢測鼠標是否離開窗口的時間間隔
#define HS_ELAPSE//伸縮過程每步的時間間隔
#define HS_STEPS//伸縮過程分成多少步完成
#define INTERVAL//觸發粘附時鼠標與屏幕邊界的最小間隔單位為象素
#define INFALTE//觸發收縮時鼠標與窗口邊界的最小間隔單位為象素

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15314.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.