VC+深入詳解學(xué)習(xí)筆記非常全面_第1頁
VC+深入詳解學(xué)習(xí)筆記非常全面_第2頁
VC+深入詳解學(xué)習(xí)筆記非常全面_第3頁
VC+深入詳解學(xué)習(xí)筆記非常全面_第4頁
VC+深入詳解學(xué)習(xí)筆記非常全面_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余104頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第一課 第二課 第三課 第四課 第五課 第六課 第七課 第八課 第九課 第十課 第十一課 第十二課 第十三課 第十四課 第十五課 第十六課 第十七課 第十八課 第十九課 第二十課孫鑫孫鑫VC+視頻筆記列表(全)Windows 程序內(nèi)部運(yùn)行機(jī)制 MFC 程序框架的剖析MFC消息映射機(jī)制和DC的獲取 簡單字處理軟件 菜單編程 對話框編程 1 對話框編程 2MFC 中各類指針的獲取應(yīng)用程序外觀修改 圖形繪制與通用對話框 圖形保存和重繪 文件操作 文檔和串行化 網(wǎng)絡(luò)編程 多線程和簡單聊天室制作 線程同步與異步套接字編程 進(jìn)程間通信 ActiveX 控件 動(dòng)態(tài)鏈接庫 Hook 鉤子函數(shù)第 0 章 簡介L

2、esson1 :Windows 程序運(yùn)行原理及程序編寫流程, 窗口產(chǎn)生過程, 句柄原理, 消息隊(duì)列, 回調(diào)函數(shù),窗口關(guān)閉與應(yīng)用程序退出的工作關(guān)系,使用VC+勺若干小技巧,stdcall與cdeci調(diào)用規(guī)范的比較,初學(xué)者常犯錯(cuò)誤及注意事項(xiàng)。Lesson2 : C+經(jīng)典語法與應(yīng)用,類的編寫與應(yīng)用,構(gòu)造與析構(gòu)函數(shù),函數(shù)的重載,類的繼承, 函數(shù)覆蓋,基類與派生類的構(gòu)造函數(shù)、 析構(gòu)函數(shù)先后調(diào)用順序, 如何在派生類構(gòu)造函 數(shù)中向基類的構(gòu)造函數(shù)傳遞參數(shù), this 成員變量,類型轉(zhuǎn)換的內(nèi)幕,虛擬函數(shù)與多態(tài)性 , 引 用和指針變量的區(qū)別與共同處。VC工程的編譯原理與過程,將工程中不同的類拆分到不同的文件中,每

3、一個(gè)類由一個(gè).h和.cpp文件共同完成,頭文件重復(fù)定義問題的解決,培養(yǎng)了 學(xué)員良好的編程習(xí)慣,也為以后分析MFC AppWizard生成的工程奠定了良好基礎(chǔ)。Lesson3 :講述MFCAppWizard的原理與 MFC程序框架的剖析。 AppWizard是一個(gè)源代碼 生成工具,是計(jì)算機(jī)輔助程序設(shè)計(jì)工具,WinMain在MFC程序中是如何從源程序中被隱藏的,theAPP全局變量是如何被分配的,MFC框架中的幾個(gè)類的作用與相互關(guān)系,MFC框架窗口是如何產(chǎn)生和銷毀的, 對窗口類的 PreCreateWidow 和 OnCreate 兩個(gè)函數(shù)的著重分析 ,Windows 窗口與C+沖的CWnc類的關(guān)

4、系。Lesson4 : MFQ肖息映射機(jī)制的剖析, 講述如何運(yùn)用 ClassWizard ,理解發(fā)送給窗口的消 息是如何被MFC框架通過窗口句柄映射表和消息映射表來用窗口類的函數(shù)進(jìn)行響應(yīng)的。掌握設(shè)備描述表及其封裝類 CDC勺使用,CDC是如何與具體的設(shè)備發(fā)生關(guān)聯(lián)的,融合具體的畫圖 程序進(jìn)行分析。如何設(shè)置封閉圖形的填充刷子(位圖畫刷與透明畫刷的使用)。Lesson5 :掌握CDC的文字處理程序的編寫, 如何產(chǎn)生自定義字體和自定義插入符,熟悉對CString類的使用。通過對卡拉0K程序的編寫,講解定時(shí)器的使用和 DrawText函數(shù)的巧 妙運(yùn)用。講解如何使用 CDC勺裁減功能。Lesson6 :菜

5、單的工作原理及編寫應(yīng)用,菜單命令消息在MFC框架程序的幾個(gè)類中的傳遞 順序和處理過程。標(biāo)記菜單、缺省菜單的實(shí)現(xiàn)原理、圖形菜單的實(shí)現(xiàn)及常犯錯(cuò)誤的分析, GetSystemMetrics 的應(yīng)用,快捷彈出菜單的實(shí)現(xiàn)方式及其命令響應(yīng)函數(shù)有效范圍(與彈出 菜單時(shí)所指定的父窗口有密切的關(guān)系,最底層的子窗口具有最優(yōu)先的處理機(jī)會)。動(dòng)態(tài)菜單的編寫,如何讓程序在運(yùn)行時(shí)產(chǎn)生新的菜單項(xiàng)及如何手工為這些新產(chǎn)生的菜單命令安排處理 函數(shù),如何在頂層窗口中截獲對菜單命令的處理,更進(jìn)一步掌握CString 類的應(yīng)用。Lesson7 :對話框用戶界面程序的編寫,如何向?qū)υ捒蚩丶P(guān)聯(lián)數(shù)據(jù)成員及其實(shí)現(xiàn)機(jī)理, 如何利用對話框類的成

