这两天学习GDI绘制连续的折线,采用鼠标点击输入关键点,并同步在客户区中绘制出来。
为防止闪烁,采用了双缓存技术。绘图的同时,需要显示一张背景图片。
出现的问题是:
当折线绘制完发现有个别关键点位置不对,需要修改关键点位置,此时选中关键点、移动关键点都实现了,
但是,移动时,与该关键点相连的橡皮线显示不正确,移过的地方都成黑色的一片,分不出最后绘制的线在哪里了,
我绘制时也采用了setRop2()操作,不使用双缓存时直接在一个DC中画时,显示正常.不知该如何绘制了,请高手帮助,谢谢。
联系方式是:
[email protected],或QQ:82280347

解决方案 »

  1.   

    void C**::OnMouseMove( UINT nFlags, CPoint point ) 
    {
    CDC *pdc = this->GetDC( );
    CDC   MenDC;   
    CBitmap   bm;

    CRect rt;
    GetClientRect( &rt );
    MenDC.CreateCompatibleDC( pdc );   
    bm.CreateCompatibleBitmap( pdc, rt.Width( ), rt.Height( ) );   
    MenDC.SelectObject( &bm );
    //-------------------------------------------------------------------
    Graphics graphics( MenDC.m_hDC );  //这里使用内存DC的句柄生成Graphics
    DrawAll( &graphics );              //假设你在这个DrawAll函数中去绘制了背景等(绘制折线前所需要绘制的所有东西)
    DrawMouseMovePolygn(&graphics);    //在这里绘制鼠标移动过程中的折线。

    //-------------------------------------------------------------------
    pdc->BitBlt( 0, 0, rt.Width( ), rt.Height( ), &MenDC, 0, 0, SRCCOPY ); //从内存DC贴图到屏幕DC
    MenDC.DeleteDC( );   
    bm.DeleteObject( );
    ReleaseDC( pdc );
    C***::OnMouseMove( nFlags, point );
    }
    楼主看看上面鼠标移动时的概略代码。多点折线进行鼠标调整大致上应该按照这样的步骤:1.声明数组Ary 为PointF[]类型(CArray最好,可以动态添加)
    2.设定两个状态 一是用户输入点的状态 二是用户输入点完成状态  通过BOOL型来控制。这里不多说了 只要鼠标落下就采集点 直到采集结束(双击?)
    3.用户采集完成后Ary里面有相应的点了。在OnDraw或者OnPaint中直接绘制折线即可
        
        Graphics graphics( pDC->m_hDC );    //这里使用OnDraw中的pDC的句柄生成Graphics
        DrawAll( &graphics );               //仍然先绘制底图等
        DrawPolygn(&graphics);               //这里直接绘制折线,Ary设为类成员变量,在DrawPolygn中使用
    4.设定各种标志 例如鼠标落下BOOL DFg; 鼠标拖动BOOL FRg; 还有鼠标落下点记录 PointF DPt; 当前选中点INT CurrentSelectDot;等
    5.鼠标录下的时候 给各个点建立选中区域Region Dgn[]; 使用For循环查找鼠标是否选中某个点 如果选中设定CurrentSelectDot 否则CurrentSelectDot = -1;
    6.鼠标移动的时候,检查CurrentSelectDot是否大于-1 如果大于-1 生成一个临时PointF MovePt;来代替CurrentSelectDot的对应位置 同时CurrentSelectDot前后两个点与CurrentSelectDot这个点之间使用虚线连接 其他为实线。
    7.用户移动完毕 鼠标抬起的时候 用鼠标抬起点 UpPt来重新设定Ary中CurrentSelectDot对应的点 实现数组更新。基本上就是这样了 楼主可以去试试这个思路 我一直是这样来弄的。
      

  2.   

    的确需要双缓冲的,不然闪的很厉害,你可以不要用setRop2,具体步骤是这样的
    首先,必须保存好背景,也就是将实际数据先画出来,画在一个缓冲a里面,比如BMP什么的
    其次,在进行一下改变操作的时候,这样做:
       1、将保存好的缓冲a的数据取出来,拷贝到缓冲b
       2、在缓冲b里面画过程,比如当前拖动的位置导致线的新位置(最好用其它颜色标志动态的色彩)
       3、将缓冲B贴出来