GDI+如何实现XOR绘图?

some0719 2007-08-17 01:32:53
要做一个绘图程序,能画线条、矩形、圆形等,并可以选取、编辑、旋转图形
开始的时候用GDI做,但处理图形旋转很麻烦,所以改用GDI+。
但查了许久,也没找到实现XOR绘图的函数。
请问如何实现类似GDI中 pDC->SetRop2(R2_NOT)的功能?还是有什么替代方法?
...全文
1145 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
some0719 2007-08-24
  • 打赏
  • 举报
回复
这几天没时间弄,先结帖了,谢谢各位的帮忙。
some0719 2007-08-21
  • 打赏
  • 举报
回复
可以看看PAINTER的实现
================
PAINTER是画图程序吗?有源码吗?
画图程序好象是用GDI做的,因为线条没有平滑的效果,也不支持图形的编辑。
在网上找vc的图层技术往往是跟mapx等第三方工具有关的,还没找到vc自己实现图层的例子。
some0719 2007-08-21
  • 打赏
  • 举报
回复
http://www.codeproject.com/vcpp/gdiplus/HitTester.asp
还有很多,你自己找找
===============
好像是vc.net的,谢谢,我研究一下
「已注销」 2007-08-21
  • 打赏
  • 举报
回复
http://www.codeproject.com/vcpp/gdiplus/HitTester.asp
还有很多,你自己找找

至于这个--
今天又看了word中的绘图功能,图形相交的位置没有因异或而产生的白点,拖动图形时CPU占用率几乎没有变化。不知道用的什么技术?
--------------------
估计是有的图层技术,可以看看PAINTER的实现
「已注销」 2007-08-20
  • 打赏
  • 举报
回复
对异或线的操作用GDI完成,其它的用GDI+完成就可以了,GDI与GDI+对象是可以相互转换的
some0719 2007-08-20
  • 打赏
  • 举报
回复
对异或线的操作用GDI完成,其它的用GDI+完成就可以了,GDI与GDI+对象是可以相互转换的
------------------------------------
GDI+绘图是用Graphics
GDI绘图是用CDC
怎么互换?

查到过.net有用托管类实现混合编程的文章
但VC中没发现有类似的方法,是不是用GDI+获得图形的路径,然后通过GDI以异或的方式填充这个路径?

前两天采用双缓冲的方式,不断刷新客户区,客户区没有明显的闪烁,但后面的窗体、桌面图标会闪。在任务管理器中发现来回拖拽图像时CPU占用100%……
今天又看了word中的绘图功能,图形相交的位置没有因异或而产生的白点,拖动图形时CPU占用率几乎没有变化。不知道用的什么技术?
some0719 2007-08-18
  • 打赏
  • 举报
回复
双缓冲,效果还凑合,图形快速拖动时,程序界面是不闪,反倒后面的窗体、桌面图标会闪。不知道是不是调用的问题。
some0719 2007-08-18
  • 打赏
  • 举报
回复
cpio(备注) ( ) 信誉:100 2007-8-18 17:49:47 得分: 0
一般是这样处理,GDIPlus里面有路径,GDI里面也有路径,他们的数据是一样的
------------------------
能详细说说吗?

今天试了分层窗口,在程序中创建一个分层窗口,当窗口类型是popup 或 overlapped时,主窗体就灰了。当类型是child时,分层窗口函数就出错了。据说WS_CHILD类型的对话框不支持分层窗口……

现在正在试双缓冲 ,Grapics类型变量好像不能作为参数传递……
cpio 2007-08-18
  • 打赏
  • 举报
回复

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


some0719 2007-08-17
  • 打赏
  • 举报
回复
今晚准备用分层窗口,试试能不能解决。
感觉实现起来比较复杂,微软奇怪的设计让人大费周章……
some0719 2007-08-17
  • 打赏
  • 举报
回复
liotion(天上掉下一个林分分~~) ( ) 信誉:100 2007-8-17 17:26:51 得分: 0
当图像移动或者旋转时 保存背景到一个内存DC中 然后根据移动或者旋转的矩形区域重画到表面上去
-------------
恐怕不行吧,因为在鼠标拖动过程中,要画出图形在某位置的临时“轮廓”。(和word中的绘图功能一样)
这就需要先擦除上一个“轮廓”,再画出当前的“轮廓”。如果在图形运动过程中,略过其它图形,那么就把那个图形也擦掉了。
所以如果按照这种重画的方式,图形每变化一点,就要重画一次,那就会闪个不停。
=============
Fxingtianxia()
你给的代码是不是.net的,在VC里不管用啊。
TERRYYRRET 2007-08-17
  • 打赏
  • 举报
回复
顶一下
Fxingtianxia 2007-08-17
  • 打赏
  • 举报
回复
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 );
}
liotion 2007-08-17
  • 打赏
  • 举报
回复
当图像移动或者旋转时 保存背景到一个内存DC中 然后根据移动或者旋转的矩形区域重画到表面上去
some0719 2007-08-17
  • 打赏
  • 举报
回复
楼上说的可行吗?
是说先画到内存中吗?但是要让图形显示出来,不还得画到view的dc里去吗?
关键是当图形移动或旋转的时候,即不能擦除“后面”的图形,又不能反复重画所有图形。
在GDI中用SetRop2很容易解决的问题,怎么到升级版本中这么费事?
idAnts 2007-08-17
  • 打赏
  • 举报
回复
GDI+不支持rop吧。
要不你画到一个dc上,然后StretchBlt,我没试过。呵呵
some0719 2007-08-17
  • 打赏
  • 举报
回复
怎么没人回答?Word里的绘图就是用GDI+做的吧?是怎么实现的?
不知道分层窗口能不能解决这个问题?当编辑某个图形时,把它移到透明窗口中,编辑完再放回去?
GDI+好像不太友好,这么简单的功能也不加上,在网上整整查了一天,都说实现不了XOR。
MS为什么熟视无睹?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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