《Windows编程循序渐进》——对话框应用程序2
- 通用字体对话
声明一个LogFont和一个COLORREF私有变量:
给Button添加代码如下:
运行后我们发现设置字体后并不会产生效果:
Why?OnPaint会在这里进行响应:
添加代码如下:
运行,选择字体:
运行结果如下:
我们回顾一下代码结构:
我起初在处下断点运行,发现这个代码执行过程会断下两次,都是在要出现MFCFont对话框时,所以推断这个是专门用来画出主对话框的。
当我们设置完字体,代码运行到这里时:
显示的效果是这样的:
即只画出了主对话框,并没有显示出客户区,后边通过设置客户区的字体、颜色、内容等操作,来绘画出客户区:
- 通用颜色对话框
这就是通用颜色对话框:
设置界面如下:
给对话框类添加私有成员:
还有添加一个私有成员函数:
Button按钮响应的代码如下:
因为需要在主对话框内绘制颜色方框,所以需要在OnPaint下面添加绘制的相关代码:
我们最好还要在初始化的时候就绘制出来这个区域, 于是添加代码:
这里只是初始绘制一个区域,而并非添加一个空间,所以在资源视图中是看不到这个区域的:
但一运行就会有这样的一个区域:
这些代码的执行流程如下:
其中,这段代码:
表示,一旦我们点击了颜色对话框的OK按钮(cdlg.Dodal()==IDOK),就会把当前已经选择了的颜色进行设置和记录:
并进入到Invalidate(),从而调用函数。这个函数中的这些代码:
会帮我们使用刚才保存的颜色,并新建画刷来绘制一个区域(这个区域已经被初始化过):
下面我们要添加的功能是根据三个编辑框中的数值,来确定绘制区域所要绘制出的颜色。那么我们就要给编辑框添加事件:
添加change事件:
并添加代码:
取消掉私有成员Byte r,g,b。而去给三个编辑框添加变量:
这里的代码思路是,当编辑框中的数值改变,通过UpdateDate,改变后的数据就会被载入到内存,也就是r/g/b在这一瞬间就被重新赋值并写入内存了。然后再调用Invalidate将图重新画出来(重新画出来的过程在主对话框的OnPaint方法中有)。
运行效果如下: