c#

位置:IT落伍者 >> c# >> 浏览文章

C# GDI+绘图高级编程


发布日期:2019年08月16日
 
C# GDI+绘图高级编程

一般来说Windows的一个优点(实际上是现代操作系统的优点)是它可以让开发人员不考虑特定设备的细节例如不需要理解硬盘设备驱动程序只需在相关的NET类中调用合适的方法就可以编程读写磁盘上的文件这个规则也适用于绘图计算机在屏幕上绘图时把指令发送给视频卡问题是市面上有几百种不同的视频卡大多数有不同的指令集合功能如果把这个i考虑在内在应用程序中为每个视频卡驱动程序编写在屏幕上绘图的特定代码这样的应用程序就根本不可能编写出来这就是为什么在Windows最早的版本中有Windows Graphical Device Interface(GDI)的原因

GDI+提供了一个抽象层隐藏了不同视频卡之间的区别这样就可以调用Windows API函数完成指定的任务了GDI还在内部指出在运行特定的代码时如果让客户机的视频卡完成要绘制的图形GDI还可以完成其他任务大多数计算机都有多个显示设备监视器打印机GDI成功的使应用程序所使用的打印机看起来与屏幕一样如果要打印某些东西而不是显示他们只需告诉系统输出设备是打印机再用相同的方式调用相同的Windows API函数可以

可以看出DC(设备环境)是一个功能非常强大的对象在GDI下所有的绘图工作都必须通过设备环境完成DC甚至可用于不涉及在屏幕或其他硬件设备上绘图的其他操作例如在内存中修改图像

GDI开发人员提供了一个相当高级的API但它仍是一个基于旧Windows API并且有C语言风格函数的API所以使用起来不是很方便GDI+在很大程度上是GDI和应用程序之间的一层提供了更直观基于继承性的对象模型尽管GDI+基本上是GDI的一个包装器但Microsoft已经能通过GDI+提供新的功能了并宣称他又一些性能方面的改进

GDI+命名空间

(不说了自己看去吧!!!)

设备环境和Graphics对象

GDI使用设备环境(DC)对像识别输出设备DC对象存储特定设备的信息并把GDI API函数调用转换为要发送给设备的命令还可以通过DC对象确定对应的设备有什么功能(如打印机是彩色还是黑白的)如果要求设备完成它不能完成的任务设备对象就会检测到并采取措施

DC对象不仅可以硬件还可以用作到Windows的一个桥梁例如如果Windows知道只有一小部分应用程序窗口需要重新绘制DC就可以捕获和撤销在该地区外的绘图工作因为DC与Windows的关系非常密切通过Dc来工作就可以用其他方式简化代码

绘制图形

下面举例来说明如何在应用程序的主窗口中绘图DisplayAtStartup

创建一个C# 应用程序并在启动窗体时在构造函数中绘制它这并不是在屏幕上绘图的最佳方式这个示例并不能在启动后按照需要重新绘制窗体这样只是不必作太多的工作就可以说明一些问题

首先把窗体的背景色设置为白色如果使用设计视图设置背景色系统会自动添加代码

private void InitializeComponent()

{

thisAutoScaleBaseSize = new SystemDrawingSize();

thisBackColor = SystemDrawingColorWhite;

thisClientSize = new SystemDrawingSize();

thisName = Form;

thisText = Form;

}

接着给Form构造函数添加代码使用窗体的CreateGraphics()方法创建一个Graphics对象其中包括绘图时需要的使用的Windows DC创建的DC即与显示设备相关也与窗口相关

public Form()

{

InitializeComponent();

Graphics dc = thisCreateGraphics();

thisShow();

Pen bluePen = new Pen(ColorBlue);

dcDrawRectangle(bluePen); //矩形

Pen redPen = new Pen(ColorRed);

dcDrawEllipse(redPen); // 椭圆

}

然后调用Show()方法显示窗口必须让窗口立即显示因为在其显示之前不能作任何工作(没有绘图的地方)

最后显示一个矩形和椭圆注意其中坐标(xy)表示从窗口的客户区域左上角向右的X个像素

向下的Y个像素

(其中DrawRectangle()和DrawEillipse()这两个函数前面已经讲过不再重复了)

上面程序窗体如果最小化再恢复绘制好的图形就不见了如果在该窗体上拖动另一个窗口使之只遮挡一部分图形再把该窗口拖离这个窗体临时被遮挡的部分就消失了只剩下一半椭圆或矩形了!原因是如果窗体的一部分被隐藏了Windows通常会立即删除与其中显示的内容相关的所有信息在窗口的某一部分消失时那些像素也就丢失了(即Windows释放了保存这些像素的内存)

但要注意窗口的一部分被隐藏了当它检测到窗口不再被隐藏时就请求拥有该窗口的应用程序重新绘制其内容这个规则有一些例外窗口的一小部分被挡住的时间比较短(显示菜单时)一般情况下应用程序就需要在以后重新绘制它

由于本示例把绘图代码放在Form的构造函数中故不能在启动后再次调用该构造函数进行重新绘制

上一篇:C#操作XML

下一篇:c#实现猴子选大王算法