6、員函數(shù)向控件發(fā)送消息和獲取對話框控件的類指針,如何直接利用對話框控件類操縱對話框控件(發(fā)送消息和直接調(diào)用成員函數(shù)) 。如何在程序運(yùn)行時(shí)產(chǎn)生和銷 毀控件。對話框控件的幾種操作方式的優(yōu)劣比較分析。如何實(shí)現(xiàn)對話框的部分收縮和展開。 如何讓對話框上的文本框在程序啟動(dòng)后立即獲得焦點(diǎn), 如何利用 SetWindowLong 改變窗口的 回調(diào)函數(shù), 通過改變文本框的默認(rèn)回車處理方式進(jìn)行演示。實(shí)現(xiàn)多個(gè)輸入文本框間通過回車逐一向下傳遞焦點(diǎn)的另一種巧妙方法(用缺省按鈕來處理)。Lesson8 :逃跑按鈕的巧妙實(shí)現(xiàn)。 如何制作屬性頁對話框和向?qū)υ捒颍?融合講解組合框 (如何調(diào)整組合框的大?。?、列表框、單選按鈕、

7、復(fù)選按鈕等常用對話框控件的多種使用方 法。如何限制用戶在不滿足設(shè)定的條件時(shí)切換到其他屬性頁和向?qū)ы?。Lesson9 :如何修改 MFCAppWizard 向?qū)傻目蚣艹绦虻耐庥^和大小, 修改圖標(biāo)、 光標(biāo)、背景的三種方法。 如何增加和刪除工具欄按鈕, 如何給應(yīng)用程序增加工具欄, 如何顯示和隱 藏工具欄。定制狀態(tài)欄,在狀態(tài)欄中添加時(shí)鐘顯示,CTime類及其用法。在狀態(tài)欄中添加進(jìn)度條(主窗口產(chǎn)生后立即產(chǎn)生進(jìn)度條的巧妙思想,不能在 OnCreate 函數(shù)中直接處理,要用 到自定義消息的方法) 。鼠標(biāo)坐標(biāo)顯示,在 CView 中獲取狀態(tài)欄對象的幾種方式。如何為應(yīng) 用程序添加啟動(dòng)畫面。Lesson10

8、:圖形的繪制,如何使用自定義畫筆(顏色,線寬,線型) 。如何為程序中添加 選項(xiàng)菜單和選項(xiàng)設(shè)置對話框, 如何使用標(biāo)準(zhǔn)顏色對話框, 如何使用字體對話框, 在選項(xiàng)對話 框中實(shí)現(xiàn)預(yù)覽功能。 實(shí)現(xiàn)選項(xiàng)對話框和窗口類中的數(shù)據(jù)交換。 如何改變對話框和控件的背景 色,如何改變控件的文本顏色,對按鈕控件的特殊處理。如何在窗口中顯示一幅位圖。Lesson11 :如何讓CDC上輸出的文字、圖形具有保持功能,集合類CPtrArray的使用,CP ai ntDC與CClie ntDC的區(qū)別與應(yīng)用, OnPaint與On Draw在CView中的關(guān)系及實(shí)現(xiàn)內(nèi)幕, 滾動(dòng)窗口的實(shí)現(xiàn),坐標(biāo)空間,映射方式, 設(shè)備坐標(biāo)與邏輯坐標(biāo)的

9、轉(zhuǎn)換。 元文件設(shè)備描述表的 使用,如何利用兼容 DC實(shí)現(xiàn)圖形的保存和再現(xiàn)。Lesso n12 : con st char *與char * con st的區(qū)別。C語言對文件讀寫的支持,F(xiàn)ILE指針;的用法。 Win32 SDK 對文件讀寫的支持,函數(shù)的使用;MFC對文件讀寫的支持,CFilewin.ini 文件和注冊表的讀寫方式及相關(guān)知文本文件和二進(jìn)制文件的區(qū)別。用文本方式讀寫文件和以二進(jìn)制方式讀寫文件的注意事項(xiàng)。C+對文件讀寫的支持, ofstream 和ifstream CreateFile 函數(shù)、 WriteFile 函數(shù)、 ReadFile 類和 CFileDialog 的使用,文件過

10、濾器的設(shè)置。識點(diǎn)。Lesson13 :使用CArchive類對文件進(jìn)行操作。MFCl架程序提供的文件新建與打開功能 內(nèi)部的實(shí)現(xiàn)機(jī)制。如何利用CDocument類的串行化存儲功能保存與加載數(shù)據(jù)。如何實(shí)現(xiàn)類對串行化的支持,CObArray的串行化實(shí)現(xiàn)內(nèi)幕。刪除文檔數(shù)據(jù)時(shí)常犯的錯(cuò)誤。MFC框架程序的 文檔類和視類的關(guān)系,以及如何獲得相互的指針引用。Lesson14 :網(wǎng)絡(luò)的相關(guān)知識,網(wǎng)絡(luò)程序的編寫, Socket 是連接應(yīng)用程序與網(wǎng)絡(luò)驅(qū)動(dòng)程序 的橋梁, Socket 在應(yīng)用程序中創(chuàng)建,通過 bind 與驅(qū)動(dòng)程序建立關(guān)系。此后,應(yīng)用程序送給 Socket 的數(shù)據(jù),由 Socket 交給驅(qū)動(dòng)程序向網(wǎng)絡(luò)上

11、發(fā)送出去。 計(jì)算機(jī)從網(wǎng)絡(luò)上收到與該 Socket 綁定的IP+Port相關(guān)的數(shù)據(jù)后,由驅(qū)動(dòng)程序交給Socket,應(yīng)用程序便可從該 Socket中提取接收到的數(shù)據(jù)。網(wǎng)絡(luò)應(yīng)用程序就是這樣通過socket進(jìn)行數(shù)據(jù)的發(fā)送與接收的。TCP與UDP的工作原理與編寫過程,如何在程序中鏈接庫文件。一個(gè)字符界面的聊天程序。Lesson15 :多線程程序的編寫,多線程應(yīng)用中容易出現(xiàn)的問題?;コ鈱ο蟮闹v解,如何 使用互斥對象來實(shí)現(xiàn)多線程的同步。如何利用命名互斥對象保證應(yīng)用程序只有一個(gè)實(shí)例運(yùn) 行。應(yīng)用多線程編寫網(wǎng)絡(luò)聊天室程序。Lesson16 :事件內(nèi)核對象、關(guān)鍵代碼段(臨界區(qū))的講解,以及在多線程同步中的應(yīng)用。 在

