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

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

2013-11-13 11:10:22  來源: .NET編程 
    然後在構造函數初始化成員變量

m_isSizeChanged = FALSE;
m_isSetTimer = FALSE;m_hsFinished = TRUE;
m_hiding = FALSE;m_oldWndHeight = MINCY;
m_taskBarHeight = ;
m_edgeHeight = ;
m_edgeWidth=;
m_hideMode = HM_NONE;

  完成了一些初始的工作那麼就開始進入關鍵的函數實現了首先是在OnCreate做些窗口的初始化和獲得一些系統信息

  代碼一

int CQQHideWndDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == )
return ;
// TODO: Add your specialized creation code here

//獲得任務欄高度
CWnd* p;
p = this>FindWindow(Shell_TrayWndNULL);
if(p != NULL)
{
CRect tRect;
p>GetWindowRect(tRect);
m_taskBarHeight = tRectHeight();
}

//修改風格使得他不在任務欄顯示
ModifyStyleEx(WS_EX_APPWINDOW WS_EX_TOOLWINDOW);
//去掉關閉按鍵(如果想畫個按鍵的話)
//ModifyStyle(WS_SYSMENUNULL);

//獲得邊緣高度和寬度
m_edgeHeight = GetSystemMetrics(SM_CYEDGE);
m_edgeWidth = GetSystemMetrics(SM_CXFRAME);

return ;
}

  接著如何知道鼠標進入或移出窗口呢?在前面我已經證明了WM_MOUSEMOVE和WM_MOUSELEAVE不符合我們的要求於是我用了WM_ NCHITTEST這個消息你可以看到我在這個消息響應函數中用了兩個SetTimer一個用於檢測鼠標是否離開一個用於伸縮過程不管你喜歡不喜歡要達到第點和第這個是必須的考慮的效率問題在不需要的時候關閉這些Timer就好了

  代碼二

UINT CQQHideWndDlg::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
strFormat(Mouse (%d%d)pointxpointy);
GetDlgItem(IDC_CURSOR)>SetWindowText(str);
if(m_hideMode != HM_NONE && !m_isSetTimer &&
//防止鼠標超出屏幕右邊時向右邊收縮造成閃爍
pointx < GetSystemMetrics(SM_CXSCREEN) + INFALTE)
{ //鼠標進入時如果是從收縮狀態到顯示狀態則開啟Timer
SetTimer(CM_ELAPSENULL);
m_isSetTimer = TRUE;
m_hsFinished = FALSE;
m_hiding = FALSE;
SetTimer(HS_ELAPSENULL); //開啟顯示過程
}
return CDialog::OnNcHitTest(point);
}

  然後在OnTimer中

  代碼三

void CQQHideWndDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent == )
{
POINT curPos;
GetCursorPos(&curPos);
CString str;
strFormat(Timer On(%d%d)curPosxcurPosy);
GetDlgItem(IDC_TIMER)>SetWindowText(str);

CRect tRect;
//獲取此時窗口大小
GetWindowRect(tRect);
//膨脹tRect以達到鼠標離開窗口邊沿一定距離才觸發事件
tRectInflateRect(INFALTEINFALTE);

if(!tRectPtInRect(curPos)) //如果鼠標離開了這個區域
{
KillTimer(); //關閉檢測鼠標Timer
m_isSetTimer = FALSE;
GetDlgItem(IDC_TIMER)>SetWindowText(Timer Off);

m_hsFinished = FALSE;
m_hiding = TRUE;
SetTimer(HS_ELAPSENULL); //開啟收縮過程
}
}

if(nIDEvent == )
{
if(m_hsFinished) //如果收縮或顯示過程完畢則關閉Timer
KillTimer();
else
m_hiding ? DoHide() : DoShow();
}
CDialog::OnTimer(nIDEvent);
}

  暫時不管OnTimer中的DoHide(); DoShow();

  先來看看核心的函數之一的 FixMoving該函數在OnMoving中被調用FixMoving通過檢測鼠標位置和窗口位置來決定窗口的收縮模式並修正粘附邊界時窗口的位置從而達到像移動QQ時出現的效果

[]  []  []  []  


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