橡皮筋绘图,出错,请进

xxfxiazai 2009-08-03 11:08:10
用橡皮筋技术绘制矩形,代码如下,
void Changerect::Draw (CDC* pdc,CPoint firstpoint,CPoint secondpoint)
{
CPen pen;
pen.CreatePen (PS_SOLID,1,RGB(255,0,0));
CPen* poldpen= pdc->SelectObject (&pen);
CBrush* poldbrush=(CBrush*)pdc->SelectStockObject (NULL_BRUSH);
this->lefttop =firstpoint;
this->rightbottom =secondpoint;
CRect rect(lefttop,rightbottom);
rect.NormalizeRect ();
pdc->Rectangle (rect);
pdc->SelectObject (poldpen);
pdc->SelectObject (poldbrush);
}

这是Draw函数
void CmoveView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);
//dc.SetROP2 (R2_NOT);
if(nFlags&MK_LBUTTON)
{
this->secondpoint =point;
if(pcr)
{
pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
delete this->pcr ;
pcr=0;
}
pcr =new Changerect;
pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
}
}

这是鼠标移动事件.

说明:注释掉dc.SetROP2 (R2_NOT);则能看到绘制过程,会有很多的重叠矩形,鼠标左键弹起后能看到最终矩形,重叠矩形消失.
不注释,则绘制过程中只能隐约看到绘制的矩形,就是不停的闪烁,几乎看不到矩形的样子,鼠标左键弹起后,能看到最终矩形显示.
不注释,再在函数末尾加一个窗口重画函数this->InvalidateRect (0);,则在绘制过程中也能看到矩形,但这样做显然不好.

不知道哪里有问题,请大家帮我看看
...全文
78 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
danxuezx 2009-08-03
  • 打赏
  • 举报
回复
学习了,第一次听说橡皮筋绘图~~
快乐鹦鹉 2009-08-03
  • 打赏
  • 举报
回复
if(nFlags&MK_LBUTTON)
{

if(pcr)
{
pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
delete this->pcr ;
pcr=0;
}
this->secondpoint =point;
pcr =new Changerect;
pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
}
是不是应该这样,先擦去上次画的线,再绘制新的线。
快乐鹦鹉 2009-08-03
  • 打赏
  • 举报
回复
if(nFlags&MK_LBUTTON)
{
this->secondpoint =point;
if(pcr)
{
pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
delete this->pcr ;
pcr=0;
}
pcr =new Changerect;
pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
}
==这么写,那你两遍画的firstpoint和secondpoint不是一样的啦?能有橡皮筋的效果么?
xxfxiazai 2009-08-03
  • 打赏
  • 举报
回复
TO:
happyparrot,SETROP2的位置确实应该放判断语句里面.

我把
pen.CreatePen (PS_SOLID,1,RGB(255,0,0));
这句代码改回来就好多了,我给改成PS_DOT了,改成PS_SOLID后,闪烁现象不太明显了.
scsnsjsl_cs_dn 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 happyparrot 的回复:]
dc.SetROP2(R2_NOT)应该只针对第一个绘制,对于第二个Draw,你不能用这个模式。也就是说,只有需要擦除线时,采用R2_NOT模式

if(nFlags&MK_LBUTTON)
    {
     
        if(pcr)
        {
            int nR2 = dc.SetROP2(R2_NOT);
            pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
            delete this->pcr ;
            pcr=0;
            dc.SetROP2(nR2);
        }
        this->secondpoint =point;
        pcr =new Changerect;
        pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
[/Quote]
快乐鹦鹉 2009-08-03
  • 打赏
  • 举报
回复
dc.SetROP2(R2_NOT)应该只针对第一个绘制,对于第二个Draw,你不能用这个模式。也就是说,只有需要擦除线时,采用R2_NOT模式

if(nFlags&MK_LBUTTON)
{

if(pcr)
{
int nR2 = dc.SetROP2(R2_NOT);
pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
delete this->pcr ;
pcr=0;
dc.SetROP2(nR2);
}
this->secondpoint =point;
pcr =new Changerect;
pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
xxfxiazai 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyparrot 的回复:]
if(nFlags&MK_LBUTTON)
    {
     
        if(pcr)
        {
            pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
            delete this->pcr ;
            pcr=0;
        }
        this->secondpoint =point;
        pcr =new Changerect;
        pcr->Draw (&dc,this->firstpoint ,this->secondpoint );
    }
是不是应该这样,先擦去上次画的线,再绘制新的线。
[/Quote]

谢谢,我改了以后终于在绘制过程中也能看到矩形了,但是还有闪烁的现象.
就象我用原先的代码,然后加上 this->InvalidateRect (0); 这句后同样的效果

16,548

社区成员

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

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

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