12、 Windows 下編寫基于消息的網(wǎng)絡(luò)應(yīng)用程序,掌握阻塞與非阻塞網(wǎng)絡(luò)程序的編寫,理解在 Win dows平臺下,采用異步選擇機(jī)制可以提高網(wǎng)絡(luò)應(yīng)用程序的性能。Lesson17 :詳細(xì)講解進(jìn)程間通訊的四種方式:剪貼板、匿名管道、命名管道和郵槽。并 比較分析這幾種進(jìn)程間通信的優(yōu)點(diǎn)和缺點(diǎn)。Lesson18 :ActiveX 控件的應(yīng)用與工作原理。 ActiveX 控件的編寫, 如何為控件安排屬性, 方法,事件,屬性頁,持久性存儲,控件如何通知容器自身屬性的改變。如何注冊控件與取 消控件注冊。在 VB和VC中訪問ActiveX控件。Lesson19 :動(dòng)態(tài)鏈接庫程序的編寫。靜態(tài)庫與動(dòng)態(tài)庫的區(qū)別,以及調(diào)用

13、程序在鏈接靜態(tài) 庫和動(dòng)態(tài)庫時(shí)的區(qū)別。 如何利用工具查看動(dòng)態(tài)鏈接庫輸出的函數(shù),De pends工具的使用,C+編譯器名字改編技術(shù)對動(dòng)態(tài)鏈接庫輸出函數(shù)的影響,extern "C" 的用法,利用模塊定義文件來解決C+名字改編的問題。用typedef定義指向函數(shù)的指針類型,如何獲得動(dòng)態(tài)連接庫里的函數(shù)的指針。Lesson20 :Hook 編程。如何安裝鉤子過程,如何編寫全局鉤子,動(dòng)態(tài)連接庫里的全局變量數(shù)據(jù)共享問題分析。ADO數(shù)據(jù)庫編程。在 VB中利用ADO控件和ADC對象訪問數(shù)據(jù)庫,在VC中利用ADC技術(shù)訪問數(shù)據(jù)庫。第一章 Windows 程序內(nèi)部運(yùn)行機(jī)制這一章比較零散 , 筆記也很

14、零散一、windows 是事件驅(qū)動(dòng)方式的程序設(shè)計(jì) windows 程序設(shè)計(jì)是種事件驅(qū)動(dòng)方式的程序設(shè)計(jì),主要基于消息的。當(dāng)用戶需要完成某種功 能時(shí),需要調(diào)用OS某種支持,然后OS將用戶的需要包裝成消息,并投入到消息隊(duì)列中, 后應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。二、消息隊(duì)列每個(gè)應(yīng)用程序 OS都為它建立一個(gè)消息隊(duì)列,消息隊(duì)列是個(gè)先進(jìn)先出的緩沖區(qū),其中每個(gè)元 素都是一個(gè)消息, OS 將生成的每個(gè)消息按先后順序放進(jìn)消息隊(duì)列中,應(yīng)用程序總是取走當(dāng) 前消息隊(duì)列中的第一條消息, 應(yīng)用程序取走消息后便知道用戶的操作和程序的狀態(tài),然后對其處理即消息響應(yīng),消息響應(yīng)通過編碼實(shí)現(xiàn)。三、Window 程序入口Win

15、Main函數(shù)是 Windows程序入口點(diǎn)函數(shù),由OS調(diào)用,當(dāng)OS啟動(dòng)應(yīng)用程序的時(shí)候,winmain函數(shù)的參數(shù)由OS傳遞的。四、創(chuàng)建一個(gè)完整的窗口需要經(jīng)過下面四個(gè)操作步驟1,2,3,4,設(shè)計(jì)一個(gè)窗口類。如:WNDCLASS wn dels其他值得注意的地方1,消息結(jié)構(gòu)typedef struct tagMSG HWND hwnd; /UINT message; /WPARAM wParam;LPARAM lParam;DWORD time; /POINT pt; / MSG;/注冊窗口類。如: RegisterClass(&wndcls) 。 創(chuàng)建窗口。如: CreateWindow()

