第0章 术语和约定说明 1
第1节 本书中使用的术语 1
第2节 本书实例代码中的约定说明 2
第1章 文档/视图结构的背景 3
FAQ 1.1 什么是文档/视图结构? 3
FAQ 1.2 使用文档/视图结构的好处是什么? 3
FAQ 1.3 文档/视图结构的组件有哪些?它们彼此间如何联系? 4
FAQ 1.4 文档的作用是什么? 7
FAQ 1.5 视图的作用是什么? 8
FAQ 1.6 视图框架窗口的作用是什么? 9
FAQ 1.7 文档模板的作用是什么? 9
FAQ 1.8 文档模板资源ID的作用是什么? 10
FAQ 1.9 如何创建文档/视图结构的组件对象? 12
FAQ 1.10 MFC如何发送命令消息? 13
FAQ 1.11 MFC如何执行标准的菜单命令? 16
第2章 文档和文档模板 20
第1节 管理文档模板 20
FAQ 2.1 在应用程序中如何创建并引用多文档模板? 20
FAQ 2.2 当用户每次创建一个新文档时,如何管理多文档模板而不用弹出对话框? 23
FAQ 2.3 如何创建具有一个新的文档模板资源ID的资源? 28
FAQ 2.4 当打开一个文档时,MFC如何选择所使用的文档模板对象? 30
FAQ 2.5 如何把多个文档扩展名与同一个文档或视图类关联? 34
第2节 管理文件 38
FAQ 2.6 如何防止一个MDI应用程序在启动时打开一个新(空)文档? 38
FAQ 2.7 如何编程来创建一个新(空)文档? 43
FAQ 2.8 如何编程来打开一个已存在的文档文件? 47
FAQ 2.9 如何使应用程序保存上一次的活动文档,并自动地再次打开它? 48
FAQ 2.10 如何使文档自动地保存而不用提示用户? 53
FAQ 2.11 如何实现“Save all doucuments”菜单命令,该命令在保存每个修改过的文档时不用提示用户? 54
FAQ 2.12 如何编程来关闭一个文档? 59
FAQ 2.13 如何实现“Close all documents”菜单命令? 61
第3节 管理当前文档列表(Recent Files List,MRU) 66
FAQ 2.14 如何定制在“File ’菜单内显示的当前文档数? 66
FAQ 2.15 如何编程在Recent Files表中增加一个特殊的字符串? 70
FAQ 2.16 如何截取用户选择的Recent Files项? 73
FAQ 2.17 如何使应用程序自动地打开在Recent File表顶部列出的文档? 76
第4节 其他条目 77
FAQ 2.18 如何得到指向当前活动文档的指针? 77
FAQ 2.19 如何遍历当前打开的所有文档列表? 81
FAQ 2.20 为什么我的应用程序没有在Windows Explorer中注册它的文档文件,如何解决这一问题? 87
第3章 视图和框架窗口 90
第1节 综合主题 90
FAQ 3.1 如何在我的应用程序中增加一个新类型的视图或框架窗口? 90
FAQ 3.2 如何选择是在视图类还是在视图的框架窗口类内实现某种特殊行为? 95
第2节 打开和关闭视图以及框架窗口 96
FAQ 3.3 如何编程打开一个基于特殊文档模板的视图? 96
FAQ 3.4 如何在每次创建新文档时打开两个(或多个)特定视图? 99
FAQ 3.5 如何编程来关闭一个视图? 104
FAQ 3.6 如何编程来关闭一个打开文档的所有视图? 104
FAQ 3.7 如何防止用户关闭一个视图? 105
第3节 管理位置和大小 110
FAQ 3.8 如何编程来改变视图的大小和位置? 110
FAQ 3.9 如何设置一个视图的初始位置和大小? 112
FAQ 3.10 如何使主应用程序窗口居中? 115
FAQ 3.11 如何使视图居中? 118
FAQ 3.12 如何使框架窗口的大小不可改变? 120
FAQ 3.13 如何限制视图的最大或最小尺寸? 121
FAQ 3.14 如何限制视图的重新定位? 124
FAQ 3.15 如何使视图初始显示的规模为最小或最大? 128
FAQ 3.16 如何使应用程序以最大化或者最小化状态启动? 131
FAQ 3.17 如何使主应用程序窗口总是位于其他窗口的上面? 135
FAQ 3.18 如何使某个视图总位于其他视图的上面? 136
FAQ 3.19 如何实现一个像Visual C++和Word那样的全屏视图模式? 140
第4节 管理标题、图标、光标和背景 146
FAQ 3.20 如何定制视图的标题? 146
FAQ 3.21 如何在视图的标题中显示一个“修改过”的指示符,与某个“修改过的”文档关联? 151
FAQ 3.22 在应用程序中如何修改与各个类型的窗口相关联的图标? 154
FAQ 3.23 如何动态地改变主应用程序窗口的图标? 155
FAQ 3.24 如何动态地改变某个视图的光标? 158
FAQ 3.25 如何在某个漫长的操作中显示一个沙漏光标? 161
FAQ 3.26 如何改变一个视图的背景颜色? 163
FAQ 3.27 如何在主应用程序窗口的背景上画图? 165
第5节 程序清单视图 172
FAQ 3.28 如何使我的程序清单视图与其他的视图同步? 172
FAQ 3.29 如何使一个程序清单视图初始显示时的尺寸恰好为所关联的对话资源的大小? 175
FAQ 3.30 如何在程序清单视图内使用UPDATE_COMMAND_UI机制? 176
FAQ 3.31 如何改变程序清单视图的背景颜色? 180
FAQ 3.32 如何在程序清单视图的控件上增加工具提示(ToolTip)? 183
第6节 分割窗口 186
FAQ 3.33 如何编写一个具有水平和垂直静态分割器面板(三线分割)的窗口? 186
FAQ 3.34 如何锁定一个分割器(Splitter)窗口,从而使用户不能移动分割线? 190
FAQ 3.35 如何编程改变某个分割器窗口内面板的大小? 192
FAQ 3.36 如何向用户可见地显示包括活动视图的分割器面板? 195
第7节 切换视图 199
FAQ 3.37 如何动态地切换在MDI子窗口或者在SDI主应用程序窗口显示的视图? 199
FAQ 3.38 如何动态地切换在分割器窗口内显示的视图? 203
第8节 其他条目 208
FAQ 3.39 如何得到活动视图的指针? 208
FAQ 3.40 如何得到活动框架窗口的指针? 210
FAQ 3.41 如何遍历与某个文档关联的所有视图程序清单? 211
第4章 对话框 213
第1节 综合主题 213
FAQ 4.1 如何设置一个对话框的起始位置? 213
FAQ 4.2 如何使对话框在另一个窗口里居中? 217
FAQ 4.3 对话框如何访问活动文档(或视图)对象? 220
FAQ 4.4 如何控制对话框的背景颜色? 223
FAQ 4.5 如何给一个对话框加入预览区域(在对话框内绘制)? 226
FAQ 4.6 如何为对话框增加一个图标? 229
FAQ 4.7 如何实现一个展开的对话框? 230
FAQ 4.8 如何为对话框增加一个工具栏? 237
第2节 处理对话框内的控件 248
FAQ 4.9 当显示一个对话框时,如何选择最初拥有焦点的控件? 248
FAQ 4.10 如何在对话框中定制确认规则? 248
FAQ 4.11 如何改变对话框内的控件的字体和颜色? 251
FAQ 4.12 如何在对话框中使用UPDATE_COMMAND_UI机制? 254
FAQ 4.13 如何在对话框中增加工具提示以支持控件? 259
第5章 属性单 262
第1节 综合主题 262
FAQ 5.1 如何建立和使用一个属性单? 262
FAQ 5.2 如何设置属性单的Apply按钮? 267
FAQ 5.3 如何通过编程改变属性单内的活动页? 272
FAQ 5.4 如何定制标准的属性单按钮? 274
FAQ 5.5 如何控制属性单窗口的尺寸? 279
第2节 管理标签(Tab) 283
FAQ 5.6 是选择标签的层叠行方式还是选择标签的带有滚动条单一行的方式? 283
FAQ 5.7 如何改变属性单标签的标题? 284
FAQ 5.8 如何为属性页的标签(Tab)加入图标? 287
第3节 嵌入属性单 288
FAQ 5.9 如何在对话框里嵌入属性单? 288
FAQ 5.10 如何在表单视图里嵌入属性单? 294
FAQ 5.11 如何在分割器窗口里嵌入属性单? 297
FAQ 5.12 如何在小框架窗口里嵌入属性单? 299
第6章 工具栏和状态栏 302
第1节 工具栏 302
FAQ 6.1 如何在主框架窗口或视图的框架窗口加入一个或多个工具栏? 302
FAQ 6.2 用于控制工具栏位置、方位以及一般行为的各种操作是什么? 308
FAQ 6.3 如何通过编程来实现将一个工具栏紧随另一个工具栏停靠? 313
FAQ 6.4 如何为工具栏添加一个组合框? 316
FAQ 6.5 如何为工具栏按钮添加文本标签? 324
FAQ 6.6 如何实现用户使用菜单选择所要的工具栏? 327
FAQ 6.7 如何通过选择右击停靠区而显示的弹出式菜单,允许用户选择所要的工具栏? 332
FAQ 6.8 如何动态地在不同的工具栏之间切换? 334
第2节 状态栏 342
FAQ 6.9 如何为视图的框架窗口添加一个定制的状态栏? 342
FAQ 6.10 如何更新状态栏格的文本? 344
FAQ 6.11 如何定制属性条的字体? 350
FAQ 6.12 如何在状态栏内绘画? 353
FAQ 6.13 如何在显示菜单提示时最大化消息格? 358
FAQ 6.14 如何在状态栏内显示一个进度指示器? 365
第3节 常见控制栏问题 370
FAQ 6.15 如何编程显示或隐藏控制栏? 370
FAQ 6.16 如何设置浮动控制栏的标题? 373
FAQ 6.17 如何保存和恢复控制栏的位置和状态? 375
FAQ 6.18 如何创建自定义控制栏? 378
第7章 菜单 398
FAQ 7.1 如何用一个单一函数处理几个不同的菜单命令? 398
FAQ 7.2 如何实现一个右键弹出式菜单(上下文菜单)? 403
FAQ 7.3 如何在当用户在一个工具栏上单击一个按钮时显示一个弹出式菜单? 406
FAQ 7.4 如何在当用户在一个对话框中单击鼠标右键时显示一个弹出式菜单? 409
FAQ 7.5 如何实现一个属主绘式菜单? 415
第8章 打印和打印预览 428
FAQ 8.1 MFC的打印体系结构是怎样的? 428
FAQ 8.2 如何在MFC应用程序中实现打印和打印预览? 434
FAQ 8.3 如何打印页数事先未知的文档(动态分页)? 442
FAQ 8.4 如何像Microsoft Word那样预测分页符? 447
FAQ 8.5 如何编程动态实现打印方向(横排或竖排)的改变? 449
FAQ 8.6 如何不向用户显示标准的打印对话框而直接打印? 451
FAQ 8.7 如何自定义标准的打印对话框并获取用户选项? 455
FAQ 8.8 如何自定义“打印...”对话框? 459
FAQ 8.9 如何停止或中断打印作业? 466
FAQ 8.10 如何为单色打印机实现灰度打印预览? 467
FAQ 8.11 如何在代码中区分画图、打印预览和实际打印? 469
附录A 公用函数和类 472
附录B 参考文献和其他资源 516