代碼四
void CQQHideWndDlg::FixMoving(UINT fwSide, LPRECT pRect){POINT curPos;GetCursorPos(&curPos);INT screenHeight = GetSystemMetrics(SM_CYSCREEN);INT screenWidth = GetSystemMetrics(SM_CXSCREEN);INT height = pRect->bottom - pRect->top;INT width = pRect->right - pRect->left;if (curPos.y <= INTERVAL){ //粘附在上邊pRect->bottom = height - m_edgeHeight;pRect->top = -m_edgeHeight;m_hideMode = HM_;}else if(curPos.y >= (screenHeight - INTERVAL - m_taskBarHeight)){ //粘附在下邊pRect->top = screenHeight - m_taskBarHeight - height;pRect->bottom = screenHeight - m_taskBarHeight;m_hideMode = HM_BOTTOM;}else if (curPos.x < INTERVAL){ //粘附在左邊 if(!m_isSizeChanged){CRect tRect;GetWindowRect(tRect);m_oldWndHeight = tRect.Height(); }pRect->right = width;pRect->left = 0;pRect->top = -m_edgeHeight;pRect->bottom = screenHeight - m_taskBarHeight;m_isSizeChanged = TRUE;m_hideMode = HM_LEFT;}else if(curPos.x >= (screenWidth - INTERVAL)){ //粘附在右邊if(!m_isSizeChanged){CRect tRect;GetWindowRect(tRect);m_oldWndHeight = tRect.Height(); }pRect->left = screenWidth - width;pRect->right = screenWidth;pRect->top = -m_edgeHeight;pRect->bottom = screenHeight - m_taskBarHeight;m_isSizeChanged = TRUE;m_hideMode = HM_RIGHT;}else{ //不粘附if(m_isSizeChanged){ //如果收縮到兩邊,則拖出來后會(huì)變回原來大小//在"拖動(dòng)不顯示窗口內(nèi)容下"只有光柵變回原來大小pRect->bottom = pRect->top + m_oldWndHeight;m_isSizeChanged = FALSE;}if(m_isSetTimer){ //如果Timer開啟了,則關(guān)閉之if(KillTimer(1) == 1)m_isSetTimer = FALSE;}m_hideMode = HM_NONE;GetDlgItem(IDC_TIMER)->SetWindowText("Timer off");}}
收縮模式和位置決定后,剩下的工作就由最后兩個(gè)核心函數(shù)完成了:實(shí)現(xiàn)收縮的DoHide(),實(shí)現(xiàn)伸展的DoShow()。在這兩個(gè)過程中m_hsFinished,m_hiding 這兩個(gè)變量起到很重要的控制作用。由于伸縮過程沒完成時(shí),hsFinished始終為FALSE,所以Timer 2 不會(huì)關(guān)閉,于是在OnTimer中會(huì)重復(fù)調(diào)用這兩個(gè)函數(shù)之一,在這兩個(gè)函數(shù)體內(nèi),窗口位置有規(guī)律地遞減或遞增就可以達(dá)到QQ的“抽屜”效果了,有趣的是即使伸縮過程還沒完成,你也可以在這個(gè)過程中改變m_hiding這個(gè)值來決定他是伸還是縮,正如QQ一樣。你可以把Timer 2 的事件間隔調(diào)大一點(diǎn),然后在窗口伸縮時(shí),鼠標(biāo)來回地進(jìn)出窗口就會(huì)很容易看到這樣有趣的效果(還沒縮進(jìn)去又被拉了出來,或者還沒拉出來又縮進(jìn)去了)。
void CQQHideWndDlg::FixMoving(UINT fwSide, LPRECT pRect){POINT curPos;GetCursorPos(&curPos);INT screenHeight = GetSystemMetrics(SM_CYSCREEN);INT screenWidth = GetSystemMetrics(SM_CXSCREEN);INT height = pRect->bottom - pRect->top;INT width = pRect->right - pRect->left;if (curPos.y <= INTERVAL){ //粘附在上邊pRect->bottom = height - m_edgeHeight;pRect->top = -m_edgeHeight;m_hideMode = HM_;}else if(curPos.y >= (screenHeight - INTERVAL - m_taskBarHeight)){ //粘附在下邊pRect->top = screenHeight - m_taskBarHeight - height;pRect->bottom = screenHeight - m_taskBarHeight;m_hideMode = HM_BOTTOM;}else if (curPos.x < INTERVAL){ //粘附在左邊 if(!m_isSizeChanged){CRect tRect;GetWindowRect(tRect);m_oldWndHeight = tRect.Height(); }pRect->right = width;pRect->left = 0;pRect->top = -m_edgeHeight;pRect->bottom = screenHeight - m_taskBarHeight;m_isSizeChanged = TRUE;m_hideMode = HM_LEFT;}else if(curPos.x >= (screenWidth - INTERVAL)){ //粘附在右邊if(!m_isSizeChanged){CRect tRect;GetWindowRect(tRect);m_oldWndHeight = tRect.Height(); }pRect->left = screenWidth - width;pRect->right = screenWidth;pRect->top = -m_edgeHeight;pRect->bottom = screenHeight - m_taskBarHeight;m_isSizeChanged = TRUE;m_hideMode = HM_RIGHT;}else{ //不粘附if(m_isSizeChanged){ //如果收縮到兩邊,則拖出來后會(huì)變回原來大小//在"拖動(dòng)不顯示窗口內(nèi)容下"只有光柵變回原來大小pRect->bottom = pRect->top + m_oldWndHeight;m_isSizeChanged = FALSE;}if(m_isSetTimer){ //如果Timer開啟了,則關(guān)閉之if(KillTimer(1) == 1)m_isSetTimer = FALSE;}m_hideMode = HM_NONE;GetDlgItem(IDC_TIMER)->SetWindowText("Timer off");}}
收縮模式和位置決定后,剩下的工作就由最后兩個(gè)核心函數(shù)完成了:實(shí)現(xiàn)收縮的DoHide(),實(shí)現(xiàn)伸展的DoShow()。在這兩個(gè)過程中m_hsFinished,m_hiding 這兩個(gè)變量起到很重要的控制作用。由于伸縮過程沒完成時(shí),hsFinished始終為FALSE,所以Timer 2 不會(huì)關(guān)閉,于是在OnTimer中會(huì)重復(fù)調(diào)用這兩個(gè)函數(shù)之一,在這兩個(gè)函數(shù)體內(nèi),窗口位置有規(guī)律地遞減或遞增就可以達(dá)到QQ的“抽屜”效果了,有趣的是即使伸縮過程還沒完成,你也可以在這個(gè)過程中改變m_hiding這個(gè)值來決定他是伸還是縮,正如QQ一樣。你可以把Timer 2 的事件間隔調(diào)大一點(diǎn),然后在窗口伸縮時(shí),鼠標(biāo)來回地進(jìn)出窗口就會(huì)很容易看到這樣有趣的效果(還沒縮進(jìn)去又被拉了出來,或者還沒拉出來又縮進(jìn)去了)。