16、,CreateWindowEX(); 顯示及更新窗口。如: ShowWindow(),UpdateWindow();/ msg消息投遞時(shí)間。消息投遞時(shí),光標(biāo)在屏幕上的位置。接收消息的窗口句柄。和哪個(gè)窗口相關(guān)聯(lián)。 消息標(biāo)識。消息本身是什么。 消息的附加信息。具體取決于消息本身。2,掌握 windows 的消息機(jī)制需要掌握兩方面: (1)消息本身。不同消息所代表的用戶操作和應(yīng)用程序的狀態(tài)。(2)對于某個(gè)特定的消息來說,要讓OS執(zhí)行某個(gè)特定的功能去響應(yīng)消息。3, Window 入口函數(shù)說明 int WINAPI WinMain(/當(dāng)前事例句柄。先前事例句柄。 32 位系統(tǒng)中此值都為 NULL 命令行

17、指針(窗口)顯示的狀態(tài)要帶參調(diào)用 WinMain, 類似于命令行的功能,在 arguments 項(xiàng)填寫參數(shù) 4, Windows 提供的窗口類詳解 typedef struct _WNDCLASS UINT style; / WNDPROC lpfnWndProc;int cbClsExtra; / int cbWndExtra; /HANDLE hInstance; / HICON hIcon; / HCURSOR hCursor; / HBRUSH hbrBackground; / LPCTSTR lpszMenuName; / LPCTSTR lpszClassName; / WNDCL

18、ASS;Project esettingeDebug 頁e Program/窗口的類型窗口過程函數(shù)指針(回調(diào)函數(shù)) 窗口類附加字節(jié),為該類窗口所共享。通常 窗口附加字節(jié)。通常設(shè)為 當(dāng)前應(yīng)用程序事例句柄。 圖標(biāo)句柄 LoadIcon(); 光標(biāo)句柄 LoadCursor();畫刷句柄 (HBRUSH)GetStockObject();菜單名字類的名字0。0。HINSTANCE hInstance, / HINSTANCE hPrevInstance, LPSTR lpCmdLine, / int nCmdShow / );從消息隊(duì)列中取出一條消息5, 消息循環(huán): MSG msg; while(G

19、etMessage(&msg,.) / 進(jìn)行消息(如鍵盤消息)轉(zhuǎn)換/分派消息到窗口的回調(diào)函數(shù)處理,(OS調(diào)用窗口回調(diào)函數(shù)進(jìn)行TranslateMessage(&msg); /DispatchMessage(&msg);處理)。6, 回調(diào)函數(shù)LRESULT CALLBACK WindowProc( / 這里 WindowProc 是個(gè)代號名字。HWND hwnd, / handle to windowUINT uMsg, / message identifierWPARAM wParam, / first message parameterLPARAM lParam /

20、second message parameter);說明:兩種函數(shù)調(diào)用約定( _stdcall和 _cdecl ):#define CALLBACK _stdcall/Stdcall標(biāo)準(zhǔn)調(diào)用預(yù)定,是 P ASCAL調(diào)用約定,象 DEL PHI使用的就是標(biāo)準(zhǔn)調(diào)用約定#define WINAPIV _cdecl/ _cdecl是 C 語言形式的調(diào)用約定。主要區(qū)別:函數(shù)參數(shù)傳遞順序 和 對堆棧的清除上。問題:除了那些可變參數(shù)的函數(shù)調(diào)用外,其余的一般都是_stdcall 約定。然的是_cdecl約定。所以如果在VC等環(huán)境中調(diào)用 Stdcall約定的函數(shù), 明的時(shí)加上_stdcall 修飾符,以便對這個(gè)

21、函數(shù)的調(diào)用是使用DEL PHI編寫的DLL時(shí)候)。(VC中可通過這途徑修改:P roject現(xiàn) Call convention 選項(xiàng),修改之 )esett ings 9/c+ ecategarystdcall但 C/C+ 編譯默 必須要在函數(shù)聲 約定(如使用選” Code Generation ”,出7, DC句柄的使用(1)(2)使用 BeginPaint(),EndPaint() 使用 GetDc(),ReleaseDC() 對。PAIN消息時(shí)使用。對。注意只能在響應(yīng) WM注意他們不能在響應(yīng) WM PAIN中使用。8,(1)(2)其它函數(shù)名代表函數(shù)的首地址。創(chuàng)建窗口的時(shí)候一定要基于已經(jīng)注冊

22、的窗口類第二章MFC程序框架的剖析說明:本課對應(yīng)教學(xué)視頻的第三課 ,第二課是 C+,被我跳過去。C+我打算另外在用多點(diǎn) 的篇幅來討論。可以不看這一章, 可以看了后面的界面設(shè)計(jì)再回頭來MFC的窗口類創(chuàng)建過程,而要反復(fù)說明的就是:MFC的程 是完全一致的。重點(diǎn):MFC運(yùn)行機(jī)制 提示:對于不想理解內(nèi)部運(yùn)行過程的, 看這一章,可能感覺更深刻。 這一次課和上一次的課的重點(diǎn)就是 序和C語言的程序,從執(zhí)行原理上說,抓住這一點(diǎn),那么對于理解MFC程序的運(yùn)行機(jī)制也就相對于簡單了。C中的main函數(shù)就相當(dāng)于 MFC中的 WinMain函數(shù)。感興趣的可以利用 VC的斷點(diǎn)設(shè)置自己跟蹤下面講述的各個(gè)函數(shù),就明白它的執(zhí)行

23、順序了。一、C語言程序執(zhí)行步驟 在C語言中,大約的步驟如下: 1, 全局變量內(nèi)存分配2, 進(jìn)入main函數(shù) 二、MFC程序的運(yùn)行步驟(主要是初始化)打開一個(gè)MFC APPWizard(exe)工程,跟蹤其執(zhí)行步驟,可以發(fā)現(xiàn),是以下順序:1)CXXA pp中的全局變量定義CXXA pp theA pp;2)調(diào)用CXXApp勾造函數(shù)CXXA pp :CXXA pp ()3)_tWinM ai n()進(jìn)入 Winmain 函數(shù)(_tWinMain 為宏,值為 WinMain)4)完成初始化工作:包括窗口類注冊、窗口產(chǎn)生、顯示和更新P Thread->lni tI nsta nce()對于MFC

24、程序,Mai nF rame,View,ToolBar, Co ntrolbar 等都是窗口,所以下面的窗口注冊與創(chuàng)建、顯示等要反復(fù)調(diào)用多次,一次對應(yīng)一個(gè)窗口(1) 注冊窗口類AfxE ndDeferRegisterClass( 2)創(chuàng)建窗口CMainFrame:PreCreateWindow()/ 反復(fù)調(diào)用一次是給我們修改窗口屬性的機(jī)會 CFrameWnd:Create()(3) 消息循環(huán)PumpMessage()補(bǔ)充 1:設(shè)計(jì)一個(gè)窗口類 注冊窗口類 創(chuàng)建窗口 顯示及更新窗口 消息循環(huán)MFC在MFC中,由于涉及到(窗口)類定義,所以定義全局變量的時(shí)候,需要進(jìn)行更多的步驟。 全局變量涉及到類定

