一般的窗口都是有标题栏的,我们经常是拖动标题栏来进行窗口的移动,但是有些软件是无标题栏无边框的,这时候就需要写代码来让鼠标点击窗口任意位置都可以让窗口移动了.
1.添加两个成员变量,一个用来标记移动状态,一个用来记录鼠标按下时的坐标
CPoint m_point;
BOOL m_bIsMoving;
2.在构造函数中初始化
m_bIsMoving = FALSE;
m_point = 0;
3.找到WM_BUTTONDOWN消息
void CMFCTESTDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bIsMoving = TRUE;
SetCapture();//捕获鼠标消息,就算鼠标超过窗口也可以捕获到
m_point = point;//记录按下时的坐标
CDialogEx::OnLButtonDown(nFlags, point);
}
4.找到WM_MOUSEMOVE消息
void CMFCTESTDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bIsMoving)
{
//偏移量
int dx = point.x - m_point.x;
int dy = point.y - m_point.y;
//如果窗口闪烁,可以使dx,dy大于1再移动
//if(abs(dx)>2||abs(dy)>2)....
CRect rect = { 0 };
GetWindowRect(&rect);
OffsetRect(&rect, dx, dy);//整个窗口偏移dx,dy
MoveWindow(&rect);//移动窗口
}
CDialogEx::OnMouseMove(nFlags, point);
}
5.找到WM_LBUTTONUP消息
void CMFCTESTDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bIsMoving)
{
m_bIsMoving = FALSE;
ReleaseCapture();
}
CDialogEx::OnLButtonUp(nFlags, point);
}
6.找到WM_ACTIVATE消息
void CMFCTESTDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialogEx::OnActivate(nState, pWndOther, bMinimized);
// TODO: 在此处添加消息处理程序代码
//如果窗口失去焦点,则停止移动
if (nState == WA_INACTIVE && m_bIsMoving)
{
m_bIsMoving = FALSE;
ReleaseCapture();
}
}
这种移动无边框的方法一样可以用在由标题栏有边框的软件上.