[音乐]
大家好,本节课我们学习的内容是 画刷与文字输出。
我们都知道 封闭图形包括轮廓线和内部区域,我们刚
学过的笔对,画笔对象,比如说 Pen 对象,它定义了轮廓线的属性
而内部区域的属性呢,就是我们现在马上要学的 Brush 对象,就是笔刷对象来定义。
GDI+ 提供了 几个笔刷类来填充内部区域,包括
SolidBrush,实际上是最常用的,它相当于是个纯色的笔刷 还有 TextureBrush
类的,这个相当于是一个纹理笔刷,相当于是我们可以不光是拿纯色去 刷图形内部区域,还可以拿一个图片。
下面的代码就声明了一个红色的 SolidBrush 对象
像这个红色的啊,大家看看,这儿 red,声明 redBrush,然后 new
的时候,注意 拿你想要什么颜色,就拿什么颜色当参数,去初始化它就可以了
当然也可以使用一个图片来填充图形。
那么就我们用这个,这个 TextureBrush,然后用它呢,我们的,这个的
new 的时候使用的参数就是一个图片,一个特定的 位图,e 盘下根目录 MyPhoto.jpg
这个位图就可以了 再看一下文字如何输出。
我们在输出文字的时候 先要声明一个字体。
应该注意,我们这儿输出文字和我们之前在控件上写文字是不同的
在控件上写文字,我们写出的文字是一个文本类型的,而我们现在往
往那个图形界面上,往界面上去画图的时候去写文字,写出来的 其实是图形。
所以说,我必须要先声明一个字体。
我们这儿声明这个 字体啊,myFavorFont,然后这几个参数是字体的名称、
大小还有字体的风格,比方说这是一个斜体 当声明好字体之后呢,我们就可以按照这个字体来输出文字。
这个 DrawString 呢 也是 Graphics 对象中的一个函数,我可以用它来把这个
String,"Hello World!" 输入出去,用我刚才声明的字体,同时呢用白刷,这儿声明用白刷
这是我写字体所处的我那个坐标位置,要在哪写字 咱们来看补充一下
Graphics 常用的一些另外的一些画图方法
之前那节课,我们学习到了一些基本的画图方法,现在我们看一些另外一些。
比方说一些清除整个绘图面 还有这个绘制一条弧线,贝塞尔样条曲线
然后绘制指定的 Icon 表示的图像,绘制指定的 Image 然后等等等等,然后绘制扇形、
多边形、 矩形等等,这个矩形我们上次课已经学过了,有这个矩形
同时呢我们还有一些命令可以填充内部,填充各种图形的内部,像 FillEllipse
就是填充椭圆的内部,填充扇形的内部,填充多边形和矩形的内部等等 好了,现在让我们马上进入开发环境
开始通过一些例子来实际练习 Windows 绘图吧。
好,同学们 那么我们现在已经来到了开发环境下。
我现在,因为这个相关的,有关图形的相关代码仍然是比较长的
所以我也是提前将这些代码都已经录入好,然后咱们直接开始讲这些代码。
这个有关绘图 的窗体上也没有拖什么控件,咱们直接在这个 Paint 事件里面开始绘图就可以了。
那么现在看这些代码 首先呢,最开始的我们肯定要先把
Graphics 这个对象先获得 然后呢,我们现在初始化这个刷子。
为了方便起见,我们声明了两个刷子,一个是 白刷,一个是黑刷,黑刷,这两个刷子。
然后呢我们是 计划把一个图片显示在我们的这个窗体上,图片显示在窗体上
所以说我们先把这个位图,这个图片我们放在我们这个可执行文件的同一个目录上,当前目录下
所以是一个点,两个杠就可以了,这是当前目录。
然后我们再 声明好我们要用的,一会我们要输出字体的时候,输出 文字的时候用的字体。
我们这用的字体是黑体 然后大小控制在 13,然后把它这个加深,加粗
然后我们现在获得一个客户区的当前大小 这个什么叫客户区呢?这儿有个客户区,客户区
客户区是这个东西,我们说窗体的时候,其实有两种意思 一个是这个窗体整个这个大的矩形的大小
但是这个大的矩形呢,并不是
每一个都是客户都能用的,你像这个图标的部分呀,还有这个最小化
最大化,关闭这些部分,都是其实系统那种,真正客户可以用的是这个小矩形 这个矩形。
这个矩形呢,称为客户区 咱把客户区的大小也先得到。
现在我们做的第一件事情呢,就是把这个 客户区这个窗体,整个都填充为黑色。
大家看到没有,用这个 FillRectangle,然后用黑
用黑刷子,0,0,从这个左上角,一直刷到 右下角,看到没有,一直刷到右下角,整个全把它全部涂黑
注意,这儿为什么要动态地设定这儿的大小呢?
而不是直接在这看看,这儿的坐标大概多少呀?然后这儿写 0 几,0
几几呢? 为什么呢?因为只要这样的话,我可以保证,我一会儿咱们运行的时候这个窗体无论如何地拖动
它都会在执行 Paint 事件的时候把这整个窗体都涂黑,因此必须得动态,而不能是去测量一下再得到
然后下面呢,我们为了把这个
图片放在这个窗体上,先要把这个图片的 那个它的长和宽,高和宽都要得到。
这儿得到了图片的宽度,这儿得到了图片 的高度。
还有我们那个图片呢,因为它大小是固定的,但是我们希望怎么样呢?
希望我们的图片显示在这窗体上的时候,它是居中的,同时呢 我们也希望它能随着我们这个窗体的拖动
大小的变化,动态变化,所以这儿就涉及一个什么问题呢?涉及一个缩放图像的问题
我们这儿呢这句话,大家看注意这句话,其实是计算了一下我们这个
图片的长和宽,和这个窗体的长和宽的比例
因为我们为了,我们一定要保持这个图片的 长宽比例,不能让它变形吧,所以这儿取了一个
main 函数,就是我们算这两个比例,看哪个比例小,就用哪个比例
我们只用一个比例,这样的话,我们保证我们的图片显示上去是不会 变形的。
然后这一步计算呢,其实就是为了 让图片居中,因为咱都知道,图片定位的时候,咱
Windows 定位习惯是用 左上角这个坐标来定位的。
因此,我们如果想要图片居中的话呢 那肯定要把两个图片的,图片的宽度,或者长度
和这个窗体的宽长度,把它们一减再除以个二,大家想想是不是刚好是如果想居中放的位置?
对吧,所以说就这两个例子。
好,下面呢,下面这个语句呢
我们为了把这个图片显示到窗体上,就是这 formRect,我们要把它画到哪?
然后它的来源又是,又是图片的哪个位置?为什么要这么设置呢?因为有时候我们是想把
图片的一小部分,不是全部,放到这个,把它画到窗体上这个 用这种方式就比较方便了。
当然在这我们是要把图片的整个全部都放到窗体上 所以说,这儿这个,imageRect
其实是把这个图片全部都 全部都给 new 出来了,new
成一个矩形,对吧 然后这儿呢是我们要画的位置的矩形,要画的位置的矩形
现在呢咱们,然后现在我们就要输出文字了。
我们输出一个 "诗和远方",然后用我们刚才定义好的这个字体,下面呢,用白
白刷,为什么要用白刷呢?因为我们这个图片还有我们的底色不是黑的吗,我用白的就能看得- 比较清楚。
然后 找一个合适的位置,把它写上去。
咱们现在看一下程序的运行结果 好,大家看到了吗?
这个就是我们这个程序的运行结果。
这个图片其实就是我们在 硬盘上放置的那一张,一张位图,我们拖动的时候其实它也会随之进行变化
大家看是不是进行变化了,是吧?
它同时在变化的过程中,是保持比例不变的,不会出现 因为你拖着这个图片变形的情况。
同时呢大家看这个字,也写到这个里面了啊 这个文字也写到,"诗与远方"写到这了,背景是黑的,这就完全符合我们的预期
但是我们写的代码里面其实还有一个很小的点
刚才我还没有讲到,是哪一个地方呢?其实是这个地方 不在
Paint 这个事件的相应函数里面,是在这个 form1
的构造函数里面,有这么一句话,这个是 之前是没有的。
这句话什么意思呢?这个 this 是指这个 form1 本身 我们把,要把这个
ResizeRedraw 这个属性,把它设成 true,它默认是 false
的 什么意思呢?这个顾名思义,咱们看这个单词的意思就是,当我变换大小的时候
当窗体变换大小的时候,是不是 Redraw,是不是重绘?咱们现在 看看,如果不加这条语句会怎么样
把它先注释掉,咱们再运行一下 好了,看着没什么问题是吧?咱们变一下
大小,嗯?怎么回事?
怎么成这样了呢?原因在哪里呢?原因在如果 这个属性,ResizeRedraw
这个属性是 false 的话,其实 Windows 是非常聪明的 因为它们怎么认为呢?这个
Redraw,就是在这个窗口重绘,它们认为,这个 Windows 认为
我应该能少画就少画,这当然是符合 'iii',因为我们能少画是 比较节省资源的。
因此当你进行变化的时候,大家像 你进行大小变化的时候,是不是?你进行变化的时候
当,比方说我把这个窗体从这么大
拖到这么大的时候,大家想一想,是不是其实这块窗体是跟原来是
重叠的,而这段是新出来的?因此 Windows 是只画新出来的这部分
重叠这部分它不画,它认为原来是一样的,它就能不重画它就不重画 就是这个原因。
所以说嘛,我们为了让我们这个程序显示正常 就得把这个设成
true ResizeRedraw 设成 true,这样就强制规定它,当你 Resize
的时候,你必须得重绘 这样就不会出现刚才那样的情况了
这样就,一切就正常了。
好,这节 课呢,我们学习了画刷,如何把一个图片刷到我们这个窗体上
同时也学会了如何把文字输出到窗体上,当然是以图形方式输出的
谢谢大家!