25、義(類似于 C 中的類型定義)的話,那么需要遵循以下步驟(以 的窗口類為例)1)2)3)4)5)補(bǔ)充 2: 其他需要注意的幾點(diǎn)1, 每一個(gè)MFC程序,有且只有一個(gè)從 WinApp類派生的類(應(yīng)用程序類),也只有一個(gè)從 應(yīng)用程序類所事例化的對象,表示應(yīng)用程序本身。 在WIN32程序當(dāng)中,表示應(yīng)用程序是通過WINMAIN入口函數(shù)來表示的(通過一個(gè)應(yīng)用程序的一個(gè)事例號這一個(gè)標(biāo)識來表示的)。在基于MFC應(yīng)用程序中,是通過產(chǎn)生一個(gè)應(yīng)用程序?qū)ο螅盟鼇砦ㄒ坏谋硎玖藨?yīng)用程序。2, _tWinMain 函數(shù)中通過調(diào)用 AfxWinMain() 函數(shù)來完成它要完成的功能。 ( Afx* 前綴代表 這是應(yīng)用程序框

26、架函數(shù), 是一些全局函數(shù), 應(yīng)用程序框架是一套輔助生成應(yīng)用程序的框架模 型,把一些類做一些有機(jī)的集成,我們可根據(jù)這些類函數(shù)來設(shè)計(jì)自己的應(yīng)用程序)3, 設(shè)計(jì)窗口類:在MFC中事先設(shè)計(jì)好了幾種缺省的窗口類,根據(jù)不同的應(yīng)用程序的選擇,調(diào)用 AfxEndDeferRegisterClass() 函數(shù)注冊所選擇的窗口類。4, PreCreateWindow() 是個(gè)虛函數(shù) , 如果子類有則調(diào)用子類的。5, CreateWindowEx()函數(shù)參數(shù)與 CREATESTRUC結(jié)構(gòu)體成員完全一致,CreateWindowEx() 函數(shù)與 CREATESTRUC結(jié)構(gòu)體參數(shù)的對應(yīng)關(guān)系,使我們在創(chuàng)建窗口之前通過可

27、PreCreateWindow(cs) 修改 cs 結(jié)構(gòu)體成員來修改所要的窗口外觀。6,注意兩個(gè)函數(shù)。: TranslateMessage(&m_msgCur) 函數(shù)進(jìn)行消息(如鍵盤消息)轉(zhuǎn)換: DispatchMessage(&m_msgCur) 函數(shù)分派消息到窗口的回調(diào)函數(shù)處理 (實(shí)際上分派的消息經(jīng) 過消息映射,交由消息響應(yīng)函數(shù)進(jìn)行處理。 )7,可以認(rèn)為 View類窗口是 CMainFram類窗口的子窗口。 DOCument類是文檔類。DOC-VIEW 結(jié)構(gòu)將數(shù)據(jù)本身與它的顯示分離開。文檔類用于數(shù)據(jù)的存儲,加載;視類用于數(shù)據(jù)的顯示,修改8,CTEApp:InitInstan

28、ce()函數(shù)中通過文檔模板將文檔類, 視類, 框架類的有機(jī)組織一起。語句如下:CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME,RUNTIME_CLASS(CTEDoc),RUNTIME_CLASS(CMainFrame), / main SDI frame window RUNTIME_CLASS(CTEView);AddDocTemplate(pDocTemplate);/ 增加到模板補(bǔ)充3:本課涉及到MFC函數(shù)的源文件位置根目錄找到您安裝VC98下MFC的位置,比如

29、我的機(jī)子上為:D:Program Files'Microsoft VisualStudioVC98MFC 。下面提供的就是相對路徑了。CWinApp構(gòu)造函數(shù):MFC eSRCoAPPCORE.CPPAfxWinMain : MFCSRCWINMAIN.CPPAfxEndDeferRegisterClass: MFCe SR APPCORE.CPPCFrameWnd:PreCreateWindow()函數(shù)所在文件:MFCeSRCeWINFRM.CPPCFrameWnd:Create() 函數(shù)路徑:MFCeSRCeWINFRM.CPPCWnd:CreateEx() 函數(shù)路徑: MFCeSR

30、CeWINCORE.CPPCWinThread:Run() 方法路徑: MFCeSRCeTHRDCORE.CPP我們假設(shè)您已經(jīng):1234第三章MFC消息映射機(jī)制和繪圖 DC的獲取,知道如何創(chuàng)建一個(gè)單文檔的App Wizard,知道C+類、函數(shù)重載等簡單知識,知道如何給View類或者Doc文檔添加成員變量,會用MFC的 IDE調(diào)試工具最好,那么本文的程序您可以copy去調(diào)試我們在上一節(jié)講了 MFC框架App類、View類、MainFrame類和Doc類的關(guān)系,那么, 基于消息的windows MFC程序設(shè)計(jì)是如何進(jìn)行消息映射的呢?在進(jìn)行下一節(jié)之前,我們來復(fù)習(xí)一下。對于一個(gè) MFCA PP Wiz

31、ard運(yùn)用程序,CMa in Frame和View是窗口類,并且是父子關(guān)系, Doc一般用于數(shù)據(jù)的加載和存儲, View用于圖像的顯示,App中是包括一些(窗口)初始化 之類的東西。我們開始這一節(jié)的內(nèi)容。一、消息映射機(jī)制windows程序設(shè)計(jì)是種事件驅(qū)動(dòng)方式的程序設(shè)計(jì),主要基于消息的。當(dāng)用戶需要完成某 種功能時(shí),需要調(diào)用OS某種支持,然后OS將用戶的需要包裝成消息,并投入到消息隊(duì)列中,最后應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。在左邊 View類處點(diǎn)右鍵,在出現(xiàn)的菜單里點(diǎn)擊"Add Windows Message Handler ”,在出現(xiàn)的對話框里選擇“ WM_LBUTTONDOW

