要做一个绘图程序,能画线条、矩形、圆形等,并可以选取、编辑、旋转图形
开始的时候用GDI做,但处理图形旋转很麻烦,所以改用GDI+。
但查了许久,也没找到实现XOR绘图的函数。
请问如何实现类似GDI中 pDC->SetRop2(R2_NOT)的功能?还是有什么替代方法?

解决方案 »

  1.   

    怎么没人回答?Word里的绘图就是用GDI+做的吧?是怎么实现的?
    不知道分层窗口能不能解决这个问题?当编辑某个图形时,把它移到透明窗口中,编辑完再放回去?
    GDI+好像不太友好,这么简单的功能也不加上,在网上整整查了一天,都说实现不了XOR。
    MS为什么熟视无睹?
      

  2.   

    GDI+不支持rop吧。
    要不你画到一个dc上,然后StretchBlt,我没试过。呵呵
      

  3.   

    楼上说的可行吗?
    是说先画到内存中吗?但是要让图形显示出来,不还得画到view的dc里去吗?
    关键是当图形移动或旋转的时候,即不能擦除“后面”的图形,又不能反复重画所有图形。
    在GDI中用SetRop2很容易解决的问题,怎么到升级版本中这么费事?
      

  4.   

    public void DrawXORRectangle( Graphics grp,
                                  int X1, int Y1, int X2, int Y2 )
    {
    // Extract the Win32 HDC from the Graphics object supplied.
    IntPtr hdc = grp.GetHdc();

    // Create a pen with a dotted style to draw the border of the
    // rectangle.
    IntPtr gdiPen = CreatePen( penStyle,
                  1, BLACK_PEN );

    // Set the ROP cdrawint mode to XOR.
    SetROP2( hdc, R2_XORPEN );

    // Select the pen into the device context.
    IntPtr oldPen = SelectObject( hdc, gdiPen );

    // Create a stock NULL_BRUSH brush and select it into the device
    // context so that the rectangle isn't filled.
    IntPtr oldBrush = SelectObject( hdc,
                         GetStockObject( NULL_BRUSH ) );

    // Now XOR the hollow rectangle on the Graphics object with
    // a dotted outline.
    Rectangle( hdc, X1, Y1, X2, Y2 );

    // Put the old stuff back where it was.
    SelectObject( hdc, oldBrush ); // no need to delete a stock object
    SelectObject( hdc, oldPen );
    DeleteObject( gdiPen ); // but we do need to delete the pen

    // Return the device context to Windows.
    grp.ReleaseHdc( hdc );
    }
      

  5.   

    liotion(天上掉下一个林分分~~) ( ) 信誉:100  2007-8-17 17:26:51  得分: 0  
    当图像移动或者旋转时 保存背景到一个内存DC中 然后根据移动或者旋转的矩形区域重画到表面上去
    -------------
    恐怕不行吧,因为在鼠标拖动过程中,要画出图形在某位置的临时“轮廓”。(和word中的绘图功能一样)
    这就需要先擦除上一个“轮廓”,再画出当前的“轮廓”。如果在图形运动过程中,略过其它图形,那么就把那个图形也擦掉了。
    所以如果按照这种重画的方式,图形每变化一点,就要重画一次,那就会闪个不停。
    =============
    Fxingtianxia()
    你给的代码是不是.net的,在VC里不管用啊。
      

  6.   


    一般是这样处理,GDIPlus里面有路径,GDI里面也有路径,他们的数据是一样的
      

  7.   

    cpio(备注) ( ) 信誉:100  2007-8-18 17:49:47  得分: 0  
    一般是这样处理,GDIPlus里面有路径,GDI里面也有路径,他们的数据是一样的
    ------------------------
    能详细说说吗?今天试了分层窗口,在程序中创建一个分层窗口,当窗口类型是popup 或 overlapped时,主窗体就灰了。当类型是child时,分层窗口函数就出错了。据说WS_CHILD类型的对话框不支持分层窗口……现在正在试双缓冲 ,Grapics类型变量好像不能作为参数传递……
      

  8.   

    对异或线的操作用GDI完成,其它的用GDI+完成就可以了,GDI与GDI+对象是可以相互转换的
      

  9.   

    对异或线的操作用GDI完成,其它的用GDI+完成就可以了,GDI与GDI+对象是可以相互转换的
    ------------------------------------
    GDI+绘图是用Graphics
    GDI绘图是用CDC
    怎么互换?查到过.net有用托管类实现混合编程的文章
    但VC中没发现有类似的方法,是不是用GDI+获得图形的路径,然后通过GDI以异或的方式填充这个路径?前两天采用双缓冲的方式,不断刷新客户区,客户区没有明显的闪烁,但后面的窗体、桌面图标会闪。在任务管理器中发现来回拖拽图像时CPU占用100%……
    今天又看了word中的绘图功能,图形相交的位置没有因异或而产生的白点,拖动图形时CPU占用率几乎没有变化。不知道用的什么技术?
      

  10.   

    http://www.codeproject.com/vcpp/gdiplus/HitTester.asp
    还有很多,你自己找找至于这个--
    今天又看了word中的绘图功能,图形相交的位置没有因异或而产生的白点,拖动图形时CPU占用率几乎没有变化。不知道用的什么技术?
    --------------------
    估计是有的图层技术,可以看看PAINTER的实现
      

  11.   

    http://www.codeproject.com/vcpp/gdiplus/HitTester.asp
    还有很多,你自己找找
    ===============
    好像是vc.net的,谢谢,我研究一下
      

  12.   

    可以看看PAINTER的实现
    ================
    PAINTER是画图程序吗?有源码吗?
    画图程序好象是用GDI做的,因为线条没有平滑的效果,也不支持图形的编辑。
    在网上找vc的图层技术往往是跟mapx等第三方工具有关的,还没找到vc自己实现图层的例子。