关于对话框刷新问题

popofish2002 2004-08-05 01:03:38
void CNavigateDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
DrawBox(dc, m_DragRect);
}
BOOL CNavigateDlg::OnEraseBkgnd(CDC* pDC)
{
//自画
......
return TRUE;
}
void CNavigateDlg::DrawBox ( CDC &dc, CRect &rect)
{
// Draw the rect with lines (eliminate rect middle fill)
dc.MoveTo(rect.left-1, rect.top);
dc.LineTo(rect.right, rect.top);
dc.LineTo(rect.right, rect.bottom);
dc.LineTo(rect.left, rect.bottom);
dc.LineTo(rect.left, rect.top);
}

void CNavigateDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnLButtonDown(nFlags, point);
SetCapture();
::SetCursor(::LoadCursor(NULL, IDC_CROSS));
m_bCaptured = TRUE;
}

void CNavigateDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bCaptured)
{
CClientDC dc(this);

CRect rect(point.x-30,point.y-0,point.x+30,point.y+30);
CRect rectU;
rectU.UnionRect(&rect,&m_DragRect);
m_DragRect=rect;
InvalidateRect(&rectU);

}
CDialog::OnMouseMove(nFlags, point);
}

void CNavigateDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
CDialog::OnLButtonUp(nFlags, point);
if (m_bCaptured)
{
m_bCaptured = FALSE;
ReleaseCapture();
}
::SetCursor(::LoadCursor(NULL, IDC_ARROW));
}

画的框随鼠标移动时很闪~~~~~~~~ 怎么解决,~~~~~~ 盼高手指点~~~~~`
...全文
168 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyiuhui 2004-08-05
  • 打赏
  • 举报
回复
To:zhucde(【風間苍月】)也给我发一份吧,谢谢了!
jack_mjl@163.com
DentistryDoctor 2004-08-05
  • 打赏
  • 举报
回复
InvalidateRect(&rectU);==>InvalidateRect(&rectU,FALSE);rectU应该是上次绘图的区域 与需要刷新的区域的并集.SetROP2并不是问题的关键所在。还可以考虑双缓冲。
holyeagle 2004-08-05
  • 打赏
  • 举报
回复
选择pen的时候,用xor,想擦掉的时候在用这个颜色画一次。
Kudeet 2004-08-05
  • 打赏
  • 举报
回复
如何檫掉绘制的直线?
hdc = GetDC(glhTargetWnd);
SelectObject(hdc, pen);
...
LineTo(hdc, 100, 100);
我想把这这条线擦下去,该怎么做
-------------------------------
有异或方式再画一遍。
::SetROP2(hdc,R2_XORPEN);
SelectObject(hdc,pen);
...
LineTo(hdc,100,100);
-------------------------------
CDC* pDC = GetDC();
CPen pen(PS_SOLID,4,RGB(128,0,0));
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->SetROP2(R2_XORPEN);
pDC->MoveTo(0,0);
pDC->LineTo(100, 100);
pDC->SelectObject(&pOldPen);
ReleaseDC(pDC);
画线的时候也用上SetROP2(R2_XORPEN);
就是调用相同的代码执行擦除和重画动作就可以了
popofish2002 2004-08-05
  • 打赏
  • 举报
回复

回复: zhucde(【風間苍月】)
发给我吧
pcbaby@vip.sina.com 谢谢阿~~~~~~~~~~~~~~`
zhucde 2004-08-05
  • 打赏
  • 举报
回复
做个类似的程序,需要留个信箱.
popofish2002 2004-08-05
  • 打赏
  • 举报
回复
因为背景画起来很复杂,一次很慢,
用你的方法也可以吗
basboy 2004-08-05
  • 打赏
  • 举报
回复
用双缓冲吧,省时省力
快乐鹦鹉 2004-08-05
  • 打赏
  • 举报
回复
不用背景自画,只擦掉自己画的。看看CDC的SetROP2函数吧
popofish2002 2004-08-05
  • 打赏
  • 举报
回复
不会连背景自画的一些东西也擦掉吧?
popofish2002 2004-08-05
  • 打赏
  • 举报
回复
异或方式擦除?不会~~~:(
快乐鹦鹉 2004-08-05
  • 打赏
  • 举报
回复
你反复调用InvalidateRect(&rectU);肯定闪啊
将InvalidateRect(&rectU);改为DrawBox(pDC,rectU);
这里DrawBox函数最好做两边。同时记录两个矩形。一个时前一次绘制的矩形,一个是当前的矩形。绘制前一个矩形时,用异或方式擦除,然后绘制新的矩形。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