[音乐] 同学们好。
大家现在对 Windows 编程已经初窥门径了 可以使用各类控件搭建出一些有用的东西了
和控制台程序相比,Windows 程序界面美观,对用户十分友好
是的,控制台程序和 Windows 程序的一个典型区别
就是控制台程序通常都是字符界面,而 Windows
程序是图形界面 现在我们就要进一步学习,如何在窗口上绘制出美丽的图画
使我们的窗口更美、 更精彩
为了学习如何在窗口上绘图,我们需要解决三个问题 首先,在哪画图?就
Where 我们如何确定画图的位置呢?
第二,是如何画图? How?一个个图形是如何画到窗口上的?
最后,何时画图?就是 When
由于 Windows 编程的特殊性,如果我们不仔细研究,在一个错误的时间的画图的话
得到的结果很可能和我们期望相差很远 为了解决第一个问题
我们可以先了解一下 Windows 的坐标系统 在 Windows
系统中 能够放置其他对象的对象称为容器
比如,控件放置在窗体对象中 窗体放置在屏幕对象中等等
而每个容器呢,都有一个坐标系统,用于定位对象
这个坐标系统的默认设置是 容器的左上角为坐标原点,横向向右
为 X 轴方向,纵向向下为 Y
轴 方向,默认的长度单位是像素
也就是说,对于屏幕来说,像屏幕的左上角
就是原点了,左上角就是原点,对于窗口上来说,窗口的左上角 就是它的原点
在程序中,我们一般用 Point
结构来描述窗口上点的坐标 这个结构非常简单,比如这样,声明一个
Point 结构 pt1 它的坐标就是 (30,
30),就是 X 的坐标 是 30,Y 轴坐标是 30。
再声明一个新的 Point 变量,pt2,就是 (110,
110),它们的 坐标就是 X 轴是,X 轴坐标是 110,Y
轴坐标也是 110 现在我们来解决第二个问题,如何画图?在
Windows 中,我们是使用 GDI+,即图形 设备接口来处理相关的绘图功能了。
为什么到最后有个加号呢? 是因为这个 GDI+ 是从 Windows XP
才开始使用的 上一代的图形设备接口叫 GDI
现在增添了很多新的功能,就起名叫 GDI+ 了 GDI+
其实就是用来与特定设备进行交互的一些类 GDI+
可以创建图形,绘制文本 以及将图形、
图像作为对象来操作 GDI+ 中最主要的对象就是
Graphics 对象 它封装了 GDI+ 的图画板,是
GDI+ 绘图中最核心的类 其实我们可以把 Graphics
对象理解为一张画布 我们要画绘图,总需要一个绘画的目标吧?那就是这个对象
在进行绘画之前,总是要先创建一个 Graphics
对象 然后才可以使用 GDI+ 绘制线条和形状啊
呈现文本,或显示其他操作图像。
此外呢,我们 还有一些其他的 GDI+ 对象,依赖于 Graphics
对象,首先是个 Pen,这个 Pen 就是画笔对象 它可以画线、
多边形、 矩形、 弧等外围的轮廓部分
还有这个 Brush,是画刷对象,指定颜色、
样式、 纹理等等,用来填充封闭的图形,就是用 Pen
来把轮廓画好,用 Brush 把中间的颜色填充起来。
还有 Font 对象,是来描述字体的样式,就是如果我们
要在这个窗口上写字,我们就可以调用 Windows
内置的很多字体,就使用这个对象来使用 还有 Color
对象,就可以描述颜色 这些对象具体如何使用,我们都会在后续的例题中讲述
最后就解决第三个重要 问题,何时画图了。
很多同学在这里会比较疑惑 为什么老师总是要强调绘图的时机问题?这主要是因为,Windows
是一个复杂的多任务操作系统,同时可以打开非常多的窗口
有的窗口可见,有的窗口 不可见,而窗口呢,有时可见,有时又不可见
经常频繁地出出进进。
你在窗口上刚好绘好,刚刚绘好了图
立刻可能弹出一个弹窗,把你的窗口挡住,那你绘好的图,岂不是就相当于被别的窗口给
擦除了吗?所以必须建立几个机制,避免这种情况,就是我们这马上要讲的
Paint 事件。
凡是有必要重绘窗体的时候 都会触发该事件。
什么时候是有必要 重绘窗体的时候呢?一般有以下几种情形
最小化,最大化,当我们点击最小化,是不是那窗口直接缩小
成一个图标了?最大化它又占满了整个屏幕,此时窗口上内容都需要 重新绘制。
还有被其他窗体挡住 挡住之后虽然说不用重画,因为挡住之后咱们就看不见了嘛,但是如果
其他窗体又走了,又关掉了,又需要重新显示出来,此时你就要把窗口的 绘画内容要重新再画一遍。
第三是要移动窗体的时候 因为我们移动窗体的时候,一开始窗体是在一个位置
我们移动后到了另外一个位置,我们需要在另外一个位置重绘窗口 对于窗体的所有绘图都应该在
Paint 事件中进行 这样才可以使我们的绘制始终可见
这就是这个事件的处理方法 我们可以看到,这个事件
除了有这个我们之前讲过这个 sender 参数之外,还有一个 这个
PaintEventArgs 参数,从该 参数中,我们就可以得到刚才我们说过的很重要的那
Graphics 对象 然后我们就可以进行一系列的绘图工作了
现在我们回顾一下本节课学习的三个关键点 坐标系统解决了在哪画的问题
GDI+ 和 Graphics 对象解决了如何画的问题 而
Paint 事件解决了何时画的问题 这样,我们 Windows
绘图的前进障碍已经被全部攻克了 谢谢大家,我们期待下次课的具体实践吧!
[空白_录音]