您是否:
- 已被MFC綁死,離開MFC眼前漆黑一片
- 一直對Windows API、C/C++標準庫與MFC/ATL之間的曖昧關係心存疑惑
- 接觸Visual C++很長時間,卻一直感覺沒有真正入門
- 覺得Visual C++是死水一片,前途黯淡
- 具有嚴重的術語恐懼症,看到諸如MFC、ATL、STL、boost、QT、BCGControlBar、SkinMagic等字眼如墜雲霧
- 多次暗下決心要學好Visual C++,都以失敗而告終
- 看了很多的書,卻"撩爪就忘",感覺看了也白看
- 實在是弄不清楚CRT、Secure CRT是什麼意思
- 感覺Visual C++很好很強大,高手如雲,卻不知自己身處哪個層次
- 理不清頭緒,感覺Visual C++要學的太多,因此常常放棄
- 常常問自己是否還有必要學習Visual C++,擔心它與Web開發技術之間的關係
- 實在不明白MessageBoxA、MessageBoxW和MessageBox是個什麼關係
- 總認爲Visual C++開發的界面難以出手,卻又不知道如何改進
- 用過MFC::CMap,但不知道std::map實爲何物
- 感覺MFC消息處理機制挺神的,總感覺自己的代碼身陷迷宮
- 很擔心Visual C++如何與Web應用之間的交互
- 看見ODBC、DAO、OLE DB和ADO,總感覺是文字遊戲,缺乏感性認識
- 對.NET開發技術心存疑惑和抵觸,多年以來仍抱着Visual C++ 6.0不放
- 缺乏調試技巧,看別人的工程項目看不懂
- 紙上談兵很久,書買了不少,遇到實際項目還是犯暈,不知道從何下手,無法獨立行走於江湖
- 不清楚如何在MSDN中查詢到自己需要的內容
- 儘量不在Visual C++中接觸到COM,能繞多遠繞多遠
如果您具備如上症狀,請不要錯過《把脈VC++》,呵呵,姑且在此做個宣傳廣告。china-pub似乎可以開始預定了。
這本書與中醫沒有任何關係,Visual
C++儘管毛病不少,但這本書並不是來討論如何治病救人的。書名中的"把脈",表達了我們的一種美好願望,希望通過本書的討論,幫助讀者在實戰項目之前,不再犯暈,能夠火眼金睛,一下子把住Visual
C++編程技術的奇經八脈。
任何一本大部頭的書都會在其大綱中詳細列出Visual C++的開發技術,但是很少有書將這些開發技術做過分類,指出各種技術的淵源所在,行文上也是照本宣科,將諸多知識點散得七零八落。結果讀書的人也只好跟着來個"難得糊塗",好不容易將書"啃"完了,如釋重負之餘卻發現仍然是寸步難行。Visual C++的技術盤根錯節,每一門技術會有更多、更細的實現方式,那能否有一張詳盡的脈絡圖來理順Visual C++的脈絡呢?還有,這些主脈技術與當今流行的軟件分層模式之間又是個什麼關係?衝突乎?重合乎?我們該如何把握?
本書中我們妄以蚍蜉撼樹,將這些技術問題一一給出答案,並給出了一張詳細的技術脈絡圖(見彩頁)。希望讀者朋友們不嫌粗糙,仔細審閱。
本書內容系統、完整,共分爲5篇15章。
第1篇:Visual C++速覽。討論軟件項目的開發模式及Visual C++的四大開發技術,結合Visual C++的歷史討論Visual C++的真實面目,以及它與其他技術之間的關係。
第2篇:Visual C++中對象的建模與表達。討論如何採用標準C++、MFC、ATL來表達對象,以及對象之間的賦值與轉換問題,並結合STL和MFC集合討論對象容器的使用。
第3篇:Visual C++中對象的持久化。討論如何將對象存儲到文件、註冊表、關係型數據庫中,並讀取出來。
第4篇:Visual C++中對象的展現。討論如何在Visual C++中設計界面,如何使用GDI和GDI+繪製圖形,以及如何利用Windows強大的消息機制實現界面的交互。
第5篇:Visual C++中對象的傳輸與調用。討論如何在各種模塊中傳輸和調用對象,讓對象跨越包括進程、線程、DLL、ActiveX、COM及網絡等在內的多種邊界。
----------------------------------------------------
具體的目錄如下:
第1篇 Visual C++速覽
第1章 軟件項目中的開發技術 3
1.1 關於軟件項目的話題 3
1.2 軟件項目的開發過程 3
1.2.1 軟件的開發過程 31.2.2 排錯(debug) 61.2.3 原型(prototype) 61.2.4 重構(refactor) 7
1.3 軟件架構及軟件分層 8
1.3.1 軟件架構的原則 81.3.2 C/S與B/S模式 91.3.3 MVC模式 111.3.4 文檔/視圖結構 121.3.5 流行的三層結構 12
1.4 在Visual C++項目中的四大主脈技術 13
1.4.1 對象的建模與表達 141.4.2 對象的持久化 141.4.3 對象的界面展現 151.4.4 對象的傳輸與調用 161.4.5 從QQ和MSN說起 171.4.6 四大技術與三層結構 23
1.5 回到客棧管理系統 24
1.5.1 對象的建模與表達 241.5.2 對象的持久化 261.5.3 對象的界面展現 281.5.4 對象的傳輸與調用 29
1.6 本章小結 33
第2章 關於Visual C++的話題 35
2.1 Visual C++與C++ 35
2.1.1 Visual C++不是唯一的C++編譯器 352.1.2 Visual C++不是唯一的C++ IDE 372.1.3 Visual C++及MFC/ATL的版本 392.1.4 備受爭議的Visual C++ 402.1.5 Visual C++與boost、QT 42
2.2 熟悉Visual C++ IDE 43
2.2.1 文件、項目與解決方案 442.2.2 Visual C++代碼編輯器 462.2.3 Visual C++資源編輯器 472.2.4 Visual C++應用嚮導 492.2.5 Visual C++調試器 50
2.3 脫離Visual C++編寫程序 54
2.3.1 Dev-C++ 542.3.2 控制檯程序的編寫 552.3.3 Windows程序的編寫 56
2.4 使用Visual C++編寫程序 61
2.4.1 Win32控制檯程序的編寫 612.4.2 讓控制檯程序支持MFC/ATL 622.4.3 Win32窗口程序的編寫 652.4.4 MFC/ATL應用程序的編寫 712.4.5 CLR程序的編寫 78
2.5 茴字的N種寫法 79
2.5.1 使用Windows API 802.5.2 使用C++標準庫(stdcpp) 832.5.3 使用CRT(C運行時期庫) 842.5.4 使用CRT庫的寬字符版本 872.5.5 使用CRT庫的安全版本 882.5.6 使用MFC/ATL 892.5.7 使用C++/CLI 912.5.8 該採用哪一種寫法 92
2.6 Visual C++伴侶 93
2.6.1 源代碼 932.6.2 MSDN與MSDN庫 952.6.3 Visual Studio Tools 972.6.4 Visual Assist X 982.6.5 Visual C++資源網站 99
2.7 本章小結 101
第2篇 Visual C++中對象的建模與表達
第3章 常見對象的表達 105
3.1 C++基本類型 105
3.1.1 原始類型 1053.1.2 複合類型 1063.1.3 自定義類型 1083.1.4 __intN 1103.1.5 <climits> 110
3.2 字符與字符串 111
3.2.1 <cctype> 1123.2.2 C-style字符串 1143.2.3 Windows字符類型 1153.2.4 <cstring> 1153.2.5 std::string 1173.2.6 ATL::CString 120
3.3 日期與時間 122
3.3.1 <ctime> 1233.3.2 ATL::CTime與ATL::CTimeSpan 1243.3.3 ATL::COleDateTime與ATL::COleDateTimeSpan 1273.3.4 時間的格式化 127
3.4 位置與尺寸 129
3.4.1 POINT、SIZE、RECT 1293.4.2 ATL::CPoint、ATL::CSize、ATL::CRect 130
3.5 智能指針(smart pointer) 131
3.5.1 std::auto_ptr 1313.5.2 ATL::CComPtr與ATL::CComQIPtr 133
3.6 Windows數據類型 134
3.6.1 基本數據類型 1343.6.2 Windows句柄 135
3.7 MFC對象模型 138
3.7.1 MFC::CObject 1393.7.2 CObject與RTTI 1423.7.3 CRuntimeClass 1453.7.4 百般非議MFC 148
3.8 MFC與ATL 148
3.9 命名規則與名字危機 149
3.10 本章小結 151
第4章 對象的賦值與轉換 153
4.1 對象的初始化與賦值 153
4.1.1 struct與class 1534.1.2 對象的初始化 1544.1.3 聚合(aggregate) 1544.1.4 對象的賦值 1554.1.5 sizeof及字節對齊 1554.1.6 內存塊操作函數memxxx 1574.1.7 POD對象 158
4.2 對象的類型轉換(cast) 160
4.2.1 隱式轉換 1604.2.2 顯式轉換 1614.2.3 向上轉換與向下轉換 1634.2.4 變體VARIANT 1634.2.5 _variant_t、CComVariant與COleVariant、CDBVariant 166
4.3 對象的數值轉換(conversion) 168
4.3.1 xtoy 1684.3.2 sprintf、sscanf 1684.3.3 std::stringstream 170
4.4 數學運算 171
4.4.1 <cmath> 1714.4.2 隨機數 1734.4.3 複數std::complex 173
4.5 字符與編碼 174
4.5.1 字節與字符 1754.5.2 ANSI、MBCS與UNICODE 1754.5.3 TCHAR、_T與_TEXT 1774.5.4 strcpy、wcscpy與_tcscpy 1784.5.5 MessageBoxA、MessageBoxW與MessageBox 1794.5.6 ATL::CStringT與std::basic_string 1794.5.7 BSTR、_bstr_t與ATL::CComBSTR 1804.5.8 字符串的長度 1814.5.9 字符的編碼轉換 183
4.6 使用第三方庫 187
4.6.1 萬能類型boost::any 1874.6.2 萬能轉換器boost::lexical_cast 1894.6.3 有理數boost::rational 191
4.7 本章小結 192
第5章 對象容器 193
5.1 常見容器 193
5.1.1 向量(vector) 1935.1.2 列表(list) 1945.1.3 映射(map) 1955.1.4 集合(set) 1955.1.5 隊列(queue) 1965.1.6 棧(stack) 1965.1.7 選擇合適的集合 197
5.2 C++標準容器 198
5.2.1 std::vector 1995.2.2 std::list 2005.2.3 std::deque 2005.2.4 std::map、std::multimap 2015.2.5 std::set、std::multiset 2025.2.6 std::bitset 2035.2.7 std::queue、std:: priority_queue 2045.2.8 std::stack 205
5.3 泛型算法 206
5.3.1 指示器 2065.3.2 函數對象 2075.3.3 泛型算法介紹 210
5.4 MFC/ATL容器 215
5.4.1 MFC::CArray 2175.4.2 MFC::CList 2185.4.3 MFC::CMap 2185.4.4 集合元素的遍歷 219
5.5 本章小結 221
第3篇 Visual C++中對象的持久化
第6章 使用文件存取對象 225
6.1 文件操作的幾種方式 225
6.1.1 使用CRT函數std::fxxx() 2256.1.2 使用標準C++庫std::fstream 2276.1.3 使用Windows API 2296.1.4 使用MFC::CFile 2326.1.5 文本文件與二進制文件 234
6.2 使用文本文件存取對象 236
6.2.1 文本內容的存取 2376.2.2 properties文件的讀取 2376.2.3 INI文件的讀取 2416.2.4 CSV文件的讀取 243
6.3 使用二進制文件存取對象 247
6.3.1 文件指針的定位 2476.3.2 定長數據塊的讀寫 2486.3.3 變長數據塊的讀寫 2506.3.4 使用MFC::CArchive 2546.3.5 Windows資源文件的讀取 259
6.4 使用XML存取對象 262
6.4.1 XML及其語法 2626.4.2 XML的解析方式 2646.4.3 使用MsXML存取XML 2666.4.4 使用ADO.NET存取XML 271
6.5 本章小結 276
第7章 使用註冊表存取對象 277
7.1 註冊表及其結構 277
7.1.1 註冊表的結構 2777.1.2 常見的註冊表根鍵 278
7.2 使用註冊表API 279
7.2.1 關於註冊表操作的API 2797.2.2 使用Windows API寫註冊表 2807.2.3 使用Windows API讀註冊表 282
7.3 使用CRegKey存取註冊表 286
7.3.1 ATL::CRegKey 2867.3.2 使用CRegKey寫註冊表 2877.3.3 使用CRegKey讀註冊表 289
7.4 本章小結 292
第8章 使用數據庫存取對象 293
8.1 數據庫概述 293
8.1.1 關係型數據庫 2938.1.2 SQL語句 2958.1.3 常見數據庫訪問技術 296
8.2 使用ODBC操縱數據庫 297
8.2.1 ODBC 2978.2.2 使用ODBC API 2988.2.3 使用MFC::CDatabase 3028.2.4 封裝自己的Recordset 304
8.3 使用DAO操縱數據庫 309
8.4 使用OLE DB操縱數據庫 313
8.4.1 OLE DB的結構 3138.4.2 OLE DB使用者模板 3148.4.3 使用OLE DB訪問數據庫 3158.4.4 使用ATL嚮導創建OLE DB使用者 318
8.5 使用ADO操縱數據庫 321
8.5.1 ADO是對象封裝接口 3228.5.2 常見數據源的連接串 3228.5.3 使用ADODB組件 3238.5.4 使用ADODC控件 326
8.6 使用ADO.NET操縱數據庫 330
8.6.1 ADO.NET與ADO 3308.6.2 ADO.NET的聯機模式 3308.6.3 ADO.NET的脫機模式 332
8.7 本章小結 337
第4篇 Visual C++中對象的界面展現
第9章 界面的佈局 341
9.1 常見界面元素 341
9.1.1 窗口(Window) 3419.1.2 菜單(Menu) 3469.1.3 控制欄(Control Bar) 3499.1.4 客戶區與非客戶區 3589.1.5 位圖與圖標(Bitmap、Icon) 361
9.2 界面的靜態佈局 363
9.2.1 使用對話框 3649.2.2 使用控件 3689.2.3 動態創建對話框和控件 3699.2.4 使用代碼控制控件 3719.2.5 映射控件變量 3739.2.6 使用容器放置控件 3799.2.7 通用對話框 3839.2.8 使用Windows Forms 386
9.3 界面的動態佈局 390
9.3.1 框架窗口 3909.3.2 文檔/視圖結構 3949.3.3 文檔與文檔模板 3969.3.4 視圖與CView 3989.3.5 框架窗口都忙些什麼 3999.3.6 拆分窗口 401
9.4 系統托盤 405
9.5 本章小結 408
第10章 界面的繪製與交互 409
10.1 窗口與繪圖 409
10.1.1 在DOS下畫一個圈 40910.1.2 在Windows下畫一個圈 41110.1.3 使用GDI繪製的假按鈕 41410.1.4 創建真正的按鈕 41510.1.5 使用GDI+繪圖 417
10.2 讓界面交互起來 420
10.2.1 一個假的控制檯消息系統 42010.2.2 真正的Windows消息系統 42510.2.3 鼠標的3次不同點擊 428
10.3 MFC對消息機制做了什麼? 430
10.3.1 消息映射(Message Mapping) 43110.3.2 消息映射宏 43510.3.3 消息路由(Message Route) 43610.3.4 消息反射(Message Reflection) 44010.3.5 消息泵(Message Pump) 445
10.4 使用第三方庫 447
10.4.1 DirectX 44710.4.2 OpenGL 45010.4.3 Qt 452
10.5 本章小結 454
第11章 界面的美化 457
11.1 界面美化的基本途徑 457
11.1.1 設定窗口樣式(Window Style) 45811.1.2 調用函數設定控件的擴展樣式 46211.1.3 調用函數設定顏色 46411.1.4 調用函數設定背景圖 465
11.2 重載消息進行界面自繪 466
11.2.1 WM_PAINT 46611.2.2 OnDraw()與OnPaint() 46811.2.3 WM_ERASEBKGND 46811.2.4 =WM_CTLCOLOR 47011.2.5 =WM_DRAWITEM 47211.2.6 =WM_MEASUREITEM 47611.2.7 =NM_CUSTOMDRAW 479
11.3 使用ActiveX控件增強界面 482
11.3.1 ActiveX控件的註冊 48311.3.2 在對話框中引入控件 48411.3.3 將控件映射成變量 48611.3.4 常見ActiveX控件推薦 488
11.4 使用第三方庫 491
11.4.1 Xtreme Toolkit與BCGControlBar 49211.4.2 SkinMagic與換膚技術 494
11.5 本章小結 497
第5篇 Visual C++中對象的傳輸與調用
第12章 進程間對象的傳輸與調用 501
12.1 進程的操作 501
12.1.1 進程及其常見操作 50112.1.2 關於進程操作的CRT函數 50212.1.3 關於進程操作的Windows API 50312.1.4 Windows進程的創建 50412.1.5 Windows進程的終止 508
12.2 進程間的通信 510
12.2.1 使用Windows消息傳輸對象 51012.2.2 使用文件映射共享數據 51212.2.3 使用剪貼板傳輸對象 51812.2.4 使用匿名管道傳輸對象 52112.2.5 使用命名管道傳輸對象 52612.2.6 使用郵槽傳輸對象 530
12.3 本章小結 533
第13章 線程間對象的傳輸與調用 535
13.1 線程的操作 535
13.1.1 關於線程操作的CRT函數 53513.1.2 關於線程操作的Windows API 536
13.2 MFC對線程操作的封裝 536
13.2.1 工作者線程 53713.2.2 帶界面的工作者線程 53913.2.3 界面線程 541
13.3 線程通信 543
13.3.1 利用全局對象進行通信 54313.3.2 利用入口參數進行通信 54513.3.3 利用Windows消息進行通信 547
13.4 線程同步 549
13.4.1 編寫安全的售票程序 55013.4.2 同步對象CSyncObject 55313.4.3 利用臨界區(Critical Section)實現同步 55413.4.4 利用互斥體(Mutex)實現同步 55613.4.5 利用信號量(Semaphore)實現同步 55813.4.6 利用事件(Event)實現同步 55913.4.7 CMultiLock 和CSingleLock 563
13.5 本章小結 566
第14章 模塊間對象的傳輸與調用 569
14.1 靜態庫與動態鏈接庫 569
14.1.1 將mcd包裝成mcd.lib 56914.1.2 將mcd包裝成mcd.dll 57114.1.3 mcd.dll的調用 57414.1.4 顯式調用與隱式調用 57614.1.5 將類封裝成DLL 578
14.2 ActiveX控件 581
14.2.1 將mcd包裝成mcd.ocx 58114.2.2 爲mcd.ocx添加SetNumbers方法 58614.2.3 爲mcd.ocx添加Direction屬性 58914.2.4 在HTML中測試McdOcx控件 593
14.3 COM 596
14.3.1 一個不是COM的C++接口 59614.3.2 一個貌似COM的DLL 60114.3.3 真假COM 60914.3.4 使用ATL設計COM組件 61114.3.5 在JavaScript中測試COM組件 61514.3.6 使用COM API調用COM組件 61614.3.7 使用#import方式調用COM組件 619
14.4 本章小結 621
第15章 網絡間對象的傳輸與調用 623
15.1 使用Socket完成網絡通信 623
15.1.1 如何向網絡上發送一個比特? 62315.1.2 TCP/IP協議與TCP、UDP 62415.1.3 Winsock與Winsock API 62515.1.4 用Socket實現C/S模式 62615.1.5 使用Winsock打造mcd的網絡版 627
15.2 使用MFC::Csocket完成網絡通信 632
15.2.1 Winsock與CAsyncSocket、CSocket 63215.2.2 使用CSocket打造mcd的網絡版 63415.2.3 使用CSocket打造mcd的UDP版 63815.2.4 使用CSocket事件 64015.2.5 使用CSocket連接Web站點 648
15.3 使用WinInet API完成網絡通信 653
15.3.1 WinInet API與WinInet類 65315.3.2 使用WinInet API連接mcd的web版 65415.3.3 使用MFC::WinInet類連接客棧的Web版 658
15.4 本章小結 663