#include "StdAfx.h" //如果编译出错,请去掉这一行 #include "MoveWnd.h" RECT CMoveWnd::m_TargetRect={-100,-100,-100,-100}; bool CMoveWnd::m_IsDockedWnd=false; POINT CMoveWnd::m_MouseOffsetFromRectLeftTop={-1000,0}; POINT CMoveWnd::m_MouseDownPoint={-10,0}; bool CMoveWnd::m_IsCapture=false; void CMoveWnd::PrepareMoveWnd(HWND m_hWnd,HWND TargetWnd) { ::SetCapture(m_hWnd); m_IsCapture=true; ::GetCursorPos(&m_MouseDownPoint); RECT rect; ::GetWindowRect(m_hWnd,&rect); //获取鼠标相对于Rect左上角的偏移量m_MouseOffsetFromRectLeftTop m_MouseOffsetFromRectLeftTop.x=m_MouseDownPoint.x-rect.left; m_MouseOffsetFromRectLeftTop.y=m_MouseDownPoint.y-rect.top; //保存要停靠的目标窗口Rect ::GetWindowRect(TargetWnd,&m_TargetRect); } bool CMoveWnd::IsMovedWnd() { ::ReleaseCapture(); m_IsCapture=false; //判断是否移动了窗口 POINT point; ::GetCursorPos(&point); return (point.x==m_MouseDownPoint.x && point.y==m_MouseDownPoint.y) ? false : true; } void CMoveWnd::IsMovingWnd(HWND m_hWnd) { //移动窗口,停泊效果 //get cursor point POINT point; ::GetCursorPos(&point); //count the new position (当前鼠标位置-移动窗口前保存的鼠标偏移量=新的窗口位置) int x_pos_new=point.x-m_MouseOffsetFromRectLeftTop.x; int y_pos_new=point.y-m_MouseOffsetFromRectLeftTop.y; //用于后面和x_pos_new y_pos_new 对比从而判断是否停靠了 int TempX=x_pos_new; int TempY=y_pos_new; //get window rectangle RECT rect; ::GetWindowRect(m_hWnd,&rect); //停靠在目标窗口的右边 if (abs(m_TargetRect.right-x_pos_new)<AUTO_DOCK_WIDTH) x_pos_new=m_TargetRect.right; //停靠在目标窗口的下边 if (abs(m_TargetRect.bottom-y_pos_new)<AUTO_DOCK_WIDTH) y_pos_new=m_TargetRect.bottom; m_IsDockedWnd=true; //停靠在目标窗口的左边 if (abs( (x_pos_new+rect.right-rect.left) -m_TargetRect.left)<AUTO_DOCK_WIDTH) x_pos_new=m_TargetRect.left-(rect.right-rect.left); m_IsDockedWnd=true; //停靠在目标窗口的上边 if (abs( (y_pos_new+rect.bottom-rect.top) -m_TargetRect.top)<AUTO_DOCK_WIDTH) y_pos_new=m_TargetRect.top-(rect.bottom-rect.top); m_IsDockedWnd=true; //判断是否停靠了 if (x_pos_new!=TempX || y_pos_new!=TempY) m_IsDockedWnd=true; else { m_IsDockedWnd=false; //获得屏幕的高和宽 int cxScreen=GetSystemMetrics(SM_CXSCREEN); int cyScreen=GetSystemMetrics(SM_CYSCREEN); //如果靠近屏幕,则进行贴边处理 if ( abs(x_pos_new)<AUTO_DOCK_WIDTH) x_pos_new=0; if ( abs(y_pos_new)<AUTO_DOCK_WIDTH) y_pos_new=0; if ( abs(x_pos_new+rect.right-rect.left-cxScreen)<AUTO_DOCK_WIDTH) x_pos_new=cxScreen-(rect.right-rect.left); if ( abs(y_pos_new+rect.bottom-rect.top-cyScreen)<AUTO_DOCK_WIDTH) y_pos_new=cyScreen-(rect.bottom-rect.top); } ::SetCursor(::LoadCursor(NULL,IDC_SIZEALL)); ::SetWindowPos(m_hWnd,HWND_TOPMOST,x_pos_new,y_pos_new,0,0,SWP_NOSIZE); } |