32、添加消息映射函數(shù)?;氐皆募覀儗⒖吹饺庍M(jìn)行了修改:1,在頭文件(View.h)中聲明消息響應(yīng)函數(shù)原型。AFX_MSG(CDrawView) / 注釋宏afx_msg void On LButto nDow n(UINT nFlags, CPoint poi nt); AFX_MSG / 注釋宏afx_msg宏表示聲明的是一個(gè)消息響應(yīng)函數(shù)。2,在源文件(View.cPP)中進(jìn)行消息映射。BEGIN_MESSAGE_MA P(CDrawView, CView)/AFX_MSG_MA P(CDrawView)ON_WM_LBUTTONDOWN()/AFX_MSG_MA P在宏BEGIN_MES

33、SAGE_MA與)END_MESSAGE_MA之(間進(jìn)行消息映射。宏 ON_WM_LBUTTONDOWI消息、WM_LBUTTONDOWN的響應(yīng)函數(shù) OnLButtonDown()相關(guān)聯(lián)。 這樣一旦有消息的產(chǎn)生,就會自動(dòng)調(diào)用相關(guān)聯(lián)的消息響應(yīng)函數(shù)去處理。宏 ON_WM_LBUTTONDO定義如下: #defi ne ON_WM_LBUTTONDOWN() WM_LBUTTONDOWN, 0, 0, 0,AfxSig_vw p, (AFX_ PMSG)(AFX_ PMSGW)(void (AFX_MSG_CALL CWnd:*)(UINT, CP oi nt)&On LButto nDow

34、 n ,3, 源文件中進(jìn)行消息響應(yīng)函數(shù)處理。void CDrawView:O nLButto nDow n(UINT nFlags, CP oi nt p oi nt)/ TODO: Add your message han dler code here an d/or call defaultCView:O nLButto nDow n(n Flags, poi nt);說明:可見當(dāng)增加一個(gè)消息響應(yīng)處理,在以上三處進(jìn)行了修改??稍谙㈨憫?yīng)函數(shù)里添加消息處理代碼完成對消息的響應(yīng)、處理。消息響應(yīng)的可能方式:1) 在基類中針對每種消息做一個(gè)虛函數(shù),當(dāng)子類對消息響應(yīng)時(shí)候,只要在子類中重寫這個(gè) 虛函數(shù)

