代碼四
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){ //如果收縮到兩邊,則拖出來(lái)后會(huì)變回原來(lái)大小//在"拖動(dòng)不顯示窗口內(nèi)容下"只有光柵變回原來(lái)大小pRect->bottom = pRect->top + m_oldWndHeight;m_isSizeChanged = FALSE;}if(m_isSetTimer){ //如果Timer開(kāi)啟了,則關(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è)過(guò)程中m_hsFinished,m_hiding 這兩個(gè)變量起到很重要的控制作用。由于伸縮過(guò)程沒(méi)完成時(shí),hsFinished始終為FALSE,所以Timer 2 不會(huì)關(guān)閉,于是在OnTimer中會(huì)重復(fù)調(diào)用這兩個(gè)函數(shù)之一,在這兩個(gè)函數(shù)體內(nèi),窗口位置有規(guī)律地遞減或遞增就可以達(dá)到QQ的“抽屜”效果了,有趣的是即使伸縮過(guò)程還沒(méi)完成,你也可以在這個(gè)過(guò)程中改變m_hiding這個(gè)值來(lái)決定他是伸還是縮,正如QQ一樣。你可以把Timer 2 的事件間隔調(diào)大一點(diǎn),然后在窗口伸縮時(shí),鼠標(biāo)來(lái)回地進(jìn)出窗口就會(huì)很容易看到這樣有趣的效果(還沒(méi)縮進(jìn)去又被拉了出來(lái),或者還沒(méi)拉出來(lái)又縮進(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){ //如果收縮到兩邊,則拖出來(lái)后會(huì)變回原來(lái)大小//在"拖動(dòng)不顯示窗口內(nèi)容下"只有光柵變回原來(lái)大小pRect->bottom = pRect->top + m_oldWndHeight;m_isSizeChanged = FALSE;}if(m_isSetTimer){ //如果Timer開(kāi)啟了,則關(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è)過(guò)程中m_hsFinished,m_hiding 這兩個(gè)變量起到很重要的控制作用。由于伸縮過(guò)程沒(méi)完成時(shí),hsFinished始終為FALSE,所以Timer 2 不會(huì)關(guān)閉,于是在OnTimer中會(huì)重復(fù)調(diào)用這兩個(gè)函數(shù)之一,在這兩個(gè)函數(shù)體內(nèi),窗口位置有規(guī)律地遞減或遞增就可以達(dá)到QQ的“抽屜”效果了,有趣的是即使伸縮過(guò)程還沒(méi)完成,你也可以在這個(gè)過(guò)程中改變m_hiding這個(gè)值來(lái)決定他是伸還是縮,正如QQ一樣。你可以把Timer 2 的事件間隔調(diào)大一點(diǎn),然后在窗口伸縮時(shí),鼠標(biāo)來(lái)回地進(jìn)出窗口就會(huì)很容易看到這樣有趣的效果(還沒(méi)縮進(jìn)去又被拉了出來(lái),或者還沒(méi)拉出來(lái)又縮進(jìn)去了)。