如果图只是黑白的
当画一个图时,鼠标还在拖动中,就应该在先前那个结束点和当前点用模式R2_NOT重画图
形.这样就会有鼠标拖到哪画到哪的效果.因为之前的图形被NOT消失了.问题是,如果图是彩色的,使用NOT就会发生严重错误,例如你用黄色画圆,NOT后就变成了蓝
色,而不是消失.但如果简单使用R2_WHITE,在鼠标拖过已经有的图形就会把他们画成白的.请问在彩色模式下,用什么方式既可以不影响已经存在的图形,又可以达到Windows画图程
序的画图效果?我知道把每次的开始点和结束点用Invalidate重画可以达到这一效果.但能不能有其他办
法? 谢谢.

解决方案 »

  1.   

    前后用2次NOT!这是一般画图的原理。
      

  2.   

    说过了,如果是黑白的,用NOT没问题,但涉及到彩色就不管用了.你说的第二次用Not的话出现的只是黑色,而不可能是红色,蓝色等(背景为白色情况下).如果第二次画为了展现颜色而用R2_NOT,那么第一次用R2_NOT只会把上次的颜色取反.原来是红色,取反后就为天蓝色;原来是蓝色,取反后就是黄色.不可能恢复成背景的白色.
      

  3.   

    COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
    CPen pen(PS_DOT, 1, XorColor);
    pDC->SetROP2(R2_XORPEN);
      

  4.   

    GetPenColor是什么东西啊?楼上能否用通俗语言描述一下思路,谢谢.
      

  5.   

    用R2_NOT 2次是没有问题的。
    你设置绘图模式时要保存原来的模式;画完之后再恢复到原来的模式。
    是这样 NOT 2 次的。你用对了么?这个方法是正确的,你好好研究一下你的程序的流程吧。
      

  6.   

    请问用R2_NOT和红色的笔在白色的背景下画图。画出来的线是什么颜色的?
      

  7.   

    POINT g_beginPoint, g_oldPoint;
    HDC g_hMemDC;//显示DC
    HDC g_oldMemDC;//未画前的DC
    UINT g_uGraphType = 0;
    省去初始化描写1200字......鼠标落下时:
    SetCapture();
    g_uGraphType = 1;///你要画的图形类型
    g_beginPoint = point;
    g_oldPoint = point;
    鼠标移动时
    if (1 == g_uGraphType)
    {
        HDC hMemDC;
        省去初始化描写1200字......    //在hMemDC上绘制你的图形    此处省略比较g_beginPoint与g_oldPoint位置,看谁的x坐标更靠近左边,谁的y坐标更靠近上边的代码2000字......    //先把上次mousemove时画的图抹掉
        ::bitblt(g_hMemDC, g_beginPoint.x, g_beginPoint.y, g_oldPoint.x - g_beginPoint.x, g_oldPoint.y - g_beginPoint.y, g_oldMemDC, g_beginPoint.x, g_beginPoint.y, SRCCOPY);//这里认为g_beginPoint比g_oldPoint更靠近左上角    此处省略比较g_beginPoint与p位置,看谁的x坐标更靠近左边,谁的y坐标更靠近上边的代码2000字......
        //把hMemDC上的图形贴到你的显示DC(g_hMemDC)中
        ::bitblt(g_hMemDC, g_beginPoint.x, g_beginPoint.y, point.x - g_beginPoint.x, point.y - g_beginPoint.y, hMemDC, g_beginPoint.x, g_beginPoint.y, SRCCOPY);//这里认为g_beginPoint比point更靠近左上角    g_oldPoint = point;
        //此处省去释放hMemDC的代码1000字......    Invalidate(FALSE);//或InvalidateRect(你刚画的区域)
    }鼠标抬起时:
    ReleaseCapture();
    g_uGraphType = 0;