第1篇 C++關鍵語法及其在MFC中的應用
第1章 重載 2
1.1 函數重載 2
1.1.1 問題的提出 2
1.1.2 如何區(qū)分重載函數 2
1.1.3 重載函數使用實例 3
1.1.4 編譯器調用重載函數的規(guī)則 4
1.1.5 在父類和子類中定義重載函數 5
1.2 運算符重載 7
1.2.1 運算符重載的定義 7
1.2.2 運算符重載的特點 8
1.2.3 將運算符重載為友元和成員函數 9
1.2.4 operator調用形式 11
1.2.5 重載運算符的相關問題 12
1.3 函數重載在MFC中的應用舉例 15
1.4 運算符重載在MFC中的應用舉例 16
第2章 虛擬函數 18
2.1 問題的提出:靜態(tài)聯(lián)編與動態(tài)聯(lián)編 18
2.2 引入虛擬函數 20
2.2.1 實例:定義虛擬函數 20
2.2.2 實例:編寫通用函數 21
2.2.3 實例:定義主函數 21
2.3 虛擬函數的實現(xiàn)機制 22
2.3.1 類和對象的內存分配機制 22
2.3.2 基類與派生類的內存分配關系 23
2.3.3 非虛擬函數的內存分配機制 25
2.3.4 深入:虛擬函數的內存分配機制 25
2.4 虛擬函數的應用 27
2.4.1 不改變父類的代碼,可以改變父類的行為 28
2.4.2 不知道對象的類型,可以執(zhí)行對象的特定操作 30
2.4.3 如果類包含虛擬成員函數,則將此類的析構函數也定義為虛擬函數 37
2.5 純虛擬函數 39
2.6 虛擬函數在MFC中的應用舉例 41
第3章 靜態(tài)成員和類模板 43
3.1 靜態(tài)成員 43
3.1.1 C語法中的靜態(tài)變量 43
3.1.2 C++中的靜態(tài)成員變量 44
3.1.3 靜態(tài)成員函數 46
3.1.4 靜態(tài)成員變量在MFC中的應用舉例 47
3.1.5 靜態(tài)成員函數在MFC中的應用舉例 48
3.2 類模板 49
3.2.1 問題的提出 49
3.2.2 類模板的定義 51
3.2.3 使用類模板和模板類 58
3.2.4 模板在MFC中的應用舉例 62
第4章 多重繼承和內嵌類 64
4.1 繼承方式與訪問權限 64
4.1.1 派生類的繼承權限 64
4.1.2 在基類中定義數據成員的原則 65
4.1.3 以公有方式派生子類 66
4.2 多重繼承和虛擬基類 67
4.2.1 一個例子 67
4.2.2 多重繼承的二義性 68
4.2.3 使用虛擬基類解決二義性問題 70
4.2.4 使用虛擬基類需要注意的問題 71
4.3 內嵌類與類合成 74
4.3.1 內嵌類的定義 74
4.3.2 內嵌類的使用方法 75
4.3.3 內嵌類的應用價值 77
4.3.4 類合成 85
4.4 類繼承與類合成的應用 86
4.4.1 構造初始化和賦值操作 86
4.4.2 繼承與合成的選擇 90
4.5 多重繼承和內嵌類在COM中的應用 92
第2篇 MFC核心機制
第5章 MFC類結構 98
5.1 CObject類 99
5.1.1 支持類診斷 99
5.1.2 提供運行時類信息 102
5.1.3 支持類的連載 106
5.2 CCmdTarget類 108
5.3 CWinThread類 109
5.3.1 虛函數InitInstance 110
5.3.2 虛函數Run 110
5.3.3 虛函數ExitInstance 112
5.4 CWnd類 112
5.4.1 繪制窗口 112
5.4.2 操作窗口子控件 113
5.4.3 窗口定時器 113
5.4.4 窗口消息的相關函數 113
5.4.5 默認的消息處理函數 113
第6章 CWnd類與Windows窗口的關系 116
6.1 使用WIN32 API創(chuàng)建窗口 116
6.2 親自動手創(chuàng)建窗口封裝類 119
6.2.1 實例代碼 119
6.2.2 原理分析 132
6.3 CWnd類如何封裝Windows窗口 132
6.3.1 使用操作映射的函數 132
6.3.2 CWnd如何處理窗口消息 134
第7章 CWnd的派生類 137
7.1 CFrameWnd類 137
7.1.1 CFrameWnd的創(chuàng)建 137
7.1.2 管理視圖對象 139
7.1.3 管理控制條 140
7.1.4 分發(fā)命令消息 141
7.1.5 必要的消息處理 142
7.2 CView類 142
7.2.1 關聯(lián)文檔對象 142
7.2.2 視圖的繪制 143
7.2.3 虛函數virtual void OnUpdate(CView* pSender,LPARAM,CObject*) 144
7.2.4 虛函數virtual void OnInitialUpdate() 144
7.2.5 虛函數virtual void CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 144
7.2.6 虛函數virtual void PostNcDestroy(); 145
7.2.7 虛函數virtual BOOL OnCmdMsg(UINT, int, void*, AFX_CMDHANDLERINFO* ) 145
7.2.8 虛函數virtual void OnActivateView(BOOL, CView*,CView*) 146
7.3 CDialog類 146
7.4 模態(tài)對話框的消息循環(huán) 146
7.4.1 模態(tài)對話框的創(chuàng)建與模式循環(huán) 147
7.4.2 結束模式循環(huán) 150
7.4.3 創(chuàng)建普通的模態(tài)窗口 151
7.5 對話框的命令路由 151
第8章 窗口操作 153
8.1 檢索窗口 153
8.1.1 根據標題和窗口類查找窗口 153
8.1.2 根據窗口的相對位置或所屬關系查找窗口 154
8.1.3 檢索窗口的應用 155
8.2 屏幕坐標與客戶區(qū)坐標 157
8.3 窗口之間的層次關系 158
8.3.1 窗口實例的信息結構 158
8.3.2 桌面窗口(第一層窗口) 158
8.3.3 頂級窗口(第二層窗口) 158
8.3.4 子窗口(第三層以下窗口) 159
8.3.5 重疊窗口與彈出窗口的區(qū)別 159
8.4 父窗口與子窗口 159
8.4.1 子窗口的刷新 159
8.4.2 子窗口的顯示設備上下文 160
8.4.3 處理WM_CTLCOLOR消息 161
8.4.4 頂級窗口向子窗口轉發(fā)系統(tǒng)消息 162
8.4.5 子窗口向父窗口發(fā)送通知消息 163
8.4.6 父窗口向子窗口發(fā)送反射消息 164
8.4.7 檢索父窗口 165
8.5 Windows窗口類 166
8.5.1 窗口類的結構 167
8.5.2 系統(tǒng)定義的窗口類 169
8.6 窗口的子類化和超類化 170
8.6.1 實例子類化和全局子類化 170
8.6.2 子類化的規(guī)則與局限 172
8.6.3 使用超類化代替子類化 173
第9章 消息映射與消息處理 174
9.1 MFC的消息映射 174
9.1.1 消息映射機制 174
9.1.2 消息映射的宏定義 176
9.2 非窗口消息:命令消息 179
9.2.1 命令ID 179
9.2.2 命令消息映射項宏定義 179
9.3 非窗口消息:通知消息 180
9.3.1 通過WM_COMMAND發(fā)送的通知消息 180
9.3.2 WM_NOTIFY通知消息與ON_NOTIFY宏 180
9.3.3 幾個特殊的通知消息 182
9.4 非窗口消息:反射消息 183
9.5 非窗口消息:非窗口消息的傳遞路由 184
9.6 非窗口消息:非窗口消息的擴展 197
9.6.1 處理對象擴展 197
9.6.2 發(fā)送對象擴展 198
第10章 特殊消息和處理函數 200
10.1 空閑消息處理 200
10.1.1 UI線程的空閑處理 200
10.1.2 主框架窗口的空閑處理 202
10.1.3 對話框的空閑處理 203
10.2 命令狀態(tài)更新消息 203
10.2.1 命令狀態(tài)更新的實現(xiàn)機制 203
10.2.2 在主框架窗口中實現(xiàn)命令狀態(tài)更新 205
10.2.3 在對話框中實現(xiàn)命令狀態(tài)更新 206
10.3 使用OnCmdMsg()函數分發(fā)非窗口消息 211
第3篇 窗口編程
第11章 控件子窗口 216
11.1 控件的創(chuàng)建 216
11.1.1 使用API函數創(chuàng)建控件 216
11.1.2 使用MFC封裝類創(chuàng)建控件 217
11.1.3 使用對話框模板創(chuàng)建控件 219
11.2 控件的子類化 220
11.3 控件的屬主畫與自定義畫概述 223
11.4 屬主畫消息處理和虛擬函數 223
11.4.1 屬主畫消息的處理 224
11.4.2 屬主畫反射消息的處理實例 225
11.4.3 自畫虛擬函數DrawItem() 226
11.4.4 自畫虛擬函數MeasureItem() 227
11.4.5 自畫虛擬函數CompareItem() 227
11.4.6 自畫虛擬函數DeleteItem() 228
11.5 幾個控件的屬主畫特性 228
11.5.1 LISTBOX的屬主畫特性 228
11.5.2 BUTTON的屬主畫特性 231
11.5.3 COMBOBOX的屬主畫特性 234
11.5.4 LISTCTRL的屬主畫特性 237
11.6 控件的自定義繪圖 237
11.6.1 繪制方式 237
11.6.2 CDDS_PREPAINT階段 239
11.6.3 CDDS_ITEMPOSTPAINT階段 240
第12章 自定義控件 242
12.1 窗口類 242
12.2 通知消息 244
12.3 繪制 245
12.4 分隔條控件 246
12.4.1 基本功能 246
12.4.2 控件的封裝類以及相應函數代碼 247
第13章 開發(fā)使用控制條 255
13.1 為控制條按需分配客戶區(qū) 255
13.1.1 API函數HDWP::BeginDeferWindowPos() 255
13.1.2 API函數HDWP DeferWindowPos() 256
13.1.3 API函數BOOL EndDeferWindowPos() 256
13.1.4 具體代碼 256
13.2 控制條基類CControlBar 259
13.2.1 繪制控制條 259
13.2.2 空閑處理 262
13.2.3 向父窗口傳遞特殊消息 263
13.2.4 操作控制條風格 264
13.3 控制條的??颗c浮動 265
13.3.1 控制條的停靠 265
13.3.2 控制條的浮動 268
13.4 實現(xiàn)??扛幼哟翱?nbsp; 271
第14章 工具欄和菜單優(yōu)化 281
14.1 添加按鈕文本 281
14.2 創(chuàng)建工具欄的子控件 283
14.3 動態(tài)創(chuàng)建菜單 287
14.3.1 菜單封裝類CMenu 287
14.3.2 編輯菜單條目 289
14.3.3 為窗口關聯(lián)主菜單 291
14.3.4 創(chuàng)建浮動的彈出菜單 292
14.4 菜單的屬主畫 293
14.4.1 菜單的屬主畫機制 293
14.4.2 菜單的自畫實現(xiàn)機制 293
14.4.3 自繪彈出菜單 295
第15章 單文檔和多文檔編程 303
15.1 CWinApp類全局對象 303
15.2 注冊表和INI文件操作 304
15.3 命令行參數處理 305
15.3.1 MFC預定義的參數 305
15.3.2 自定義命令行參數 308
15.4 單文檔(SDI)模板框架 309
15.4.1 構造文檔模板類 310
15.4.2 命令行參數的解析與處理 311
15.4.3 直接創(chuàng)建相應對象的成員函數 313
15.4.4 單文檔非拆分視圖的切換 315
15.5 多文檔(MDI)模板框架 317
15.5.1 概述 317
15.5.2 MDI主框架窗口的創(chuàng)建過程 318
15.5.3 MDI主框架窗口的消息傳遞 321
15.5.4 CMDIChildWnd子框架 322
15.6 CDocument類的文檔管理功能 324
15.6.1 文檔對象的連載 324
15.6.2 新建文件 325
15.6.3 打開文件 325
15.6.4 保存文件 327
15.6.5 關閉文件 328
15.6.6 文檔的“修改”標志 330
15.6.7 文檔對象與文檔模板實例及視圖的關聯(lián) 330
第16章 編寫多框架的應用程序 333
16.1 創(chuàng)建多框架的必要性 333
16.2 自動創(chuàng)建的多框架程序 334
16.2.1 一個實例 334
16.2.2 多框架的秘密 337
16.3 改進自動創(chuàng)建的多框架程序 339
16.3.1 通過文檔模板指針改進程序 339
16.3.2 重載CWinApp::OnFileNew()接口改進程序 340
16.4 手工創(chuàng)建多框架程序 344
16.5 拆分視圖:認識CSplitterWnd類 349
16.5.1 概述 349
16.5.2 動態(tài)拆分和靜態(tài)拆分 350
16.6 應用CView::OnCreate()消息處理函數實現(xiàn)拆分 353
16.7 創(chuàng)建非視圖的拆分子窗口 355
16.8 拆分視圖的創(chuàng)建刪除和隱藏顯示 357
第4篇 高級技術
第17章 屏幕繪圖 364
17.1 基類CDC 364
17.1.1 CDC類的封裝機制 364
17.1.2 應用CDC類繪圖 366
17.2 CWindowDC與CClientDC 367
17.3 WM_PAINT窗口消息與CPaintDC類 370
17.3.1 窗口的無效區(qū)域產生WM_PAINT窗口消息 370
17.3.2 設置設備上下文的剪裁區(qū) 370
17.3.3 繪圖前處理WM_ERASEBKGND消息 371
17.3.4 主動刷新窗口繪圖 371
17.3.5 WM_PAINT消息的發(fā)送時機 371
17.3.6 在WM_PAINT消息處理中使用CPaintDC類 371
17.4 使用設備上下文的剪裁區(qū)提高刷新效率 373
17.4.1 通過設備上下文的當前路徑選擇剪裁區(qū)域 373
17.4.2 通過區(qū)域對象選擇剪裁區(qū)域 374
17.4.3 為曲線選擇剪裁區(qū)域 374
17.4.4 定時刷新曲線的程序示例 375
第18章 打印 383
18.1 準備打印設備和打印參數 383
18.2 單頁打印 385
18.3 分頁打印 387
18.4 調整圖文打印尺寸 394
18.5 窗口的自動打印 397
18.5.1 自動打印的消息處理 397
18.5.2 自動打印客戶區(qū)和非客戶區(qū) 398
第19章 多線程的創(chuàng)建與控制 404
19.1 工作者線程和界面線程 404
19.1.1 創(chuàng)建工作者線程 404
19.1.2 用戶界面線程與消息循環(huán) 407
19.1.3 主線程與輔線程 407
19.1.4 用戶界面線程的創(chuàng)建 409
19.2 線程和進程的優(yōu)先級 417
19.2.1 進程的優(yōu)先級類 418
19.2.2 線程的優(yōu)先級別 418
19.2.3 線程優(yōu)先級值 419
19.3 線程的終止 419
19.3.1 線程的正常終止 419
19.3.2 線程的強行終止 420
19.4 線程間的互斥 420
19.4.1 臨界區(qū) 421
19.4.2 互斥 422
19.5 線程間的同步 425
19.5.1 線程之間的間接制約和直接制約 425
19.5.2 線程的同步運行 425
19.6 線程間的資源共享 428
19.6.1 共享對象句柄 428
19.6.2 共享對象句柄的操作局限 429
19.6.3 共享MFC對象 430
19.6.4 多線程示例 431
第20章 操作Web網頁 438
20.1 了解HTML超文本標記語言 438
20.2 DHTML的定義 439
20.2.1 窗口對象 440
20.2.2 事件對象 440
20.2.3 子框架對象 441
20.2.4 屏幕對象 441
20.2.5 文檔對象 441
20.2.6 全集對象(all) 441
20.2.7 集合對象 442
20.3 了解JavaScript和VBScript腳本語言 442
20.4 將Web瀏覽器嵌入應用程序 443
20.4.1 使用MSIE ActiveX控件 443
20.4.2 應用CHtmlView視圖類 445
20.5 操作單框架網頁元素 447
20.5.1 COM接口與DHTML對象的關系 447
20.5.2 訪問文檔元素 448
20.5.3 訪問單框架文檔元素的程序示例 450
20.6 操作多框架網頁元素 453
第21章 異常處理 460
21.1 C++異常處理 460
21.1.1 異常處理的關鍵字 460
21.1.2 不進行異常處理的代碼 460
21.1.3 增加異常處理代碼以后 462
21.2 結構化異常處理 464
21.3 異常處理中的資源釋放 465
21.3.1 局部對象的自動析構 465
21.3.2 拋出對象的釋放處理 466
21.3.3 必要的資源清理和系統(tǒng)復位 468
21.3.4 清理沒有捕獲的異常 469
21.4 何時使用異常處理 469
21.4.1 集中處理錯誤信息 469
21.4.2 化簡返回值的傳遞過程 470
21.4.3 在構造函數中拋出異常 470
21.5 MFC的異常處理 470
21.5.1 MFC的異常類CException 470
21.5.2 MFC的CException派生類:CArchiveException 472
21.5.3 MFC的CException派生類:CFileException 473
21.5.4 MFC的CException派生類:CDBException、CDaoException 475
21.5.5 MFC的CException派生類:CResourceException 、CUserException、 CMemoryException、CNotSupportException 475
21.5.6 自定義CException的派生類