35、即可。缺點(diǎn): MFC類派生層次很多,如果在基類對每個(gè)消息進(jìn)行虛函數(shù)處理,那么從 基類派生的每個(gè)子類都將背負(fù)一個(gè)龐大的虛表,這樣浪費(fèi)內(nèi)存,故MFC沒有采取這中方式而采取消息映射方式。2) 消息映射方式:MFC在后臺維護(hù)了一個(gè)句柄和C+對象指針對照表,當(dāng)收到一個(gè)消息后,通過消息結(jié)構(gòu)里資源句柄(查對照表)就可找到與它對應(yīng)的一個(gè)C+寸象指針,然后把這個(gè)指針傳給基類,基類利用這個(gè)指針調(diào)用WindowProc()函數(shù)對消息進(jìn)行處理,WindowProc()函數(shù)中調(diào)用 On WndMsg(函數(shù),真正的消息路由及處理是由On WndMsg(函數(shù)完成的。由于WindowProc()和OnWndMsg(都是虛函數(shù)

36、,而且是用派生類對象指針調(diào)用的,由多態(tài)性知最 總終調(diào)用子類的。在On WndMsg(函數(shù)處理的時(shí)候,根據(jù)消息種類去查找消息映射,判斷所發(fā)的消息有沒有響應(yīng)函數(shù),具體方式是到相關(guān)的頭文件和源文件中尋找消息響應(yīng)函數(shù)聲明(從注釋宏/AFX_MSG(CDrawView)./AFX_MSG 之間尋找),消息映射(從宏 BEGIN_MESSAGE_MA P( .).END_MESSAGE_MA P之間尋找),最終找到對應(yīng)的消息處理函 數(shù)。當(dāng)然,如果子類中沒有對消息進(jìn)行處理,則消息交由基類處理。說明:virtualvirtual LRESULT Win dow Proc(UINT message, WPARA

37、M wP aram, L PARAM IP aram);bool On WndMsg(UINT message, WPARAMw Param, LP ARAM lP aram, LRESULT* p Result);說明:在 各種DC的獲取,以及顯示效果。繪圖DC的獲取View類添加WM_LBUTTONDOWWM_LBUTTONUP消息處理函數(shù),我們將用來演示View類添加全局變量CPoint m_ptOrigin用來存儲左鍵按下點(diǎn)坐標(biāo)。下面集中來關(guān)注OnLButtonUp中的繪圖程序和效果。以下語句添加于 OnLButtonUp函數(shù)中,可以查看不同的效果。1,使用SDK獲取DC句柄:HDC

38、hdc;hdc=:GetDc(m_hWnd);/ 獲取 DC句柄MoveToEx(hdc,m_ptOrigi n.x,m_ ptOrigi n. y,NULL);Lin eTo(hdc ,poin t.x ,poin t.y);:ReleaseDC(m_hWnd,hdc);/ 釋放 DC2,利用CDC類指針和CWin類成員函數(shù)獲取 DCCDC *p DC=GetDC(); p DC->MoveTo(m_ ptOrigi n); p DC->Li neTo( poi nt); ReleaseDC( pDC);3,利用 CClientDC對象。(CClientDC 類從CDC類派生來的

39、)CClie ntDC dc(this); dc.MoveTo(m _p tOrigi n);dc.L in eTo (poin t);4,利用 CWindowDC寸象。(CWindowDC類從CDC類派生來的) CWin dowDC dc(this);/dc.MoveTo(m_ ptOrigi n);dc.L in eTo (poin t);5,父窗口( Mai nF rame框架)和屏幕指針將上面的dc(this) 分別改成 GetParent()和GetDesktopWindow(),就可以得到父窗口指針 和屏幕窗口指針??梢苑謩e試驗(yàn)畫線效果。6,利用畫筆改變線條顏色和類型:CPen p

40、en(P S_DOT,1,RGB(0,255,0);/構(gòu)造畫筆對象將畫筆選入DCCClie ntDC dc(this);C Pen *p Old Pen=dc.SelectObject(&pen);/ dc.MoveTo(m_ ptOrigi n);dc.L in eTo (poin t);dc.SelectObject( pOld Pen);/恢復(fù)先前的畫筆7,使用畫刷(通常利用畫刷去填充矩形區(qū)域)使用單色畫刷CBrush brush(RGB(255,0,0);/構(gòu)造畫刷對象用指定的畫刷去填充矩形區(qū)域用指定的位圖畫刷去填充矩形區(qū)域CClie ntDC dc(this);dc.Fill

41、Rect(CRect(m_ ptOrigi n,p oi nt), &brush);/使用位圖畫刷CBitmap bitma p;/構(gòu)造位圖對象(使用前需要初試化)bitma p丄oadBitma p(IDB_BITMA P1);/初試化位圖對象CBrush brush(&bitma p);/構(gòu)造位圖畫刷CClie ntDC dc(this);dc.FillRect(CRect(m_ ptOrigi n,p oi nt), &brush);/使用透明畫刷CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL

42、_BRUSH);/獲取透明畫刷對象指針將透明畫刷選入DCCClie ntDC dc(this);CBrush *p OldBrush=dc.SelectObject( pBrush);/dc.Recta ngle(CRect(m _p tOrigi n,p oi nt);dc.SelectObject( pOldBrush);/釋放透明畫刷8,注意點(diǎn):1) 靜態(tài)方法不屬于某一個(gè)具體對象,而屬于類本身,在類加載的時(shí)候就已經(jīng)為類靜態(tài)方法分配了代碼去,故可用CBrush:FromHa ndle() 形式調(diào)用。2) 靜態(tài)方法中,不能引用非靜態(tài)的數(shù)據(jù)成員和方法。變量類型類名::變量名=初始值;3) 靜態(tài)

43、數(shù)據(jù)成員需要在類外單獨(dú)做初始化,形式如:第四章 文本編輯和字處理軟件這一節(jié)我們主要講述文本編輯方面的知識, 過程,所以我也是按照順序,敘述此過程。孫鑫老師的視頻就是一個(gè)簡單字處理軟件的制作在 MFC中 CEditView 和 cRichEditViewView 類以 CEditView 和 cRichEditView類已經(jīng)完成了初步的文字處理??梢宰寫?yīng)用程序的 類為基類。下面我們以單文檔視圖為例一、創(chuàng)建插入符。文字在插入符后插入(正如Word中閃爍的光標(biāo))1, 添加View類的 WM_CREATS息響應(yīng)函數(shù)2, 在 CXXXView:OnCreate()中添加/獲得當(dāng)前文本度量/字體信息CCl

44、ie ntDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);/根據(jù)當(dāng)前字體,設(shè)置插入符CreateSolidCaret(20,100);ShowCaret();3,創(chuàng)建圖形插入符1) ,為View類添加成員變量/光標(biāo)/*m_bmp;2) ,把上面的*行用如下語句替換m_b mp .LoadBitma p(IDB_BITMA P1);CreateCaret (&bitma p);4,輸出文字在On Draw函數(shù)中添加如下代碼1) ,簡單輸出文字CStri ng str;str="維新科學(xué)技術(shù)培訓(xùn)中心"P DC-&

45、gt;TextOut(5O,5O,str);2) ,獲取文字框大小備用CSize sz=pDC->GetTextExte nt(str);3) ,給str重新賦值,以區(qū)別于上一個(gè)內(nèi)容。當(dāng)然,之前需要在IDS_WEIXINstr.LoadStri ng(IDS_WEIXIN);p DC->TextOut(0,200,str);Stri ng Table中添加4),添加路徑層當(dāng)作圖的時(shí)候,如果想要在整幅圖形其中的某個(gè)部分和其它部分有所區(qū)別,我們可以把這部分圖形放到路徑層當(dāng)中,然后指定調(diào)用指定互操作模式調(diào)用SelectCli pP ath( int nMode )函數(shù)來使路徑層和覆蓋在其

46、上新繪圖剪切區(qū)域進(jìn)行互操作,達(dá)到特殊效果。P DC->Begi nP ath();p DC->Recta ngle(50,50,50+s z.cx,50+s z. cy);/p DC->E ndP ath();p DC->SelectCli pP ath(RGN_DIFF);路徑層的坐標(biāo)依賴于上面的文字位置5),畫一些方格,看看路徑層的效果。for(i nt i=0;i<300;i+=10)p DC->MoveTo(0,i); pDC->Li neTo(300,i);p DC->MoveTo(i,0); pDC->Li neTo(i,300

47、); 三、鼠標(biāo)移動(dòng)插入符給View增加兩個(gè)成員變量:CStri ng m_strLi ne用于存儲當(dāng)前輸入行的內(nèi)容; CP oi nt m_p tOrigin起插入符改變時(shí)的新行開始位置在OnLButtonDown函數(shù)中添加如下內(nèi)容用于保存鼠標(biāo)移動(dòng)引SetCaret Pos( poi nt);/設(shè)置插入符位置m_strLi ne.E mp ty(); m_p tOrigi n=poin t;/保存此位置另外,給View添加兩個(gè)變量四、響應(yīng)鍵盤輸入鍵盤響應(yīng)需要考慮如下內(nèi)容:1,鼠標(biāo)點(diǎn)擊鍵盤輸入一個(gè)字符,顯示到鍵盤上,插入符2,回車之后,光標(biāo)下移一行3,刪除/退格鍵的響應(yīng)/光標(biāo)后移一位。F面是程序

48、內(nèi)容:1給View類添加WM_CHA消息響應(yīng)函數(shù)2,在On Char函數(shù)中添加如下語句CClie ntDC dc(this);CFo nt font;font.CreatePointFont(300,"華文行楷 ”,NULL);CFo nt *p OldFo nt=dc.SelectObject (&fon t);TEXTMETRIC tm;dc.GetTextMetrics(&tm);if(0x0d=nChar)/回車鍵響應(yīng)程序段m_strLi ne.E mp ty();m_p tOrigi n.y+=tm.tmHeight;/用背景色模擬最后一個(gè)字符的消失COLO

49、RREF clr=dc.SetTextColor(dc.GetBkColor(); dc.TextOut(m_ ptOrigi n. x,m_ptOrigi n.y,m_strLi ne); m_strLi ne=m_strLi ne.Left(m_strLi ne.GetLe ngth()-1); dc.SetTextColor(clr);else if(0x08=nChar) elsem_strLi ne+=nChar;CSize sz=dc.GetTextExte nt(m_strL in e);CP oi nt pt;p t.x=m_ ptOrigi n. x+sz.cx;pt.y=m

50、_ ptOrigi n.y;SetCaret Pos( pt);dc.TextOut(m_ptOrig in .x,m_ ptOrigi n. y,m_strLi ne);dc.SelectObject( pOldFo nt);五、平滑變色-類似卡拉OK的跟唱文字顏色改變CDC:TextOut()是一個(gè)字母一個(gè)字母的輸出,達(dá)不到平滑效果。CDC:DrawText():將文字的輸出局限于一個(gè)矩形區(qū)域,超出矩形區(qū)域的文字都被截?cái)?。利用這一特點(diǎn),可每隔些時(shí)間增加矩形大小,從而可實(shí)現(xiàn)人眼中的平滑效果。1,設(shè)置定時(shí)器。在 View 中 OnCreate 或者其他地方添加SetTimer(1,100,NU

51、LL);2,給View類添加WM_TIME消息響應(yīng)函數(shù)3,4,m_給 View 添加成員變量 m_nWidth 用于保存顏色隨時(shí)間流逝變化的起點(diǎn) 在 OnTimer 中添加如下代碼 nWidth+=5;/ 每次位置增加CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);/ 獲取字體屬性CRect rect(0,200, m_nWidth,200+ tm.tmHeight);dc.SetTextColor(RGB(255,0,0);CString str;str.LoadString(IDS_WEIXIN);dc.DrawTex

52、t(str,rect,DT_LEFT);rect.top=150;rect.bottom=rect.top+tm.tmHeight;dc.DrawText(str,rect,DT_RIGHT);CSize sz=dc.GetTextExtent(str);if(m_nWidth>sz.cx)m_nWidth=0;dc.SetTextColor(RGB(0,255,0);dc.TextOut(0,200,str);簡單字處理軟件大功告成!第五章VC菜單相關(guān)編程閱讀本文前,我們假設(shè)您已經(jīng):12345,知道如何創(chuàng)建一個(gè)單文檔的App Wizard,知道C+類、函數(shù)重載等簡單知識,知道如何給Vi

53、ew類或者Doc文檔添加成員變量 ,會用MFC的 IDE調(diào)試工具最好,那么本文的程序您可以 ,知道如何為某個(gè)框架類添加虛函數(shù)或消息處理函數(shù)copy去調(diào)試一、消息的分類:消息的分類:標(biāo)準(zhǔn)消息,命令消息,通告消息。標(biāo)準(zhǔn)消息:除WM_COMMA之外,所有以 WM開頭的消息。命令消息:來自菜單、加速鍵或工具欄按鈕的消息。這類消息都以WM_COMMA呈現(xiàn)。在MFC中,通過菜單項(xiàng)的標(biāo)識 (ID)來區(qū)分不同的命令消息;在SDK中,通過消息的wParam參數(shù)識別。通告消息:由控件產(chǎn)生的消息,例如,按鈕的單擊, 的是向其父窗口 (通常是對話框) 通知事件的發(fā)生。列表框的選擇等均產(chǎn)生此類消息,為這類消息也是以 W

54、M COMMA形式呈現(xiàn)。注意:1)從CWnc派生的類,都可以接收到標(biāo)準(zhǔn)消息、命令消息和通告消息。2)3)CCmdTarget 是 CWnc的父類從CCmdTarget派生的類,都可以接收到命令消息和通告消息。二、菜單消息傳遞過程MFC中菜單項(xiàng)消息如果利用 ClassWizard來對菜單項(xiàng)消息分別在上述四個(gè)類中進(jìn)行響應(yīng), 則菜單消息傳遞順序:View類eDoc類eCMa in Frame類Spp類。菜單消息一旦在其中一個(gè)類中響應(yīng)則不再在其它類中查找響應(yīng)函數(shù)。當(dāng)點(diǎn)擊一個(gè)菜單項(xiàng)的時(shí)候,最先接受到菜單項(xiàng)消息的是CMainFrame框架類,CMainFrame框架類將會把菜單項(xiàng)消息交給它的子窗口 Vie

55、w類,由View類首先進(jìn)行處理;如果 View類檢 測到?jīng)]對該菜單項(xiàng)消息做響應(yīng),則 View類把菜單項(xiàng)消息交由文檔類 Doc類進(jìn)行處理;如果Doc類檢測到Doc類中也沒對該菜單項(xiàng)消息做響應(yīng), 則Doc類又把該菜單項(xiàng)消息交還給 View 類,由View類再交還給 CMai nF rame類處理。如果CMai nF rame類查看到 CMa in Frame類中也 沒對該消息做響應(yīng),則最終交給 App類進(jìn)行處理。三、菜單指針的獲取,及相關(guān)設(shè)置 在CMainFrame:OnCreate下可以直接實(shí)驗(yàn)以下操作幾個(gè)相關(guān)和重要的函數(shù)CMenu* GetMe nu( ) ;/CWnd:GetMe nu得到窗口菜單欄對象指針。CMenu* GetSubMe nu( ) ;/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論