一般的窗口都是有标题栏的,我们经常是拖动标题栏来进行窗口的移动,但是有些软件是无标题栏无边框的,这时候就需要写代码来让鼠标点击窗口任意位置都可以让窗口移动了.
1.添加两个成员变量,一个用来标记移动状态,一个用来记录鼠标按下时的坐标
CPoint m_point;
BOOL m_bIsMoving;
2.在构造函数中初始化
m_bIsMoving = FALSE;
m_point = 0;
3.找到WM_BUTTONDOWN消息
void CMFCTESTDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bIsMoving = TRUE;
SetCapture();
m_point = point;
CDialogEx::OnLButtonDown(nFlags, point);
}
4.找到WM_MOUSEMOVE消息
void CMFCTESTDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bIsMoving)
{
-
-
-
-
-
-
-
-
-
if (m_point.x<700&& m_point.x>0&& m_point.y>0&& m_point.y<45)
//这部分指定了鼠标所点击的位置后发生移动,如果不需要,只采用上面的即可。
{
int dx = point.x - m_point.x;
int dy = point.y - m_point.y;
CRect rect = { 0 };
GetWindowRect(&rect);
OffsetRect(&rect, dx, dy);
MoveWindow(&rect);
}
else
{
}
}
CDialogEx::OnMouseMove(nFlags, point);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
5.找到WM_LBUTTONUP消息
void CMFCTESTDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
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);
if (nState == WA_INACTIVE && m_bIsMoving)
{
m_bIsMoving = FALSE;
ReleaseCapture();
}
}
这种移动无边框的方法一样可以用在由标题栏有边框的软件上.