为什么直接gdi+通过画布word2003绘图画布显示的字有重影

GDI+使用双缓冲绘图
&&&&&&&&&&&&&&&&&&&&&&&&
我再来详细解释一下刚才实现双缓冲的具体步骤:
1、在内存中建立一块&虚拟画布&:
Bitmap bmp = new Bitmap(600, 600);
2、获取这块内存画布的Graphics引用:
Graphics g = Graphics.FromImage(bmp);
3、在这块内存画布上绘图:
g.FillEllipse(brush, i * 10, j * 10, 10, 10);
4、将内存画布画到窗口中
this.CreateGraphics().DrawImage(bmp, 0, 0);
====================
maybe better
dcMemory.CreateCompatibleDC(&dc);
bmp.CreateCompatibleBitmap(&dc,);
dcMemory.SelectObject(&bmp);
Graphics _Graphics(dcMemory.m_hDC);
_Graphics.DrawImage(_pImage,0,0,);
//这是在GDI+中的写法。
dc.BitBlt(0,0,,&dcMemory,0,0,SRCCOPY);
_Graphics.ReleaseHDC(dcMemory.m_hDC);
dcMemory.DeleteDC();
bmp.DeleteObject();
OnEraseBkgnd(CDC* pDC)需要返回TRUE。
阅读(...) 评论()> c# GDI+简单绘图(四)
c# GDI+简单绘图(四)
  前几篇我已经向大家介绍了如何使用GDI+来绘图,并做了一个截图的实例,这篇我向大家介绍下如何来做一个类似windows画图的工具.  个人认为如果想做一个功能强大的绘图工具,那么单纯掌握GDI还远远不够,我的目前也只能做一个比较简单的绘图工具了.不足之处,欢迎大家讨论!  先来看一下最终效果吧:  主要实现功能:画直线,矩形,橡皮,圆形,切换颜色,打开图片,保存图片,清除图片,手动调节画布大小;软件刚启动时,为一张空白画布,我们可以直接在画布上绘画,也可以通过菜单中的&打开&,导入一张图片,然后我们就可以在这张图片上进行绘制。  平台:VS2005 WINFORM  由于代码过多,在这里只简要介绍下制作步骤,提供大家工程下载.  1.对整个界面进行布局.  2.实现绘图工具的功能  3.实现颜色拾取的功能,这里我们直接拿上次写的自定义控件来用.  4.实现菜单功能  5.实现手动调节画布大小的功能  6.测试  实现绘图工具的功能  为了让代码藕合度小点,稍许用了些设计模式,因为不是很会,所以代码还是有点乱乱的,嘿嘿!关于绘图工具的这些功能块全部写在了DrawTools这个类里.那么在主窗体中,只需要调用这个类来完成绘制就行了,而不需要过多的涉及到具体的绘图代码。绘图工具这个类提供的主要工具就是:铅笔、橡皮、直线、矩形、圆形、实心矩形、实心圆形。关于这些功能块的代码,并不难,只要大家对认真看过前几篇内容,那应该都看得懂。  这里要注意以下几点:
