更新时间:2016-01-13 16:59:30浏览次数:1+次
在《win32模拟窗口拖动效果而实现的拖动矩形》里用win32完美的实现了两种窗口拖动效果。下面我们用MFC实现一遍。其实代码并没有做多大的改变,就是加上了MFC特有的封装特性。
void C拖动窗口Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
PAINTSTRUCT ps;
pDC=BeginPaint(&ps);
pDC->SelectObject(GetStockObject(WHITE_PEN));
pDC->SelectObject(GetStockObject(GRAY_BRUSH));
pDC->Rectangle(&rectOld);
EndPaint(&ps);
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR C拖动窗口Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void C拖动窗口Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ptOld.x=point.x;
ptOld.y=point.y;
if(PtInRect(&rectOld,point))
{
IsMove=true;
}
else
{
IsMove=false;
}
CDialogEx::OnLButtonDown(nFlags, point);
}
void C拖动窗口Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(IsMove)
{
p1DC=GetDC();
IsMove=false;
rectNew.left=rectOld.left+(point.x-ptOld.x);
rectNew.top=rectOld.top+(point.y-ptOld.y);
rectNew.right=rectNew.left+100;
rectNew.bottom=rectNew.top+60;
CopyRect(&rectOld,&rectNew);
Invalidate();
ReleaseDC(p1DC);
}
CDialogEx::OnLButtonUp(nFlags, point);
}
void C拖动窗口Dlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
p1DC=GetDC();
SetRect(&rectOld,10,10,110,70);///保存上次矩形的位置
p1DC->SelectObject(GetStockObject(WHITE_PEN));
p1DC->SelectObject(GetStockObject(GRAY_BRUSH));
p1DC->Rectangle(&rectOld);
ReleaseDC(p1DC);
CDialogEx::OnRButtonDown(nFlags, point);
}
void C拖动窗口Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(IsMove)
{
////鼠标移动画边框
rectMove.left=rectOld.left+(point.x-ptOld.x);
rectMove.top=rectOld.top+(point.y-ptOld.y);
rectMove.right = rectMove.left+100;
rectMove.bottom = rectMove.top +60;
/////擦掉上次的拖动的矩形轨迹
p1DC=GetDC();
p1DC->SelectObject(GetStockObject(WHITE_PEN));
p1DC->SelectObject(GetStockObject(WHITE_BRUSH));
p1DC->Rectangle(&rectLast);
//////实时移动矩形
/*p1DC->SelectObject(GetStockObject(NULL_PEN));
p1DC->SelectObject(GetStockObject(LTGRAY_BRUSH));
p1DC->Rectangle(&rectMove);
CopyRect(&rectLast,&rectMove); */
/////使用虚框代替矩形实时移动效果
p1DC->SelectObject(GetStockObject(NULL_PEN));
p1DC->SelectObject(GetStockObject(LTGRAY_BRUSH));
p1DC->Rectangle(rectOld.left,rectOld.top,rectOld.right,rectOld.bottom);
//画本次移动的矩形轨迹
p1DC->SelectObject(GetStockObject(BLACK_PEN));
p1DC->SelectObject(GetStockObject(NULL_BRUSH));
p1DC->Rectangle(rectMove.left,rectMove.top,rectMove.right,rectMove.bottom);
CopyRect(&rectLast,&rectMove);
ReleaseDC(p1DC);
}
CDialogEx::OnMouseMove(nFlags, point);
}
原文中对代码有了详细的解释,我在这里补充说下,自己的理解,对于NULL_PEN,NULL_BRUSH不理解的,请看《NULL_BRUSH,NULL_PEN的理解》。
相关资讯