要做一个绘图程序,能画线条、矩形、圆形等,并可以选取、编辑、旋转图形
开始的时候用GDI做,但处理图形旋转很麻烦,所以改用GDI+。
但查了许久,也没找到实现XOR绘图的函数。
请问如何实现类似GDI中 pDC->SetRop2(R2_NOT)的功能?还是有什么替代方法?
开始的时候用GDI做,但处理图形旋转很麻烦,所以改用GDI+。
但查了许久,也没找到实现XOR绘图的函数。
请问如何实现类似GDI中 pDC->SetRop2(R2_NOT)的功能?还是有什么替代方法?
不知道分层窗口能不能解决这个问题?当编辑某个图形时,把它移到透明窗口中,编辑完再放回去?
GDI+好像不太友好,这么简单的功能也不加上,在网上整整查了一天,都说实现不了XOR。
MS为什么熟视无睹?
要不你画到一个dc上,然后StretchBlt,我没试过。呵呵
是说先画到内存中吗?但是要让图形显示出来,不还得画到view的dc里去吗?
关键是当图形移动或旋转的时候,即不能擦除“后面”的图形,又不能反复重画所有图形。
在GDI中用SetRop2很容易解决的问题,怎么到升级版本中这么费事?
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 );
}
当图像移动或者旋转时 保存背景到一个内存DC中 然后根据移动或者旋转的矩形区域重画到表面上去
-------------
恐怕不行吧,因为在鼠标拖动过程中,要画出图形在某位置的临时“轮廓”。(和word中的绘图功能一样)
这就需要先擦除上一个“轮廓”,再画出当前的“轮廓”。如果在图形运动过程中,略过其它图形,那么就把那个图形也擦掉了。
所以如果按照这种重画的方式,图形每变化一点,就要重画一次,那就会闪个不停。
=============
Fxingtianxia()
你给的代码是不是.net的,在VC里不管用啊。
一般是这样处理,GDIPlus里面有路径,GDI里面也有路径,他们的数据是一样的
一般是这样处理,GDIPlus里面有路径,GDI里面也有路径,他们的数据是一样的
------------------------
能详细说说吗?今天试了分层窗口,在程序中创建一个分层窗口,当窗口类型是popup 或 overlapped时,主窗体就灰了。当类型是child时,分层窗口函数就出错了。据说WS_CHILD类型的对话框不支持分层窗口……现在正在试双缓冲 ,Grapics类型变量好像不能作为参数传递……
------------------------------------
GDI+绘图是用Graphics
GDI绘图是用CDC
怎么互换?查到过.net有用托管类实现混合编程的文章
但VC中没发现有类似的方法,是不是用GDI+获得图形的路径,然后通过GDI以异或的方式填充这个路径?前两天采用双缓冲的方式,不断刷新客户区,客户区没有明显的闪烁,但后面的窗体、桌面图标会闪。在任务管理器中发现来回拖拽图像时CPU占用100%……
今天又看了word中的绘图功能,图形相交的位置没有因异或而产生的白点,拖动图形时CPU占用率几乎没有变化。不知道用的什么技术?
还有很多,你自己找找至于这个--
今天又看了word中的绘图功能,图形相交的位置没有因异或而产生的白点,拖动图形时CPU占用率几乎没有变化。不知道用的什么技术?
--------------------
估计是有的图层技术,可以看看PAINTER的实现
还有很多,你自己找找
===============
好像是vc.net的,谢谢,我研究一下
================
PAINTER是画图程序吗?有源码吗?
画图程序好象是用GDI做的,因为线条没有平滑的效果,也不支持图形的编辑。
在网上找vc的图层技术往往是跟mapx等第三方工具有关的,还没找到vc自己实现图层的例子。