本文地址 :
------分隔线----------------------------VC/MFC(11)
在windows下绘图可以借助一些图形库用DrawLine和DrawCirccle这样的程序来画些基本图形元素,但是一旦出现新的标准就意味着要想办法支持最新的硬件,即使用升级版的图形库,将新代码加入自己的程序或给新视卡写驱动程序。对图形编程人员来说,其工作平台一直在变动,为了使程序与打印机和其他输出设备有适当的接口,还要做大量的工作。
通过给微机平台引入与硬件设备无冠的图形输出模式,windows改变了上述的被动局面,在windows中只要有相应的windows驱动程序,您所编写的代码就可以在任何图像适配器上运行,将输出发送到屏幕上的代码同样可用于打印机和其他硬拷贝设备上。也就是说,这种方法的优点就是不需要去为程序运行的具体硬件环境费心,而是去花时间编写应用程序代码上,也不需要第三方图形库。而windows中负责图形输出的是Graphics Device
Interface(图形设备结构,简称GDI),能够实现一些简单的绘图操作。
windows程序在屏幕、打印机或其他输出设备上画图时,它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表(DC)表示的逻辑意义上的“显示平面”上去。打个比方就是先在一块画布上画图,然后将画布贴到设备上。
画图流程是:1、画图之前windows程序从GDI获取设备描述表句柄;2、每次调用GDI输出函数时将句柄返回给GDI。若无有效的设备描述表句柄,则GDI不会画第一个像素点。
设备描述表类
MFC的CDC类将windows设备描述表和获取设备描述表句柄的GDI函数就近封装在一起,CDC的派生类则代表不同类型的设备描述表。
用于在窗口客户区画图(仅限于OnPaint处理程序)
用于在窗口客户区画图(除OnPaint处理程序外的任何处理程序)
用于在窗口内任何地方画图,包括非客户区
CMetaFileDC
用于向GDI元文件画图
在MFC应用程序中获取设备描述表有一种方法是:调用CWnd::GetDC,它返回表示windows设备描述表的CDC对象的指针。画图完毕时要用CWnd::ReleaseDC释放由CWnd::GetDC获取的设备描述表指针。
CDC * pDC = GetDC();
// Do some drawing
ReleaseDC(pDC);同样的程序代码出现在OnPaint程序中,则需用CWnd::BeginPaint和CWnd::EndPaint分别代替GetDC和ReleaseDC以保证合理地处理WM_PAINT消息
void CMFCApplicationDlg::OnPaint()
// 自动生成代码
PAINTSTRUCT
CDC * pDC = BeginPaint(&ps);
// Do some drawing
EndPaint(&ps);
}另外,CDC类可以直接进行实例化,构造函数和析构函数调用相应的函数捕获和释放设备描述表
在栈中实例化
CPaintDC dc(this);
// Do some drawing在堆中实例化
CPaintDC * pDC = new CPaintDC(this)
// Do some drawing
delete pDC;
在OnPaint处理程序外画图则需要使用CClientDC和CWindowDC类
例如在接收到鼠标单击事件(WM_LBUTTONDOWN消息)时画一个X连接窗口客户区的四角代码如下
void CMFCApplication2Dlg::OnLButtonDown(UINT nFlags, CPoint point)
GetClientRect(&rect);
CClientDC dc(this);
dc.MoveTo(rect.left, rect.top);
dc.LineTo(rect.right, rect.bottom);
dc.MoveTo(rect.right, rect.top);
dc.LineTo(rect.left, rect.bottom);
如果需要使用非客户区(标题栏、窗口边框等),则可使用CWindowDC类。有时可以用CWindowDC类创造特殊效果,例如用户自己绘制标题栏和带圆角的窗口。一般情况下CWindowDC并不常用。如果想在非客户区作图,可以借助OnNcPaint处理程序捕获WM_NCPAINT消息确定非客户区需要绘制的时间。与OnPaint不同,OnNcPaint处理程序不需要也不应当调用BeginPaint和EndPaint。
更少见的场合是程序需要全屏幕的访问权,此时给构造函数传送NULL指针,例如
CClientDC dc(NULL);
dc.Ellipse(0, 0, 100, 100);即在屏幕左上角画一个圆。截屏软件经常使用全屏DC访问整个屏幕。
设备描述表属性
当使用CDC输出函数在屏幕上画图时,输出的某些特性并没有在函数调用过程中规定,但可通过设备描述表自身获得。
CDC::SetTextColor
CDC::GetTextColor
CDC::SetBkColor
CDC::GetBkColor
CDC::SetBkMode
CDC::GetBkMode
CDC::SetMapMode
CDC::GetMapMode
R2_COPYPEN
CDC::SetROP2
CDC::GetROP2
CDC::MoveTo
CDC::GetCurrentPosition
CDC::SelectObject
CDC::SelectObject
WHITE_BRUSH
CDC::SelectObject
CDC::SelectObject
SYSTEM_FONT
CDC::SelectObject
CDC::SelectObject
比较常用的是SelectObject将GDI对象选入设备描述表,下面所列的是常用的6个GDI对象
画笔(Pen) 画刷(Brush) 字体(Font) 位图(Bitmap) 调色板(Palette) 区域(Region)
每当凑个windows中获取设备描述表时,设备描述表都被设置为默认值。如果不想反复对设备描述表进行初始化设定,那么可用CDC::SaveDC函数保存它的状态,并在下次使用时用CDC::RestoreDC将它恢复。另一种方法是注册一个自定义的WNDCLASS其中包含CS_OWNDC样式,CD_CLASSDC,它分配一个“半私有”设备描述表,该设备描述表可被同一WNDCLASS创建的所有窗口共享。当GDI对象被选入某个私有设备描述表后,如果没有被显示地替换,则它们依旧处于选择状态。
GDI将像素点输出到逻辑显示平面上时,它不只是简单地输出像素点颜色,而是通过一系列的布尔运算将输出像素点颜色和输出目标位置上像素点的颜色合成在一起。所使用的逻辑关系由设备描述表当前的绘图模式确定。默认绘图模式为R2_COPYPEN,它将像素点复制到显示平面上。
例如使用dc.SetROP2(R2_NOT);再用同样的颜色画同样的线就可以擦除之前画的线。
映射模式是设备描述表的属性,用于确定从逻辑坐标值到设备坐标值的转换方式。传送给CDC输出函数的是逻辑坐标值。设备坐标值是指窗口中相应的像素点位置。
用dc.Rectangle(0, 0, 200, 100);调用Rectangle函数时不用告诉GDI画一个200个像素点宽,100个像素点高的矩形,而是告诉它画一个200个单位宽,100个单位高的矩形。在默认映射模式MM_TEXT下,一个像素点相当于一个单位。在其他映射模式中,逻辑单位被解释成不同的设备单位。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3302次
排名:千里之外
原创:11篇GDI+绘不同图片不同文字,结果大小不同,请教。
[问题点数:40分,结帖人xiaolinyouni]
GDI+绘不同图片不同文字,结果大小不同,请教。
[问题点数:40分,结帖人xiaolinyouni]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年3月 .NET技术大版内专家分月排行榜第三2015年2月 .NET技术大版内专家分月排行榜第三
2016年1月 MS-SQL Server大版内专家分月排行榜第二2015年12月 MS-SQL Server大版内专家分月排行榜第二2015年11月 MS-SQL Server大版内专家分月排行榜第二2015年5月 MS-SQL Server大版内专家分月排行榜第二2015年4月 MS-SQL Server大版内专家分月排行榜第二2015年1月 VB大版内专家分月排行榜第二2015年1月 MS-SQL Server大版内专家分月排行榜第二2014年12月 VB大版内专家分月排行榜第二2014年11月 MS-SQL Server大版内专家分月排行榜第二2014年9月 MS-SQL Server大版内专家分月排行榜第二2013年8月 VB大版内专家分月排行榜第二2013年6月 VB大版内专家分月排行榜第二2013年5月 VB大版内专家分月排行榜第二2010年4月 VB大版内专家分月排行榜第二2010年3月 VB大版内专家分月排行榜第二2008年12月 VB大版内专家分月排行榜第二2008年8月 VB大版内专家分月排行榜第二2008年7月 VB大版内专家分月排行榜第二2007年11月 VB大版内专家分月排行榜第二
2015年6月 MS-SQL Server大版内专家分月排行榜第三2015年3月 MS-SQL Server大版内专家分月排行榜第三2015年2月 MS-SQL Server大版内专家分月排行榜第三2014年12月 MS-SQL Server大版内专家分月排行榜第三2014年10月 VB大版内专家分月排行榜第三2014年10月 MS-SQL Server大版内专家分月排行榜第三2014年8月 MS-SQL Server大版内专家分月排行榜第三2013年9月 VB大版内专家分月排行榜第三2013年3月 VB大版内专家分月排行榜第三2012年5月 VB大版内专家分月排行榜第三2012年4月 VB大版内专家分月排行榜第三2010年10月 VB大版内专家分月排行榜第三2010年8月 VB大版内专家分月排行榜第三2010年7月 VB大版内专家分月排行榜第三2009年5月 VB大版内专家分月排行榜第三2008年9月 VB大版内专家分月排行榜第三2008年4月 VB大版内专家分月排行榜第三2008年2月 VB大版内专家分月排行榜第三
2015年3月 .NET技术大版内专家分月排行榜第三2015年2月 .NET技术大版内专家分月排行榜第三
2016年1月 MS-SQL Server大版内专家分月排行榜第二2015年12月 MS-SQL Server大版内专家分月排行榜第二2015年11月 MS-SQL Server大版内专家分月排行榜第二2015年5月 MS-SQL Server大版内专家分月排行榜第二2015年4月 MS-SQL Server大版内专家分月排行榜第二2015年1月 VB大版内专家分月排行榜第二2015年1月 MS-SQL Server大版内专家分月排行榜第二2014年12月 VB大版内专家分月排行榜第二2014年11月 MS-SQL Server大版内专家分月排行榜第二2014年9月 MS-SQL Server大版内专家分月排行榜第二2013年8月 VB大版内专家分月排行榜第二2013年6月 VB大版内专家分月排行榜第二2013年5月 VB大版内专家分月排行榜第二2010年4月 VB大版内专家分月排行榜第二2010年3月 VB大版内专家分月排行榜第二2008年12月 VB大版内专家分月排行榜第二2008年8月 VB大版内专家分月排行榜第二2008年7月 VB大版内专家分月排行榜第二2007年11月 VB大版内专家分月排行榜第二
2015年6月 MS-SQL Server大版内专家分月排行榜第三2015年3月 MS-SQL Server大版内专家分月排行榜第三2015年2月 MS-SQL Server大版内专家分月排行榜第三2014年12月 MS-SQL Server大版内专家分月排行榜第三2014年10月 VB大版内专家分月排行榜第三2014年10月 MS-SQL Server大版内专家分月排行榜第三2014年8月 MS-SQL Server大版内专家分月排行榜第三2013年9月 VB大版内专家分月排行榜第三2013年3月 VB大版内专家分月排行榜第三2012年5月 VB大版内专家分月排行榜第三2012年4月 VB大版内专家分月排行榜第三2010年10月 VB大版内专家分月排行榜第三2010年8月 VB大版内专家分月排行榜第三2010年7月 VB大版内专家分月排行榜第三2009年5月 VB大版内专家分月排行榜第三2008年9月 VB大版内专家分月排行榜第三2008年4月 VB大版内专家分月排行榜第三2008年2月 VB大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 android 画布绘图 的文章

 

随机推荐