




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、孫鑫VC+視頻筆記列表(全)簡(jiǎn) 介 第一課 Windows程序內(nèi)部運(yùn)行機(jī)制 第二課 MFC程序框架的剖析 第三課 MFC消息映射機(jī)制和DC的獲取 第四課 簡(jiǎn)單字處理軟件 第五課 菜單編程 第六課 對(duì)話(huà)框編程1 第七課 對(duì)話(huà)框編程2 第八課 MFC中各類(lèi)指針的獲取 第九課 應(yīng)用程序外觀修改 第十課 圖形繪制與通用對(duì)話(huà)框 第十一課 圖形保存和重繪 第十二課 文件操作 第十三課 文檔和串行化 第十四課 網(wǎng)絡(luò)編程 第十五課 多線(xiàn)程和簡(jiǎn)單聊天室制作 第十六課 線(xiàn)程同步與異步套接字編程 第十七課 進(jìn)程間通信 第十八課 ActiveX 控件 第十九課 動(dòng)態(tài)鏈接庫(kù) 第二十課 Hook鉤子函數(shù) 第0章 簡(jiǎn)介 L
2、esson1:Windows程序運(yùn)行原理及程序編寫(xiě)流程,窗口產(chǎn)生過(guò)程,句柄原理,消息隊(duì)列,回調(diào)函數(shù),窗口關(guān)閉與應(yīng)用程序退出的工作關(guān)系,使用VC+的若干小技巧,stdcall與cdecl調(diào)用規(guī)范的比較,初學(xué)者常犯錯(cuò)誤及注意事項(xiàng)。 Lesson2:C+經(jīng)典語(yǔ)法與應(yīng)用,類(lèi)的編寫(xiě)與應(yīng)用,構(gòu)造與析構(gòu)函數(shù),函數(shù)的重載,類(lèi)的繼承,函數(shù)覆蓋,基類(lèi)與派生類(lèi)的構(gòu)造函數(shù)、析構(gòu)函數(shù)先后調(diào)用順序,如何在派生類(lèi)構(gòu)造函數(shù)中向基類(lèi)的構(gòu)造函數(shù)傳遞參數(shù),this成員變量,類(lèi)型轉(zhuǎn)換的內(nèi)幕,虛擬函數(shù)與多態(tài)性,引用和指針變量的區(qū)別與共同處。VC工程的編譯原理與過(guò)程,將工程中不同的類(lèi)拆分到不同的文件中,每一個(gè)類(lèi)由一個(gè).h和.cpp文件共
3、同完成,頭文件重復(fù)定義問(wèn)題的解決,培養(yǎng)了學(xué)員良好的編程習(xí)慣,也為以后分析MFC AppWizard生成的工程奠定了良好基礎(chǔ)。 Lesson3:講述MFC AppWizard的原理與MFC程序框架的剖析。AppWizard是一個(gè)源代碼生成工具,是計(jì)算機(jī)輔助程序設(shè)計(jì)工具,WinMain在MFC程序中是如何從源程序中被隱藏的,theApp全局變量是如何被分配的,MFC框架中的幾個(gè)類(lèi)的作用與相互關(guān)系,MFC框架窗口是如何產(chǎn)生和銷(xiāo)毀的,對(duì)窗口類(lèi)的PreCreateWidow和OnCreate兩個(gè)函數(shù)的著重分析,Windows窗口與C+中的CWnd類(lèi)的關(guān)系。 Lesson4:MFC消息映射機(jī)制的剖析,講述
4、如何運(yùn)用ClassWizard,理解發(fā)送給窗口的消息是如何被MFC框架通過(guò)窗口句柄映射表和消息映射表來(lái)用窗口類(lèi)的函數(shù)進(jìn)行響應(yīng)的。掌握設(shè)備描述表及其封裝類(lèi)CDC的使用,CDC是如何與具體的設(shè)備發(fā)生關(guān)聯(lián)的,融合具體的畫(huà)圖程序進(jìn)行分析。如何設(shè)置封閉圖形的填充刷子(位圖畫(huà)刷與透明畫(huà)刷的使用)。 Lesson5:掌握CDC的文字處理程序的編寫(xiě),如何產(chǎn)生自定義字體和自定義插入符,熟悉對(duì)CString類(lèi)的使用。通過(guò)對(duì)卡拉OK程序的編寫(xiě),講解定時(shí)器的使用和DrawText函數(shù)的巧妙運(yùn)用。講解如何使用CDC的裁減功能。 Lesson6:菜單的工作原理及編寫(xiě)應(yīng)用,菜單命令消息在MFC框架程序的幾個(gè)類(lèi)中的傳遞順序和
5、處理過(guò)程。標(biāo)記菜單、缺省菜單的實(shí)現(xiàn)原理、圖形菜單的實(shí)現(xiàn)及常犯錯(cuò)誤的分析,GetSystemMetrics的應(yīng)用,快捷彈出菜單的實(shí)現(xiàn)方式及其命令響應(yīng)函數(shù)有效范圍(與彈出菜單時(shí)所指定的父窗口有密切的關(guān)系,最底層的子窗口具有最優(yōu)先的處理機(jī)會(huì))。動(dòng)態(tài)菜單的編寫(xiě),如何讓程序在運(yùn)行時(shí)產(chǎn)生新的菜單項(xiàng)及如何手工為這些新產(chǎn)生的菜單命令安排處理函數(shù),如何在頂層窗口中截獲對(duì)菜單命令的處理,更進(jìn)一步掌握CString類(lèi)的應(yīng)用。 Lesson7:對(duì)話(huà)框用戶(hù)界面程序的編寫(xiě),如何向?qū)υ?huà)框控件關(guān)聯(lián)數(shù)據(jù)成員及其實(shí)現(xiàn)機(jī)理,如何利用對(duì)話(huà)框類(lèi)的成員函數(shù)向控件發(fā)送消息和獲取對(duì)話(huà)框控件的類(lèi)指針,如何直接利用對(duì)話(huà)框控件類(lèi)操縱對(duì)話(huà)框控件(發(fā)
6、送消息和直接調(diào)用成員函數(shù))。如何在程序運(yùn)行時(shí)產(chǎn)生和銷(xiāo)毀控件。對(duì)話(huà)框控件的幾種操作方式的優(yōu)劣比較分析。如何實(shí)現(xiàn)對(duì)話(huà)框的部分收縮和展開(kāi)。如何讓對(duì)話(huà)框上的文本框在程序啟動(dòng)后立即獲得焦點(diǎn),如何利用SetWindowLong改變窗口的回調(diào)函數(shù),通過(guò)改變文本框的默認(rèn)回車(chē)處理方式進(jìn)行演示。實(shí)現(xiàn)多個(gè)輸入文本框間通過(guò)回車(chē)逐一向下傳遞焦點(diǎn)的另一種巧妙方法(用缺省按鈕來(lái)處理)。 Lesson8:逃跑按鈕的巧妙實(shí)現(xiàn)。如何制作屬性頁(yè)對(duì)話(huà)框和向?qū)?duì)話(huà)框,融合講解組合框(如何調(diào)整組合框的大小)、列表框、單選按鈕、復(fù)選按鈕等常用對(duì)話(huà)框控件的多種使用方法。如何限制用戶(hù)在不滿(mǎn)足設(shè)定的條件時(shí)切換到其他屬性頁(yè)和向?qū)ы?yè)。 Lesson
7、9:如何修改MFC AppWizard向?qū)傻目蚣艹绦虻耐庥^和大小,修改圖標(biāo)、光標(biāo)、背景的三種方法。如何增加和刪除工具欄按鈕,如何給應(yīng)用程序增加工具欄,如何顯示和隱藏工具欄。定制狀態(tài)欄,在狀態(tài)欄中添加時(shí)鐘顯示,CTime類(lèi)及其用法。在狀態(tài)欄中添加進(jìn)度條(主窗口產(chǎn)生后立即產(chǎn)生進(jìn)度條的巧妙思想,不能在OnCreate函數(shù)中直接處理,要用到自定義消息的方法)。鼠標(biāo)坐標(biāo)顯示,在CView中獲取狀態(tài)欄對(duì)象的幾種方式。如何為應(yīng)用程序添加啟動(dòng)畫(huà)面。 Lesson10:圖形的繪制,如何使用自定義畫(huà)筆(顏色,線(xiàn)寬,線(xiàn)型)。如何為程序中添加選項(xiàng)菜單和選項(xiàng)設(shè)置對(duì)話(huà)框,如何使用標(biāo)準(zhǔn)顏色對(duì)話(huà)框,如何使用字體對(duì)話(huà)框,在
8、選項(xiàng)對(duì)話(huà)框中實(shí)現(xiàn)預(yù)覽功能。實(shí)現(xiàn)選項(xiàng)對(duì)話(huà)框和窗口類(lèi)中的數(shù)據(jù)交換。如何改變對(duì)話(huà)框和控件的背景色,如何改變控件的文本顏色,對(duì)按鈕控件的特殊處理。如何在窗口中顯示一幅位圖。 Lesson11:如何讓CDC上輸出的文字、圖形具有保持功能,集合類(lèi)CPtrArray的使用,CPaintDC與CClientDC的區(qū)別與應(yīng)用,OnPaint與OnDraw在CView中的關(guān)系及實(shí)現(xiàn)內(nèi)幕,滾動(dòng)窗口的實(shí)現(xiàn),坐標(biāo)空間,映射方式,設(shè)備坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換。元文件設(shè)備描述表的使用,如何利用兼容DC實(shí)現(xiàn)圖形的保存和再現(xiàn)。 Lesson12:const char *與char * const的區(qū)別。C語(yǔ)言對(duì)文件讀寫(xiě)的支持,F(xiàn)I
9、LE指針;文本文件和二進(jìn)制文件的區(qū)別。用文本方式讀寫(xiě)文件和以二進(jìn)制方式讀寫(xiě)文件的注意事項(xiàng)。C+對(duì)文件讀寫(xiě)的支持,ofstream和ifstream的用法。Win32 SDK對(duì)文件讀寫(xiě)的支持,CreateFile函數(shù)、WriteFile函數(shù)、ReadFile函數(shù)的使用;MFC對(duì)文件讀寫(xiě)的支持,CFile類(lèi)和CFileDialog的使用,文件過(guò)濾器的設(shè)置。win.ini文件和注冊(cè)表的讀寫(xiě)方式及相關(guān)知識(shí)點(diǎn)。 Lesson13:使用CArchive類(lèi)對(duì)文件進(jìn)行操作。MFC框架程序提供的文件新建與打開(kāi)功能內(nèi)部的實(shí)現(xiàn)機(jī)制。如何利用CDocument類(lèi)的串行化存儲(chǔ)功能保存與加載數(shù)據(jù)。如何實(shí)現(xiàn)類(lèi)對(duì)串行化的支持
10、,CObArray的串行化實(shí)現(xiàn)內(nèi)幕。刪除文檔數(shù)據(jù)時(shí)常犯的錯(cuò)誤。MFC框架程序的文檔類(lèi)和視類(lèi)的關(guān)系,以及如何獲得相互的指針引用。 Lesson14:網(wǎng)絡(luò)的相關(guān)知識(shí),網(wǎng)絡(luò)程序的編寫(xiě),Socket是連接應(yīng)用程序與網(wǎng)絡(luò)驅(qū)動(dòng)程序的橋梁,Socket在應(yīng)用程序中創(chuàng)建,通過(guò)bind與驅(qū)動(dòng)程序建立關(guān)系。此后,應(yīng)用程序送給Socket的數(shù)據(jù),由Socket交給驅(qū)動(dòng)程序向網(wǎng)絡(luò)上發(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)用程序就是這樣通過(guò)socket進(jìn)行數(shù)據(jù)的發(fā)送與接收的。TCP與UDP的工作原理與
11、編寫(xiě)過(guò)程,如何在程序中鏈接庫(kù)文件。一個(gè)字符界面的聊天程序。 Lesson15:多線(xiàn)程程序的編寫(xiě),多線(xiàn)程應(yīng)用中容易出現(xiàn)的問(wèn)題?;コ鈱?duì)象的講解,如何使用互斥對(duì)象來(lái)實(shí)現(xiàn)多線(xiàn)程的同步。如何利用命名互斥對(duì)象保證應(yīng)用程序只有一個(gè)實(shí)例運(yùn)行。應(yīng)用多線(xiàn)程編寫(xiě)網(wǎng)絡(luò)聊天室程序。 Lesson16:事件內(nèi)核對(duì)象、關(guān)鍵代碼段(臨界區(qū))的講解,以及在多線(xiàn)程同步中的應(yīng)用。在Windows下編寫(xiě)基于消息的網(wǎng)絡(luò)應(yīng)用程序,掌握阻塞與非阻塞網(wǎng)絡(luò)程序的編寫(xiě),理解在Windows平臺(tái)下,采用異步選擇機(jī)制可以提高網(wǎng)絡(luò)應(yīng)用程序的性能。 Lesson17:詳細(xì)講解進(jìn)程間通訊的四種方式:剪貼板、匿名管道、命名管道和郵槽。并比較分析這幾種進(jìn)程間
12、通信的優(yōu)點(diǎn)和缺點(diǎn)。 Lesson18:ActiveX控件的應(yīng)用與工作原理。ActiveX控件的編寫(xiě),如何為控件安排屬性,方法,事件,屬性頁(yè),持久性存儲(chǔ),控件如何通知容器自身屬性的改變。如何注冊(cè)控件與取消控件注冊(cè)。在VB和VC中訪問(wèn)ActiveX控件。 Lesson19:動(dòng)態(tài)鏈接庫(kù)程序的編寫(xiě)。靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別,以及調(diào)用程序在鏈接靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)時(shí)的區(qū)別。如何利用工具查看動(dòng)態(tài)鏈接庫(kù)輸出的函數(shù),Depends工具的使用,C+編譯器名字改編技術(shù)對(duì)動(dòng)態(tài)鏈接庫(kù)輸出函數(shù)的影響,extern "C"的用法,利用模塊定義文件來(lái)解決C+名字改編的問(wèn)題。用typedef定義指向函數(shù)的指針類(lèi)型,
13、如何獲得動(dòng)態(tài)連接庫(kù)里的函數(shù)的指針。 Lesson20:Hook編程。如何安裝鉤子過(guò)程,如何編寫(xiě)全局鉤子,動(dòng)態(tài)連接庫(kù)里的全局變量數(shù)據(jù)共享問(wèn)題分析。ADO數(shù)據(jù)庫(kù)編程。在VB中利用ADO控件和ADO對(duì)象訪問(wèn)數(shù)據(jù)庫(kù),在VC中利用ADO技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)。 第一章 Windows程序內(nèi)部運(yùn)行機(jī)制 這一章比較零散,筆記也很零散 一、windows是事件驅(qū)動(dòng)方式的程序設(shè)計(jì)windows程序設(shè)計(jì)是一種事件驅(qū)動(dòng)方式的程序設(shè)計(jì),主要是基于消息的。當(dāng)用戶(hù)需要完成某種功能時(shí),需要調(diào)用OS(操作系統(tǒng))某種支持,然后OS將用戶(hù)的需要包裝成消息,并投入到消息隊(duì)列中,最后應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。 二、消息隊(duì)列每個(gè)
14、應(yīng)用程序OS都為它建立一個(gè)消息隊(duì)列,消息隊(duì)列是個(gè)先進(jìn)先出的緩沖區(qū),其中每個(gè)元素都是一個(gè)消息,OS將生成的每個(gè)消息按先后順序放進(jìn)消息隊(duì)列中,應(yīng)用程序總是取走當(dāng)前消息隊(duì)列中的第一條消息,應(yīng)用程序取走消息后便知道用戶(hù)的操作和程序的狀態(tài),然后對(duì)其處理即消息響應(yīng),消息響應(yīng)通過(guò)編碼實(shí)現(xiàn)。 三、Window程序入口WinMain函數(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)過(guò)下面四個(gè)操作步驟1, 設(shè)計(jì)一個(gè)窗口類(lèi)。如:WNDCLASS wndcls。2, 注冊(cè)窗口類(lèi)。如:RegisterClass(&wnd
15、cls)。3, 創(chuàng)建窗口。如:CreateWindow(),CreateWindowEX();4, 顯示及更新窗口。如:ShowWindow(),UpdateWindow();其他值得注意的地方1, 消息結(jié)構(gòu)typedef struct tagMSG / msg HWND hwnd; /接收消息的窗口句柄。和哪個(gè)窗口相關(guān)聯(lián)。 UINT message; /消息標(biāo)識(shí)。消息本身是什么。 WPARAM wParam; /消息的附加信息。具體取決于消息本身。 LPARAM lParam; DWORD time; /消息投遞時(shí)間。 POINT pt; /消息投遞時(shí),光標(biāo)在屏幕上的位置。 MSG;2, 掌
16、握windows的消息機(jī)制需要掌握兩方面:(1)消息本身。不同消息所代表的用戶(hù)操作和應(yīng)用程序的狀態(tài)。(2)對(duì)于某個(gè)特定的消息來(lái)說(shuō),要讓OS執(zhí)行某個(gè)特定的功能去響應(yīng)消息。3, Window入口函數(shù)說(shuō)明int WINAPI WinMain( HINSTANCE hInstance, / 當(dāng)前事例句柄。 HINSTANCE hPrevInstance, / 先前事例句柄。32位系統(tǒng)中此值都為NULL LPSTR lpCmdLine, / 命令行指針 int nCmdShow / (窗口)顯示的狀態(tài));要帶參調(diào)用WinMain,類(lèi)似于命令行的功能,在Projectèsettingè
17、Debug頁(yè)èProgram arguments項(xiàng)填寫(xiě)參數(shù)4, Windows提供的窗口類(lèi)詳解typedef struct _WNDCLASS UINT style; /窗口的類(lèi)型 WNDPROC lpfnWndProc; /窗口過(guò)程函數(shù)指針(回調(diào)函數(shù)) int cbClsExtra; /窗口類(lèi)附加字節(jié),為該類(lèi)窗口所共享。通常0。 int cbWndExtra; /窗口附加字節(jié)。通常設(shè)為0。 HANDLE hInstance; /當(dāng)前應(yīng)用程序事例句柄。 HICON hIcon; /圖標(biāo)句柄 LoadIcon(); HCURSOR hCursor; /光標(biāo)句柄 LoadCursor()
18、; HBRUSH hbrBackground; /畫(huà)刷句柄 (HBRUSH)GetStockObject(); LPCTSTR lpszMenuName; /菜單名字 LPCTSTR lpszClassName; /類(lèi)的名字 WNDCLASS;5, 消息循環(huán):MSG msg;while(GetMessage(&msg,.) /從消息隊(duì)列中取出一條消息 TranslateMessage(&msg); /進(jìn)行消息(如鍵盤(pán)消息)轉(zhuǎn)換 DispatchMessage(&msg); /分派消息到窗口的回調(diào)函數(shù)處理,(OS調(diào)用窗口回調(diào)函數(shù)進(jìn)行處理)。6, 回調(diào)函數(shù)LRESULT C
19、ALLBACK WindowProc( /這里WindowProc是個(gè)代號(hào)名字。 HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter);說(shuō)明:兩種函數(shù)調(diào)用約定(_stdcall 和 _cdecl):#define CALLBACK _stdcall /_stdcall 標(biāo)準(zhǔn)調(diào)用預(yù)定,是PASCAL 調(diào)用約定,象DELPHI使用的就是標(biāo)準(zhǔn)調(diào)用約定#define W
20、INAPIV _cdecl / _cdecl 是C 語(yǔ)言形式的調(diào)用約定。主要區(qū)別:函數(shù)參數(shù)傳遞順序 和 對(duì)堆棧的清除上。問(wèn)題:除了那些可變參數(shù)的函數(shù)調(diào)用外,其余的一般都是_stdcall約定。但 C/C+編譯默然的是_cdecl約定。所以如果在VC等環(huán)境中調(diào)用_stdcall約定的函數(shù),必須要在函數(shù)聲明的時(shí)加上 _stdcall 修飾符,以便對(duì)這個(gè)函數(shù)的調(diào)用是使用_stdcall約定(如使用DELPHI編寫(xiě)的DLL時(shí)候)。(VC中可通過(guò)這途徑修改:projectèsettingsèc/c+ècategary選”Code Generation”,出現(xiàn)Call con
21、vention選項(xiàng),修改之)7, DC句柄的使用(1)使用BeginPaint(),EndPaint()對(duì)。注意只能在響應(yīng)WM_PAINT消息時(shí)使用。(2)使用GetDc(),ReleaseDC()對(duì)。注意他們不能在響應(yīng)WM_PAINT中使用。8, 其它(1)函數(shù)名代表函數(shù)的首地址。(2)創(chuàng)建窗口的時(shí)候一定要基于已經(jīng)注冊(cè)的窗口類(lèi).第二章 MFC程序框架的剖析說(shuō)明:本課對(duì)應(yīng)教學(xué)視頻的第三課,第二課是C+,被我跳過(guò)去。C+我打算另外在用多點(diǎn)的篇幅來(lái)討論。 重點(diǎn):MFC運(yùn)行機(jī)制提示:對(duì)于不想理解內(nèi)部運(yùn)行過(guò)程的,可以不看這一章,可以看了后面的界面設(shè)計(jì)再回頭來(lái)看這一章,可能感覺(jué)更深刻。這一次課和上一次的
22、課的重點(diǎn)就是MFC的窗口類(lèi)創(chuàng)建過(guò)程,而要反復(fù)說(shuō)明的就是:MFC的程序和C語(yǔ)言的程序,從執(zhí)行原理上說(shuō),是完全一致的。抓住這一點(diǎn),那么對(duì)于理解MFC程序的運(yùn)行機(jī)制也就相對(duì)于簡(jiǎn)單了。C中的main函數(shù)就相當(dāng)于MFC中的WinMain函數(shù)。感興趣的可以利用VC的斷點(diǎn)設(shè)置自己跟蹤下面講述的各個(gè)函數(shù),就明白它的執(zhí)行順序了。一、C語(yǔ)言程序執(zhí)行步驟在C語(yǔ)言中,大約的步驟如下:1, 全局變量?jī)?nèi)存分配2, 進(jìn)入main函數(shù)二、MFC程序的運(yùn)行步驟(主要是初始化)打開(kāi)一個(gè)MFC APPWizard(exe)工程,跟蹤其執(zhí)行步驟,可以發(fā)現(xiàn),是以下順序:1) CXXApp中的全局變量定義CXXApp theApp;2)
23、 調(diào)用CXXApp構(gòu)造函數(shù)CXXApp :CXXApp()3) 進(jìn)入Winmain函數(shù)(_tWinMain為宏,值為WinMain)_tWinMain()4) 完成初始化工作:包括窗口類(lèi)注冊(cè)、窗口產(chǎn)生、顯示和更新pThread->InitInstance() 對(duì)于MFC程序,MainFrame,View,ToolBar,Controlbar等都是窗口,所以下面的窗口注冊(cè)與創(chuàng)建、顯示等要反復(fù)調(diào)用多次,一次對(duì)應(yīng)一個(gè)窗口(1) 注冊(cè)窗口類(lèi)AfxEndDeferRegisterClass(2) 創(chuàng)建窗口CMainFrame:PreCreateWindow()/反復(fù)調(diào)用一次是給我們修改窗口屬性的機(jī)
24、會(huì)CFrameWnd:Create()(3) 消息循環(huán)PumpMessage()補(bǔ)充1:在MFC中,由于涉及到(窗口)類(lèi)定義,所以定義全局變量的時(shí)候,需要進(jìn)行更多的步驟。全局變量涉及到類(lèi)定義(類(lèi)似于C中的類(lèi)型定義)的話(huà),那么需要遵循以下步驟(以MFC的窗口類(lèi)為例)1) 設(shè)計(jì)一個(gè)窗口類(lèi)2) 注冊(cè)窗口類(lèi)3) 創(chuàng)建窗口4) 顯示及更新窗口5) 消息循環(huán)補(bǔ)充2:其他需要注意的幾點(diǎn)1, 每一個(gè)MFC程序,有且只有一個(gè)從WinApp類(lèi)派生的類(lèi)(應(yīng)用程序類(lèi)),也只有一個(gè)從應(yīng)用程序類(lèi)所事例化的對(duì)象,表示應(yīng)用程序本身。在WIN32程序當(dāng)中,表示應(yīng)用程序是通過(guò)WINMAIN入口函數(shù)來(lái)表示的(通過(guò)一個(gè)應(yīng)用程序的一個(gè)
25、事例號(hào)這一個(gè)標(biāo)識(shí)來(lái)表示的)。在基于MFC應(yīng)用程序中,是通過(guò)產(chǎn)生一個(gè)應(yīng)用程序?qū)ο?,用它?lái)唯一的表示了應(yīng)用程序。2, _tWinMain函數(shù)中通過(guò)調(diào)用AfxWinMain()函數(shù)來(lái)完成它要完成的功能。(Afx*前綴代表這是應(yīng)用程序框架函數(shù),是一些全局函數(shù),應(yīng)用程序框架是一套輔助生成應(yīng)用程序的框架模型,把一些類(lèi)做一些有機(jī)的集成,我們可根據(jù)這些類(lèi)函數(shù)來(lái)設(shè)計(jì)自己的應(yīng)用程序)。3, 設(shè)計(jì)窗口類(lèi):在MFC中事先設(shè)計(jì)好了幾種缺省的窗口類(lèi),根據(jù)不同的應(yīng)用程序的選擇,調(diào)用AfxEndDeferRegisterClass()函數(shù)注冊(cè)所選擇的窗口類(lèi)。4, PreCreateWindow()是個(gè)虛函數(shù),如果子類(lèi)有則調(diào)用
26、子類(lèi)的。5, CreateWindowEx()函數(shù)參數(shù)與CREATESTRUCT結(jié)構(gòu)體成員完全一致,CreateWindowEx()函數(shù)與CREATESTRUCT結(jié)構(gòu)體參數(shù)的對(duì)應(yīng)關(guān)系,使我們?cè)趧?chuàng)建窗口之前通過(guò)可PreCreateWindow(cs)修改cs結(jié)構(gòu)體成員來(lái)修改所要的窗口外觀。6,注意兩個(gè)函數(shù)。:TranslateMessage(&m_msgCur)函數(shù)進(jìn)行消息(如鍵盤(pán)消息)轉(zhuǎn)換:DispatchMessage(&m_msgCur)函數(shù)分派消息到窗口的回調(diào)函數(shù)處理(實(shí)際上分派的消息經(jīng)過(guò)消息映射,交由消息響應(yīng)函數(shù)進(jìn)行處理。)7,可以認(rèn)為View類(lèi)窗口是CMainFram
27、類(lèi)窗口的子窗口。DOCument類(lèi)是文檔類(lèi)。DOC-VIEW結(jié)構(gòu)將數(shù)據(jù)本身與它的顯示分離開(kāi)。文檔類(lèi)用于數(shù)據(jù)的存儲(chǔ),加載;視類(lèi)用于數(shù)據(jù)的顯示,修改8,CTEApp:InitInstance()函數(shù)中通過(guò)文檔模板將文檔類(lèi),視類(lèi),框架類(lèi)的有機(jī)組織一起。語(yǔ)句如下:CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTEDoc), RUNTIME_CLASS(CMainFrame), / main SDI frame window RUNTIME_CLA
28、SS(CTEView);AddDocTemplate(pDocTemplate);/增加到模板 補(bǔ)充3:本課涉及到MFC函數(shù)的源文件位置根目錄找到您安裝VC98下MFC的位置,比如我的機(jī)子上為:D:Program FilesMicrosoft Visual StudioVC98MFC。下面提供的就是相對(duì)路徑了。CWinApp構(gòu)造函數(shù): MFCèSRCèAPPCORE.CPPAfxWinMain:MFCèSRCèWINMAIN.CPPAfxEndDeferRegisterClass: MFCèSRCèAPPCORE.CPPCFrameW
29、nd:PreCreateWindow()函數(shù)所在文件:MFCèSRCèWINFRM.CPPCFrameWnd:Create()函數(shù)路徑:MFCèSRCèWINFRM.CPPCWnd:CreateEx()函數(shù)路徑:MFCèSRCèWINCORE.CPPCWinThread:Run()方法路徑:MFCèSRCèTHRDCORE.CPP第三章 MFC消息映射機(jī)制和繪圖DC的獲取我們假設(shè)您已經(jīng): 1,知道如何創(chuàng)建一個(gè)單文檔的App Wizard 2,知道C+ 類(lèi)、函數(shù)重載等簡(jiǎn)單知識(shí) 3,知道如何給View類(lèi)或者Doc文檔添
30、加成員變量 4,會(huì)用MFC的IDE調(diào)試工具最好,那么本文的程序您可以copy去調(diào)試 我們?cè)谏弦还?jié)講了MFC框架App類(lèi)、View類(lèi)、MainFrame類(lèi)和Doc類(lèi)的關(guān)系,那么,基于消息的windows MFC程序設(shè)計(jì)是如何進(jìn)行消息映射的呢? 在進(jìn)行下一節(jié)之前,我們來(lái)復(fù)習(xí)一下。 對(duì)于一個(gè)MFC APPWizard運(yùn)用程序,CMainFrame和View是窗口類(lèi),并且是父子關(guān)系,Doc一般用于數(shù)據(jù)的加載和存儲(chǔ),View用于圖像的顯示,App中是包括一些(窗口)初始化之類(lèi)的東西。 我們開(kāi)始這一節(jié)的內(nèi)容。一、 消息映射機(jī)制windows程序設(shè)計(jì)是種事件驅(qū)動(dòng)方式的程序設(shè)計(jì),主要基于消息的。當(dāng)用戶(hù)需要完成
31、某種功能時(shí),需要調(diào)用OS某種支持,然后OS將用戶(hù)的需要包裝成消息,并投入到消息隊(duì)列中,最后應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。在左邊View類(lèi)處點(diǎn)右鍵,在出現(xiàn)的菜單里點(diǎn)擊“Add Windows Message Handler”,在出現(xiàn)的對(duì)話(huà)框里選擇“WM_LBUTTONDOWN”,添加消息映射函數(shù)?;氐皆募?,我們將看到三處進(jìn)行了修改:1, 在頭文件(View.h)中聲明消息響應(yīng)函數(shù)原型。/AFX_MSG(CDrawView) /注釋宏afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/AFX_MSG /注釋宏afx_msg宏表示
32、聲明的是一個(gè)消息響應(yīng)函數(shù)。2, 在源文件(View.cpp)中進(jìn)行消息映射。BEGIN_MESSAGE_MAP(CDrawView, CView) /AFX_MSG_MAP(CDrawView) ON_WM_LBUTTONDOWN() /AFX_MSG_MAP在宏BEGIN_MESSAGE_MAP()與END_MESSAGE_MAP()之間進(jìn)行消息映射。宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN與它的響應(yīng)函數(shù)OnLButtonDown()相關(guān)聯(lián)。這樣一旦有消息的產(chǎn)生,就會(huì)自動(dòng)調(diào)用相關(guān)聯(lián)的消息響應(yīng)函數(shù)去處理。宏ON_WM_LBUTTONDOWN()定義如下: #d
33、efine ON_WM_LBUTTONDOWN() WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp, (AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd:*)(UINT, CPoint)&OnLButtonDown ,3, 源文件中進(jìn)行消息響應(yīng)函數(shù)處理。void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CView:OnLButtonDow
34、n(nFlags, point);說(shuō)明:可見(jiàn)當(dāng)增加一個(gè)消息響應(yīng)處理,在以上三處進(jìn)行了修改。可在消息響應(yīng)函數(shù)里添加消息處理代碼完成對(duì)消息的響應(yīng)、處理。 消息響應(yīng)的可能方式:1)在基類(lèi)中針對(duì)每種消息做一個(gè)虛函數(shù),當(dāng)子類(lèi)對(duì)消息響應(yīng)時(shí)候,只要在子類(lèi)中重寫(xiě)這個(gè)虛函數(shù)即可。缺點(diǎn):MFC類(lèi)派生層次很多,如果在基類(lèi)對(duì)每個(gè)消息進(jìn)行虛函數(shù)處理,那么從基類(lèi)派生的每個(gè)子類(lèi)都將背負(fù)一個(gè)龐大的虛表,這樣浪費(fèi)內(nèi)存,故MFC沒(méi)有采取這中方式而采取消息映射方式。2)消息映射方式:MFC在后臺(tái)維護(hù)了一個(gè)句柄和C+對(duì)象指針對(duì)照表,當(dāng)收到一個(gè)消息后,通過(guò)消息結(jié)構(gòu)里資源句柄(查對(duì)照表)就可找到與它對(duì)應(yīng)的一個(gè)C+對(duì)象指針,然后把這個(gè)指針
35、傳給基類(lèi),基類(lèi)利用這個(gè)指針調(diào)用WindowProc()函數(shù)對(duì)消息進(jìn)行處理,WindowProc()函數(shù)中調(diào)用OnWndMsg()函數(shù),真正的消息路由及處理是由OnWndMsg()函數(shù)完成的。由于WindowProc()和OnWndMsg()都是虛函數(shù),而且是用派生類(lèi)對(duì)象指針調(diào)用的,由多態(tài)性知最總終調(diào)用子類(lèi)的。在OnWndMsg()函數(shù)處理的時(shí)候,根據(jù)消息種類(lèi)去查找消息映射,判斷所發(fā)的消息有沒(méi)有響應(yīng)函數(shù),具體方式是到相關(guān)的頭文件和源文件中尋找消息響應(yīng)函數(shù)聲明(從注釋宏/AFX_MSG(CDrawView)./AFX_MSG之間尋找),消息映射(從宏BEGIN_MESSAGE_MAP(.).END
36、_MESSAGE_MAP()之間尋找),最終找到對(duì)應(yīng)的消息處理函數(shù)。當(dāng)然,如果子類(lèi)中沒(méi)有對(duì)消息進(jìn)行處理,則消息交由基類(lèi)處理。說(shuō)明:virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);二、 繪圖DC的獲取說(shuō)明:在View類(lèi)添加WM_LBUTTONDOWN和WM_LBUTTONUP的消息處理函數(shù),我們將用來(lái)演示各種DC的獲取,以及顯示效果。Vi
37、ew類(lèi)添加全局變量CPoint m_ptOrigin用來(lái)存儲(chǔ)左鍵按下點(diǎn)坐標(biāo)。下面集中來(lái)關(guān)注OnLButtonUp中的繪圖程序和效果。以下語(yǔ)句添加于OnLButtonUp函數(shù)中,可以查看不同的效果。1,使用SDK獲取DC句柄:HDC hdc;hdc=:GetDc(m_hWnd);/獲取DC句柄MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);LineTo(hdc,point.x,point.y);:ReleaseDC(m_hWnd,hdc);/釋放DC2,利用CDC類(lèi)指針和CWin類(lèi)成員函數(shù)獲取DC。CDC *pDC=GetDC();pDC->Mov
38、eTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);3,利用CClientDC對(duì)象。(CClientDC類(lèi)從CDC類(lèi)派生來(lái)的)CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);4,利用CWindowDC對(duì)象。(CWindowDC類(lèi)從CDC類(lèi)派生來(lái)的)CWindowDC dc(this);/dc.MoveTo(m_ptOrigin);dc.LineTo(point);5,父窗口(MainFrame框架)和屏幕指針。將上面的dc(this)分別改成GetParent()和GetD
39、esktopWindow(),就可以得到父窗口指針和屏幕窗口指針??梢苑謩e試驗(yàn)畫(huà)線(xiàn)效果。6,利用畫(huà)筆改變線(xiàn)條顏色和類(lèi)型:CPen pen(PS_DOT,1,RGB(0,255,0);/構(gòu)造畫(huà)筆對(duì)象CClientDC dc(this);CPen *pOldPen=dc.SelectObject(&pen);/將畫(huà)筆選入DCdc.MoveTo(m_ptOrigin);dc.LineTo(point);dc.SelectObject(pOldPen);/恢復(fù)先前的畫(huà)筆7,使用畫(huà)刷(通常利用畫(huà)刷去填充矩形區(qū)域):使用單色畫(huà)刷CBrush brush(RGB(255,0,0);/構(gòu)造畫(huà)刷對(duì)象CC
40、lientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),&brush);/用指定的畫(huà)刷去填充矩形區(qū)域使用位圖畫(huà)刷CBitmap bitmap;/構(gòu)造位圖對(duì)象(使用前需要初試化)bitmap.LoadBitmap(IDB_BITMAP1);/初試化位圖對(duì)象CBrush brush(&bitmap);/構(gòu)造位圖畫(huà)刷CClientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),&brush);/用指定的位圖畫(huà)刷去填充矩形區(qū)域使用透明畫(huà)刷CBrush *pBrush=CBrush:
41、FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);/獲取透明畫(huà)刷對(duì)象指針CClientDC dc(this);CBrush *pOldBrush=dc.SelectObject(pBrush);/將透明畫(huà)刷選入DCdc.Rectangle(CRect(m_ptOrigin,point);dc.SelectObject(pOldBrush);/釋放透明畫(huà)刷8,注意點(diǎn):1)靜態(tài)方法不屬于某一個(gè)具體對(duì)象,而屬于類(lèi)本身,在類(lèi)加載的時(shí)候就已經(jīng)為類(lèi)靜態(tài)方法分配了代碼去,故可用CBrush:FromHandle()形式調(diào)用。2)靜態(tài)方法中,不能引用非靜態(tài)的數(shù)據(jù)成員和方
42、法。3)靜態(tài)數(shù)據(jù)成員需要在類(lèi)外單獨(dú)做初始化,形式如: 變量類(lèi)型 類(lèi)名:變量名=初始值;第四章 文本編輯和字處理軟件這一節(jié)我們主要講述文本編輯方面的知識(shí),孫鑫老師的視頻就是一個(gè)簡(jiǎn)單字處理軟件的制作過(guò)程,所以我也是按照順序,敘述此過(guò)程。在MFC中CEditView 和 cRichEditView類(lèi)已經(jīng)完成了初步的文字處理??梢宰?xiě)?yīng)用程序的View類(lèi)以CEditView 和 cRichEditView類(lèi)為基類(lèi)。下面我們以單文檔視圖為例一、創(chuàng)建插入符。文字在插入符后插入(正如Word中閃爍的光標(biāo))1, 添加View類(lèi)的WM_CREATE消息響應(yīng)函數(shù)2, 在CXXXView:OnCreate()中添加/
43、獲得當(dāng)前文本度量/字體信息CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);/根據(jù)當(dāng)前字體,設(shè)置插入符/光標(biāo)CreateSolidCaret(20,100); /*ShowCaret();3, 創(chuàng)建圖形插入符1),為View類(lèi)添加成員變量m_bmp;2),把上面的*行用如下語(yǔ)句替換m_bmp.LoadBitmap(IDB_BITMAP1);CreateCaret(&m_bmp);4, 二、 輸出文字在OnDraw函數(shù)中添加如下代碼1),簡(jiǎn)單輸出文字CString str;str="維新科學(xué)技術(shù)培訓(xùn)中心&qu
44、ot;pDC->TextOut(50,50,str);2),獲取文字框大小備用 CSize sz=pDC->GetTextExtent(str);3),給str重新賦值,以區(qū)別于上一個(gè)內(nèi)容。當(dāng)然,之前需要在String Table中添加IDS_WEIXIN str.LoadString(IDS_WEIXIN);pDC->TextOut(0,200,str);4),添加路徑層當(dāng)作圖的時(shí)候,如果想要在整幅圖形其中的某個(gè)部分和其它部分有所區(qū)別,我們可以把這部分圖形放到路徑層當(dāng)中,然后指定調(diào)用指定互操作模式調(diào)用SelectClipPath( int nMode )函數(shù)來(lái)使路徑層和覆蓋
45、在其上新繪圖剪切區(qū)域進(jìn)行互操作,達(dá)到特殊效果。pDC->BeginPath();pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);/路徑層的坐標(biāo)依賴(lài)于上面的文字位置pDC->EndPath();pDC->SelectClipPath(RGN_DIFF);5),畫(huà)一些方格,看看路徑層的效果。for(int i=0;i<300;i+=10) pDC->MoveTo(0,i);pDC->LineTo(300,i); pDC->MoveTo(i,0);pDC->LineTo(i,300);三、鼠標(biāo)移動(dòng)插入符給View增
46、加兩個(gè)成員變量:CString m_strLine用于存儲(chǔ)當(dāng)前輸入行的內(nèi)容;CPoint m_ptOrigin用于保存鼠標(biāo)移動(dòng)引起插入符改變時(shí)的新行開(kāi)始位置在OnLButtonDown函數(shù)中添加如下內(nèi)容SetCaretPos(point);/設(shè)置插入符位置m_strLine.Empty();m_ptOrigin=point;/保存此位置另外,給View添加兩個(gè)變量四、響應(yīng)鍵盤(pán)輸入鍵盤(pán)響應(yīng)需要考慮如下內(nèi)容:1, 鼠標(biāo)點(diǎn)擊鍵盤(pán)輸入一個(gè)字符,顯示到鍵盤(pán)上,插入符/光標(biāo)后移一位。2, 回車(chē)之后,光標(biāo)下移一行3, 刪除/退格鍵的響應(yīng)下面是程序內(nèi)容:1,給View類(lèi)添加WM_CHAR消息響應(yīng)函數(shù)2,在On
47、Char函數(shù)中添加如下語(yǔ)句CClientDC dc(this);CFont font;font.CreatePointFont(300,"華文行楷",NULL);CFont *pOldFont=dc.SelectObject(&font);TEXTMETRIC tm;dc.GetTextMetrics(&tm);if(0x0d=nChar)/回車(chē)鍵響應(yīng)程序段 m_strLine.Empty(); m_ptOrigin.y+=tm.tmHeight;else if(0x08=nChar) /用背景色模擬最后一個(gè)字符的消失 COLORREF clr=dc.Set
48、TextColor(dc.GetBkColor(); dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine); m_strLine=m_strLine.Left(m_strLine.GetLength()-1); dc.SetTextColor(clr);elsem_strLine+=nChar;CSize sz=dc.GetTextExtent(m_strLine);CPoint pt;pt.x=m_ptOrigin.x+sz.cx;pt.y=m_ptOrigin.y;SetCaretPos(pt);dc.TextOut(m_ptOrigin.x,m_
49、ptOrigin.y,m_strLine);dc.SelectObject(pOldFont);五、平滑變色-類(lèi)似卡拉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,NULL);2,給View類(lèi)添加WM_TIMER消息響應(yīng)函數(shù)3,給View添加成員變量int m_nWidth用于保存顏色隨時(shí)間流逝變化的起點(diǎn)4
50、,在OnTimer中添加如下代碼m_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.DrawText(str,rect,DT_LEFT); rect.top=150;rect.bottom=rect.top+tm.tmHeight;dc.DrawT
51、ext(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);簡(jiǎn)單字處理軟件大功告成!第五章 VC菜單相關(guān)編程 閱讀本文前,我們假設(shè)您已經(jīng): 1,知道如何創(chuàng)建一個(gè)單文檔的App Wizard 2,知道C+ 類(lèi)、函數(shù)重載等簡(jiǎn)單知識(shí) 3,知道如何給View類(lèi)或者Doc文檔添加成員變量 4,會(huì)用MFC的IDE調(diào)試工具最好,那么本文的程序您可以copy去調(diào)試 5,知道如何為某個(gè)框架類(lèi)添加
52、虛函數(shù)或消息處理函數(shù)一、消息的分類(lèi):消息的分類(lèi):標(biāo)準(zhǔn)消息,命令消息,通告消息。標(biāo)準(zhǔn)消息:除WM_COMMAND之外,所有以WM_開(kāi)頭的消息。命令消息:來(lái)自菜單、加速鍵或工具欄按鈕的消息。這類(lèi)消息都以WM_COMMAND呈現(xiàn)。在MFC中,通過(guò)菜單項(xiàng)的標(biāo)識(shí)(ID)來(lái)區(qū)分不同的命令消息;在SDK中,通過(guò)消息的wParam參數(shù)識(shí)別。通告消息:由控件產(chǎn)生的消息,例如,按鈕的單擊,列表框的選擇等均產(chǎn)生此類(lèi)消息,為的是向其父窗口(通常是對(duì)話(huà)框)通知事件的發(fā)生。這類(lèi)消息也是以WM_COMMAND形式呈現(xiàn)。注意:1)從CWnd派生的類(lèi),都可以接收到標(biāo)準(zhǔn)消息、命令消息和通告消息。2)從CCmdTarget派生的類(lèi)
53、,都可以接收到命令消息和通告消息。3)CCmdTarget是CWnd的父類(lèi)二、菜單消息傳遞過(guò)程MFC中菜單項(xiàng)消息如果利用ClassWizard來(lái)對(duì)菜單項(xiàng)消息分別在上述四個(gè)類(lèi)中進(jìn)行響應(yīng),則菜單消息傳遞順序:View類(lèi)èDoc類(lèi)èCMainFrame類(lèi)èApp類(lèi)。菜單消息一旦在其中一個(gè)類(lèi)中響應(yīng)則不再在其它類(lèi)中查找響應(yīng)函數(shù)。當(dāng)點(diǎn)擊一個(gè)菜單項(xiàng)的時(shí)候,最先接受到菜單項(xiàng)消息的是CMainFrame框架類(lèi),CMainFrame框架類(lèi)將會(huì)把菜單項(xiàng)消息交給它的子窗口View類(lèi),由View類(lèi)首先進(jìn)行處理;如果View類(lèi)檢測(cè)到?jīng)]對(duì)該菜單項(xiàng)消息做響應(yīng),則View類(lèi)把菜單項(xiàng)消息交由文檔類(lèi)D
54、oc類(lèi)進(jìn)行處理;如果Doc類(lèi)檢測(cè)到Doc類(lèi)中也沒(méi)對(duì)該菜單項(xiàng)消息做響應(yīng),則Doc類(lèi)又把該菜單項(xiàng)消息交還給View類(lèi),由View類(lèi)再交還給CMainFrame類(lèi)處理。如果CMainFrame類(lèi)查看到CMainFrame類(lèi)中也沒(méi)對(duì)該消息做響應(yīng),則最終交給App類(lèi)進(jìn)行處理。三、菜單指針的獲取,及相關(guān)設(shè)置在CMainFrame:OnCreate下可以直接實(shí)驗(yàn)以下操作幾個(gè)相關(guān)和重要的函數(shù)CMenu* GetMenu( ) ;/CWnd:GetMenu得到窗口菜單欄對(duì)象指針。CMenu* GetSubMenu( ) ;/CMenu:GetSubMenu獲得指向彈出菜單對(duì)象指針UINT CheckMenuItem( );/CMenu:CheckMenuItem Adds check marks to or removes check marks from
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)4立方液壓翻斗培養(yǎng)料混合機(jī)數(shù)據(jù)監(jiān)測(cè)報(bào)告
- 2025年中國(guó)10KV級(jí)美式箱變壓器數(shù)據(jù)監(jiān)測(cè)報(bào)告
- 毒麻精藥品管理知識(shí)培訓(xùn)
- 2025至2030年中國(guó)肓人石市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)童男皮鞋市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)電腦小麥著水機(jī)市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)燃煤茶爐市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)活動(dòng)單體冷凍柜市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)楔塊式繩頭組合市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)尼龍轉(zhuǎn)子市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2022年溫州職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘考試筆試試題及答案解析
- UML-超市管理系統(tǒng)
- 裝修改造工程施工總平面圖6
- (完整版)標(biāo)書(shū)密封條格式word
- 《關(guān)于漢語(yǔ)規(guī)范化的意義探析》
- 生物安全自查表
- [湖南]5萬(wàn)噸凈水廠給排水工藝全套圖紙(附170頁(yè)計(jì)算說(shuō)明)
- DB33T 1203-2020 建設(shè)工程施工揚(yáng)塵控制技術(shù)標(biāo)準(zhǔn)
- 外國(guó)文學(xué)名著導(dǎo)讀
- 腦卒中患者血壓管理
- 如何制作OruxMaps離線(xiàn)地圖
評(píng)論
0/150
提交評(píng)論