一、基础知识
1、图形设备上下文
(1)句柄
windows API是一个个C语言样式函数,应用程序通过一种叫做句柄的整数类型数据访问大部分的操作系统资源。例如,程序访问文件、网络资源,图片,创建窗体等都会事先调用API函数获得一个句柄,句柄可以理解成为系统资源的唯一编号。
(2)图像上下文句柄
应用软件进行图形绘制操作前也得使用API函数申请一个图形设备上下文句柄,其后所有的图形操作都针对这个句柄进行。
2、解决用户界面闪烁的三个方法
剪切矩形技术、脏矩形技术、双缓存技术
双缓存技术:是解决用户界面闪烁的最可靠的方法。开发人员首先在内存中建立一个位图图像用于缓存用户界面样式,然后所有的绘图操作都在这个内存中的位图中进行,绘图操作完成后就可以将这个位图图像快速的输出到实际的显存中,从而显示到计算机显示器中。
缺点:双缓存技术是一种空间换时间的做法,会增加内存的使用量。
3、GDI+
GDI(Graphics Device Interface,图形设备接口),主要负责Windows系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。在GDI的所有类中,Graphics类是核心,在绘制任何图形之前,一定要先创建或得到一个Graphics类的对象。
Graphics对象理解成一个画图环境,这个画图环境包括:要画在什么东西上,用什么画(什么颜色,类型的画笔,画刷),怎么画(画圆形还是方形等等)。
4、矢量图和位图
矢量图:使用平面几何中的点线面等抽象概念描绘图形。矢量图处理复杂,但数据量小,可无极缩放;
位图:采用大量的密集像素二维数组描绘图形。位图显示简单、存储格式简单,但数据量大,放大效果差。
5、图形坐标系系统
(坐标系)
计算机系统大多使用笛卡尔坐标系
计算机系统中以左上点为原点,X轴朝右,Y轴朝下。
(2)像素
坐标系大多以像素为单位。
6、计算机开发图形的基本原理
所需要工具:画布、画笔、画刷、度量、颜色
二、使用过程
1、Graphics
Graphics相当于画布。
创建Graphics对象的方法
方法一:在窗体或控件的Paint事件中创建Graphics对象
(1)如在winform下PixtureBox控件下创建双击Paint
(2)创建Graphics对象
private void ShowPictureBox1_Paint(object sender, PaintEventArgs e)
{
graphics = e.Graphics;//创建Graphics对象
}
方法二:
调用控件或窗体的CreateGraphics方法以获取Graphics对象的引用
Graphics g;
g=this.CreateGraphics();//this代表的是form窗体本身,所以表明现在要在form上进行作图
方法三:
由Image 继承的任何对象创建Graphics对象。
Bitmap mbit=new Bitmap(@"C:\MR.bmp");
Graphics g=Graphics.FromImage(mbit);
1、获取鼠标相对位置的方法
Point mousePos;
//获取鼠标相对于当前窗体的位置
mousePos = PointToClient(MousePosition);
//获取鼠标相对于屏幕左上点的位置
mousePos = PointToScreen(MousePosition);
//偏移位置
mousePos.Offset(3, 20);
三、使用案例
1、使用GDI+绘制刻度尺
(1)添加一个panel控件到窗体
注意panel控件的默认属性是不可见的,需要将visible的属性设置为true
(2)给panel控件绑定paint事件
我所理解是当设置或者更改Panel的大小时,就是触发paint事件
(3)设置panel的大小和位置
panel用来给picturebox控件做标尺,宽度等于picturebox控件的宽度,高度自定义
private void ChangeUI()//更改刻度
{
//增加横刻度
Point a = new Point(showWaterfallL.Location.X, showWaterfallL.Location.Y);//获取刻度显示的位置
pan_FigAxis_X.Location = a;
pan_FigAxis_X.Width = showWaterfallL.Width;//设置刻度的总宽度
pan_FigAxis_X.Height = 15;//设置刻度的总高度
}
(4)将ChangeUI()函数在合适的事件中调用
panel的大小要跟随着picturebox控件的大小改变而改变
将ChangeUI()函数添加到以下事件里调用
窗口加载事件:
窗口大小变化事件:
图片大小更改事件:
(5)编写panel控件paint事件的影响内容
private void pan_FigAxis_X_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Brush bh = new SolidBrush(Color.Black);//定义一个单色画刷
for (int i = 0; i <= pan_FigAxis_X.Width; i += 5)//根据
{
if (i % 25 != 0 && i % 50 != 0)
{
g.DrawLine(new Pen(new SolidBrush(Color.Black), 1), new Point(i, 0), new Point(i, 3));//小刻度
}
if (i % 25 == 0 && i % 50 != 0)
{
g.DrawLine(new Pen(new SolidBrush(Color.Black), 1), new Point(i, 0), new Point(i, 5));//中刻度
}
if (i % 50 == 0)
{
g.DrawLine(new Pen(new SolidBrush(Color.Black), 1), new Point(i, 0), new Point(i, 8));//大刻度
g.DrawString(i.ToString (), new Font("宋体", 5), bh, new Point(i, 8));
}
}
}
以上用到了画笔、画刷、绘制几何图形(线)、绘制文字
设置画笔:
构造函数的格式
public pen(Color color ,float width);//设置画笔的颜色和宽度
设置画刷:
Brush类主要用于设置画笔,以填充几何图形,Brush类是一个抽象基类,不能进行实例化,如需要创建一个画笔对象,需要使用Brush派生类,如SolidBrush
SolidBrush类用于定义单色画刷
创建一个画刷对象。设置画刷的颜色为红色
Brush mybs=new SolidBrush(Color.Red);
绘制直线:
g.DrawLine(pen,point0,point1);
绘制文本
g.DrawString("内容",new("宋体",16)0,brush,10,10);