拖动无窗口标题
一般软件都有窗口标题,在移动窗口位置的时候,鼠标点击窗口标题栏即可移动窗口。但是有些软件是没有窗口标题的,因此无法选择点击窗口标题栏移动窗口。因此就需要软件实现窗口的移动。
1、在对话框类的.h文件定义一个BOOL和CPiont的对象,并将BOOL对象初始化为FALSE
BOOL m_Moving;//移动窗口的标志位
CPoint m_ptMouse;
m_Moving = FALSE;
2、在WM_LBUTTONDOWN消息映射函数中获取点击鼠标的位置,并设置移动窗口的标志位。
void C拖动无边框窗体Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_Moving = TRUE;//设置窗口标志位
SetCapture();//获取窗口外面的鼠标
m_ptMouse = point;//记录鼠标点击的位置
CDialogEx::OnLButtonDown(nFlags, point);
}
3、在WM_MOUSEMOVE消息映射函数中实现移动窗口的代码。
void C拖动无边框窗体Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_Moving)
{
int x, y;
x = point.x - m_ptMouse.x;
y = point.y - m_ptMouse.y;
if (abs(x)>=2||abs(y)>=2)
{
RECT rc = {0};
GetWindowRect(&rc);//获取窗口的位置
OffsetRect(&rc,x,y);//偏移窗口的位置
MoveWindow(&rc,TRUE);//将窗口移动到新位置
}
}
CDialogEx::OnMouseMove(nFlags, point);
}
3、在WM_LBUTTONUP消息映射函数,将移动窗口标志位恢复。
void C拖动无边框窗体Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_Moving)
{
m_Moving = FALSE;
ReleaseCapture();
}
CDialogEx::OnLButtonUp(nFlags, point);
}
4、在WM_ACTIVE消息映射函数中处理,如果在移动的过程中窗口失去了焦点,会出现一些问题,这些问题在WM_ACTIVE消息映射函数中处理。
void C拖动无边框窗体Dlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialogEx::OnActivate(nState, pWndOther, bMinimized);
if (nState == WA_INACTIVE && m_Moving)
{
m_Moving = FALSE;
ReleaseCapture();
}
// TODO: 在此处添加消息处理程序代码
}