- 2個類
- 新建的MFC項目有兩個類,一個APP類田炭,一個對話框類
- main函數(shù)通過getapp得到app類的全局對象地址,調(diào)用app類的虛函數(shù)Initinstance
- InitInstance里create/Domodal通過對話框類創(chuàng)建對話框
- 消息響應(yīng)
- 控件添加消息的時候悄雅,對應(yīng)的對話框類添加了3個成員:
- 該消息的處理函數(shù)聲明
- 該消息的處理函數(shù)實現(xiàn)
- 把消息和函數(shù)建立聯(lián)系:消息映射表添加成員
- 什么消息 什么控件觸發(fā)的響應(yīng)消息 觸發(fā)了該消息怎么辦喉酌,把消息和函數(shù)關(guān)聯(lián)起來
2.1 怎么自己添加一個消息響應(yīng) - 添加消息處理的函數(shù)聲明和實現(xiàn)
- 在消息映射表里添加對應(yīng)項
- 添加變量
3.1 值類型變量
- 更新控件內(nèi)容/變量內(nèi)容:
- UpdateData(TRUE):->GetXXX->從控件獲取內(nèi)容更新到變量
- UpdateData(FALSE):->SetXXX->把變量內(nèi)容顯示到控件上
3.2 控件類型的變量 - 直接操作該控件對應(yīng)的類的成員函數(shù)來控制控件
3.3 變量怎么和控件建立聯(lián)系 - 對于對話框資源,自定義對話框類的時候鹿霸,就會指定ID
- 對于子控件排吴,通過DDX_XXX,把變量和資源綁定懦鼠,建立聯(lián)系
- 沒經(jīng)過DDX_XXX的钻哩,變量只是變量,和資源沒關(guān)系肛冶,沒綁定街氢,調(diào)用類的成員函數(shù)就會失敗,程序崩潰
1睦袖、MFC 編程中已經(jīng)看不到WinMain函數(shù)珊肃,那么我們編程的起始位置在哪里?
答:CWinApp的派生類對象。
2馅笙、對于消息映射來說有幾個宏特別重要伦乔,分別是哪些,應(yīng)該寫在何處?
答:在類的定義頭文件中董习,聲明消息映射的宏DECLARE_MESSAGE_MAP(),在類的實現(xiàn)源文件里烈和,通過BEGIN_MESSAGE_MAP和END_MESSAGE_MAP實現(xiàn)消息映射。
3阱飘、假如我們在對話框類中調(diào)用SendMessase函數(shù)斥杜,請觀察它與學(xué)SDK時的不同,請問這是為什么?
答:系統(tǒng)消息:::SendMessage(this->m_hWnd,WM_CLOSE,0,0);
控件通告消息:::SendMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,ID_GET,NULL);
自定義消息:::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);
給應(yīng)用程序發(fā)送:如:CWnd pWnd=CWnd::FindWindow(NULL,str);//獲取目的窗口對象句柄 str為窗口名稱 ::SendMessage(pWnd,WM_CLOSE,0,0);
在MFC中封裝類使用全局作用符::函數(shù)SendMessge沥匈,而在sdk中不用蔗喂。
4、如何給將對話框與一個類綁定? 請寫出步驟
答:一高帖、先寫一個對話框類缰儿;二、對應(yīng)的對話框類添加了3個成員:該消息的處理函數(shù)聲明散址,該消息的處理函數(shù)實現(xiàn)乖阵,把消息和函數(shù)建立聯(lián)系:消息映射表添加成員宣赔。
5、如何給對話框上的控件綁定一個變量? 請寫出步驟
答:一瞪浸、添加控件類型變量或者值變量儒将;二、值變量使用UpdateData(TRUE):->GetXXX->從控件獲取內(nèi)容更新到變量对蒲,UpdateData(FALSE):->SetXXX->把變量內(nèi)容顯示到控件上钩蚊。
直接操作該控件對應(yīng)的類的成員函數(shù)來控制控件。三蹈矮、對于對話框資源砰逻,自定義對話框類的時候,就會指定ID泛鸟,對于子控件蝠咆,通過DDX_XXX,把變量和資源綁定北滥,建立聯(lián)系刚操。
6、類向?qū)Э梢宰鍪裁?
答:類向?qū)Э梢詭椭覀冮_發(fā)對話框或控件更快地實現(xiàn)類再芋,變量赡茸,消息,函數(shù)的聲明實現(xiàn)和綁定祝闻。
7、模態(tài)對話框與非模態(tài)對話框有什么區(qū)別? 在MFC 中分別如何創(chuàng)建遗菠?
答:模態(tài)對話框有自帶的消息循環(huán)联喘,而非模態(tài)對話框則需要自己實現(xiàn)自己的消息循環(huán)。在MFC中創(chuàng)建模態(tài)對話框的父窗口產(chǎn)生子窗口后辙纬,不能操作父窗口豁遭,而非模態(tài)的可以。
創(chuàng)建模態(tài)對話框使用對應(yīng)的對話框類對象調(diào)用DoModal函數(shù)后直接調(diào)用ShowWindow顯示贺拣,非模態(tài)的對話框則使用對話框類指針指向該類對象蓖谢,然后用指針調(diào)用Create函數(shù)。最后指針調(diào)用ShowWindow函數(shù)譬涡。
=================
1闪幽、Button有幾種?
答:Button控件有按鈕PushButton,單選框RadioBox涡匀,復(fù)選框CheckBox盯腌。
2、Radio 怎么綁定陨瘩,怎么分組?
答:先分組后綁定腕够,分組時需將第一個radio控件的屬性group設(shè)置為true级乍,其后所有g(shù)roup屬性為false的均與其為一組,然后可以在radio上綁定變量帚湘,推薦綁定int型變量配合updatedata使用玫荣。
3、在MFC 中貼圖方式有幾種?都是怎么操作的大诸。
答:一捅厂、靜態(tài)方式,在圖片控件的Image屬性中底挫,添加圖片資源ID恒傻;二、動態(tài)方式建邓,建立一個Cbitmap的圖像盈厘,加載圖片資源,綁定Cstatic類型的變量官边,調(diào)用SetBitMap函數(shù)沸手。
4、資源腳本的定義格式是什么?
答:[資源ID] [資源類型] [資源說明]
5注簿、我們制作一個選項卡契吉,僅需要一個TabCtrl 的控件就可以了嗎? 還需要什么資源?
答:選項卡的制作,除了需要TabCtrl 的控件诡渴,還要TabCtrl 的控件變量捐晶,子窗口控件資源等。
6妄辩、制作選項卡時惑灵,子窗口的屬性分別要設(shè)置哪兩個內(nèi)容?
答:子窗口的屬性Style設(shè)置為child,Border屬性設(shè)為None眼耀。
================
1.內(nèi)核對象可以理解為一一個由操作系統(tǒng)內(nèi)核管理的與Windows 系統(tǒng)相關(guān)的對象英支,有內(nèi)核空間中以結(jié)構(gòu)體的方式存在,存儲著此對象的相關(guān)屬性哮伟。請何內(nèi)核對象都有哪些? 寫
出你所知道的全部干花。
答:內(nèi)核對象有:進(jìn)程,線程楞黄,訪問令牌池凄,文件,文件映射谅辣,I/O完成端口修赞,郵槽,管道,互斥體柏副,信號量勾邦,事件,計時器割择,線程池眷篇。
2.創(chuàng)建一個內(nèi)核對象一般都使用CreatexXX 函數(shù),返回值一般是一個內(nèi)核對象句柄荔泳。請回答以下三個問題:
a) 這些函數(shù)都有一個參數(shù)可以作為區(qū)分創(chuàng)建內(nèi)核對象與其他對象的標(biāo)志蕉饼,這參數(shù)是什么?有什么含義?
答:
In DWORD dwCreationFlags ,創(chuàng)建標(biāo)志玛歌;指定了內(nèi)核對象創(chuàng)建的方式昧港。
進(jìn)程的安全屬性
b)什么是句柄? 談?wù)勀愕睦斫狻?br> 答:對象的索引。
c) 句柄都有哪些種類?
答:句柄的種類有
HBRUSH:標(biāo)示畫刷句柄
HCOURSOR:標(biāo)示鼠標(biāo)光標(biāo)句柄
HDC:標(biāo)示設(shè)備環(huán)境句柄
HFONT:標(biāo)示字體句柄
HICON:標(biāo)示圖標(biāo)句柄
HINSTANCE:標(biāo)示當(dāng)前實例句柄
HMENU:標(biāo)示菜單句柄
HPALETTE:顏色調(diào)色板句柄
HPEN:標(biāo)示畫筆句柄
HWND:標(biāo)示窗口句柄
HBITMP:標(biāo)示位圖句柄
HFILE:標(biāo)示文件句柄
HKEY:注冊表項句柄
HANDLE
3.對于內(nèi)核對象句柄來說支子,進(jìn)程中有一個句柄表创肥。不同進(jìn)程中的句柄表存儲的相同的柄值代表的是同一個內(nèi)核對象嗎?
答:句柄表用于記錄本進(jìn)程所打開的所有的內(nèi)核對象,當(dāng)中的每一項值朋,描述了使用此句柄訪問內(nèi)核對象的權(quán)限叹侄,以及此句柄是否可以被子進(jìn)程繼承。每個進(jìn)程中的句柄表的柄值僅僅對于本進(jìn)程有效昨登,所以相同的柄值可能代表的是同一個內(nèi)核對象趾代,也可能不是。
4.內(nèi)核對象由windows 操作系統(tǒng)管理丰辣,故而內(nèi)核對象對于整個操作系統(tǒng)來說是全局的撒强,請回答以下兩個問題:
a)如何在不同的進(jìn)程中訪問同一個內(nèi)核對象,請說出至少三種方法笙什。
答:
① 使用對象句柄繼承尿褪;
② 為對象命名;
③ 復(fù)制對象句柄得湘。
b)當(dāng)一個進(jìn)程銷毀時,內(nèi)核對象句柄表中的句柄全部都會銷毀嗎? 結(jié)合引用計數(shù)顿仇,談?wù)勀銓@個問題的理解淘正。
答:
每一個內(nèi)核對象都有一個引用計數(shù),存在使用到的該內(nèi)核對象的進(jìn)程臼闻,則引用計數(shù)加一鸿吆,進(jìn)程終止或者關(guān)閉了句柄,引用計數(shù)自減一述呐,當(dāng)引用計數(shù)為零的時候惩淳,那么內(nèi)核對象就會銷毀。所以當(dāng)一個進(jìn)程銷毀的時候,內(nèi)核對象句柄表中的句柄不一定會都會銷毀思犁,因為可能別的進(jìn)程還在使用某內(nèi)核對象代虾。
5.什么是進(jìn)程,什么是線程激蹲,談?wù)勀銓@個問題的理解棉磨。
答:進(jìn)程是資源的分配和調(diào)度的一個獨立單元,而線程是CPU調(diào)度的基本單元学辱,同一個進(jìn)程中可以包括多個線程乘瓤,并且線程共享整個進(jìn)程的資源(寄存器、堆棧策泣、上下文)衙傀,一個進(jìn)程至少包括一個線程。
6.什么是模塊? 模塊句柄的本質(zhì)是什么?
答:一個模塊代表的是一個運行中的exe文件或dll文件萨咕,用來代表這個文件中所有的代碼和資源统抬, 磁盤上的文件不是模塊,裝入內(nèi)存后運行時就叫做模塊任洞。一個應(yīng)用程序調(diào)用其他DLL中的API時蓄喇,這些DLL文件被裝入內(nèi)存,就產(chǎn)生了不同的模塊交掏,為了區(qū)分 地址空間中的不同模塊妆偏,每個模塊都有一個惟一的模塊句柄來標(biāo)識。在WINDOWS下盅弛,模塊指的是EXE和DLL等數(shù)據(jù)加載到內(nèi)存中的影像钱骂,模塊句柄又是比較特殊的,它跟一般的句柄不一樣挪鹏,模塊句柄指向的就是EXE和DLL等的在內(nèi)存的位置(就是指向它們的數(shù)據(jù)起始位置)见秽。
7.請寫出你知道的進(jìn)程間通訊的方式,越詳細(xì)越好讨盒。
答:
文件映射
文件映射(Memory-Mapped Files)能使進(jìn)程把文件內(nèi)容當(dāng)作進(jìn)程地址區(qū)間一塊內(nèi)存那樣來對待解取。因此,進(jìn)程不必使用文件I/O操作返顺,只需簡單的指針操作就可讀取和修改文件的內(nèi)容禀苦。
共享內(nèi)存
Win32 API中共享內(nèi)存(Shared Memory)實際就是文件映射的一種特殊情況。進(jìn)程在創(chuàng)建文件映射對象時用0xFFFFFFFF來代替文件句柄(HANDLE)遂鹊,就表示了對應(yīng)的文件映射對象是從操作系統(tǒng)頁面文件訪問內(nèi)存振乏,其它進(jìn)程打開該文件映射對象就可以訪問該內(nèi)存塊。由于共享內(nèi)存是用文件映射實現(xiàn)的秉扑,所以它也有較好的安全性慧邮,也只能運行于同一計算機上的進(jìn)程之間。
匿名管道
管道(Pipe)是一種具有兩個端點的通信通道:有一端句柄的進(jìn)程可以和有另一端句柄的進(jìn)程通信。管道可以是單向-一端是只讀的误澳,另一端點是只寫的耻矮;也可以是雙向的一管道的兩端點既可讀也可寫。
匿名管道(Anonymous Pipe)是 在父進(jìn)程和子進(jìn)程之間脓匿,或同一父進(jìn)程的兩個子進(jìn)程之間傳輸數(shù)據(jù)的無名字的單向管道淘钟。通常由父進(jìn)程創(chuàng)建管道,然后由要通信的子進(jìn)程繼承通道的讀端點句柄或?qū)?端點句柄陪毡,然后實現(xiàn)通信米母。父進(jìn)程還可以建立兩個或更多個繼承匿名管道讀和寫句柄的子進(jìn)程。這些子進(jìn)程可以使用管道直接通信毡琉,不需要通過父進(jìn)程铁瞒。
命名管道
命名管道(Named Pipe)是服務(wù)器進(jìn)程和一個或多個客戶進(jìn)程之間通信的單向或雙向管道。不同于匿名管道的是命名管道可以在不相關(guān)的進(jìn)程之間和不同計算機之間使用桅滋,服務(wù)器建立命名管道時給它指定一個名字慧耍,任何進(jìn)程都可以通過該名字打開管道的另一端,根據(jù)給定的權(quán)限和服務(wù)器進(jìn)程通信丐谋。
郵件槽
郵件槽(Mailslots)提供進(jìn)程間單向通信能力芍碧,任何進(jìn)程都能建立郵件槽成為郵件槽服務(wù)器。其它進(jìn)程号俐,稱為郵件槽客戶泌豆,可以通過郵件槽的名字給郵件槽服務(wù)器進(jìn)程發(fā)送消息。進(jìn)來的消 息一直放在郵件槽中吏饿,直到服務(wù)器進(jìn)程讀取它為止踪危。一個進(jìn)程既可以是郵件槽服務(wù)器也可以是郵件槽客戶,因此可建立多個郵件槽實現(xiàn)進(jìn)程間的雙向通信猪落。
剪貼板
剪貼板(Clipped Board)實質(zhì)是Win32 API中一組用來傳輸數(shù)據(jù)的函數(shù)和消息贞远,為Windows應(yīng)用程序之間進(jìn)行數(shù)據(jù)共享提供了一個中介,Windows已建立的剪切(復(fù)制)-粘貼的機制為不同應(yīng)用程序之間共享不同格式數(shù)據(jù)提供了一條捷徑笨忌。當(dāng)用戶在應(yīng)用程序中執(zhí)行剪切或復(fù)制操作時蓝仲,應(yīng)用程序把選取的數(shù)據(jù)用一種或多種格式放在剪貼板上。然后任何其它應(yīng)用程序都可以從剪貼板上拾取數(shù)據(jù)官疲,從給定格式中選擇適合自己的格式杂曲。
動態(tài)數(shù)據(jù)交換
動態(tài)數(shù)據(jù)交換(DDE)是使用共享內(nèi)存在應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換的一種進(jìn)程間通信形式。應(yīng)用程序可以使用DDE進(jìn)行一次性數(shù)據(jù)傳輸袁余,也可以當(dāng)出現(xiàn)新數(shù)據(jù)時,通過發(fā)送更新值在應(yīng)用程序間動態(tài)交換數(shù)據(jù)咱揍。
對象連接與嵌入
應(yīng)用程序利用對象連接與嵌入(OLE)技術(shù)管理復(fù)合文檔(由多種數(shù)據(jù)格式組成的文檔)颖榜,OLE提供使某應(yīng)用程序更容易調(diào)用其它應(yīng)用程序進(jìn)行數(shù)據(jù)編輯的服務(wù)。例如,OLE支持的字處理器可以嵌套電子表格掩完,當(dāng)用戶要編輯電子表格時OLE庫可自動啟動電子表格編輯器噪漾。當(dāng)用戶退出電子表格編輯器時,該表格已在原始字處理器文檔中得到更新且蓬。在這里電子表格編輯器變成了字處理器的擴(kuò)展欣硼,而如果使用DDE,用戶要顯式地啟動電子表格編輯器恶阴。
動態(tài)連接庫
Win32動態(tài)連接庫(DLL)中的全局?jǐn)?shù)據(jù)可以被調(diào)用DLL的所有進(jìn)程共享诈胜,這就又給進(jìn)程間通信開辟了一條新的途徑,當(dāng)然訪問時要注意同步問題冯事。
NetBios函數(shù)
Win32 API提供NetBios函數(shù)用于處理低級網(wǎng)絡(luò)控制焦匈,這主要是為IBM NetBios系統(tǒng)編寫與Windows的接口。除非那些有特殊低級網(wǎng)絡(luò)功能要求的應(yīng)用程序昵仅,其它應(yīng)用程序最好不要使用NetBios函數(shù)來進(jìn)行進(jìn)程間通信缓熟。
Sockets
Windows Sockets規(guī)范是以U.C.Berkeley大學(xué)BSD UNIX中流行的Socket接口為范例定義的一套Windows下的網(wǎng)絡(luò)編程接口。除了Berkeley Socket原有的庫函數(shù)以外摔笤,還擴(kuò)展了一組針對Windows的函數(shù)够滑,使程序員可以充分利用Windows的消息機制進(jìn)行編程。
WM_COPYDATA消息
WM_COPYDATA是一種非常強大卻鮮為人知的消息吕世。當(dāng)一個應(yīng)用向另一個應(yīng)用傳送數(shù)據(jù)時彰触,發(fā)送方只需使用調(diào)用SendMessage函數(shù),參數(shù)是目的窗口的句柄寞冯、傳遞數(shù)據(jù)的起始地址渴析、WM_COPYDATA消息。接收方只需像處理其它消息那樣處理WM_COPY DATA消息吮龄,這樣收發(fā)雙方就實現(xiàn)了數(shù)據(jù)共享俭茧。