绘图后的虚框怎么取消

elegant87 2008-12-06 07:55:46
我在练习画图,画直线,矩形,椭圆,我用到了虚框,开始画的时候有个虚框,但是画完后还有,
我的问题是怎么让画完图后虚框消失!
下面是我的程序:

void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
m_bDraw=TRUE;

m_pre.left=point.x;
m_pre.top=point.y;
m_pre.right=point.x;
m_pre.bottom=point.y;

m_new.left=point.x;
m_new.top=point.y;
m_new.right=point.x;
m_new.bottom=point.y;
CView::OnLButtonDown(nFlags, point);
}
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bDraw=FALSE;
CClientDC dc(this);
CPen pen(PS_SOLID,3,RGB(255,0,0));
dc.SelectObject(&pen);
dc.SetROP2(R2_COPYPEN);
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point,RGB(255,0,0));
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
CView::OnLButtonUp(nFlags, point);
}
void CGraphicView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bDraw)
{
CClientDC dc(this);
dc.SetROP2(R2_XORPEN); //设置虚框模式
dc.DrawFocusRect(&m_pre);
m_new.right=point.x;
m_new.bottom=point.y;
dc.DrawFocusRect(&m_new);//画新矩形
m_pre.right=m_new.right;
m_pre.bottom=m_new.bottom;
dc.SetROP2(R2_WHITE);
}
CView::OnMouseMove(nFlags, point);
}
...全文
238 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
梧桐168 2008-12-08
  • 打赏
  • 举报
回复
脏矩形,这么简单好用的专门用于绘图上的方法,怎么许多人不知道。
ilovedrv 2008-12-06
  • 打赏
  • 举报
回复
1. OnLButtonUp里面重绘上次的痕迹

2. OnMouseMove 需要判断绘制的矩形框是否有效

ilovedrv 2008-12-06
  • 打赏
  • 举报
回复

void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bDraw=FALSE;
CClientDC dc(this);

dc.SetROP2(R2_XORPEN); //设置虚框模式
dc.DrawFocusRect(&m_pre);

CPen pen(PS_SOLID,3,RGB(255,0,0));
dc.SelectObject(&pen);
dc.SetROP2(R2_COPYPEN);
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point,RGB(255,0,0));
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
CView::OnLButtonUp(nFlags, point);

}

void CGraphicView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bDraw)
{
CClientDC dc(this);
dc.SetROP2(R2_XORPEN); //设置虚框模式
if (!m_pre.IsRectEmpty())
dc.DrawFocusRect(&m_pre);
m_new.right=point.x;
m_new.bottom=point.y;
if (!m_new.IsRectEmpty())
dc.DrawFocusRect(&m_new);//画新矩形
m_pre.right=m_new.right;
m_pre.bottom=m_new.bottom;
dc.SetROP2(R2_WHITE);
}
CView::OnMouseMove(nFlags, point);

}


cnzdgs 2008-12-06
  • 打赏
  • 举报
回复
OnLButtonUp中加入:
    if(m_bDraw)
{
CClientDC dc(this);
dc.SetROP2(R2_XORPEN);
dc.DrawFocusRect(&m_pre);
dc.SetROP2(R2_WHITE);
}
Tinary3v0 2008-12-06
  • 打赏
  • 举报
回复
在OnMouseMove中使用内存绘图,我想绘图过程一般都需要这样清屏的,因为移动的过程当中wm_paint消息没有被及时触发,
而且就算是及时触发了也会造成屏幕闪烁。
使用内存绘图,因为在内存里面绘制后直接贴图到屏幕上,时间快,因此不会闪烁。
楼主可以参考下面的代码来试试:

CDC *pdc=this->GetDC();   //这里是pdc 等同于楼主的&dc
CDC MenDC;
CBitmap bm;

CRect rt;
GetClientRect(&rt);
MenDC.CreateCompatibleDC(pdc);
bm.CreateCompatibleBitmap(pdc,rt.Width(),rt.Height());
MenDC.SelectObject(&bm);
//-------------------------------------------------------------------
//在这里使用MenDC来绘图,一定要是MenDC(内存DC)
//-------------------------------------------------------------------
pdc->BitBlt(0,0,rt.Width(),rt.Height(),&MenDC,0,0,SRCCOPY);
MenDC.DeleteDC();
bm.DeleteObject();
ReleaseDC(pdc);
dirdirdir3 2008-12-06
  • 打赏
  • 举报
回复
用异或笔来画,并且需要消失时重新画一次

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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