?? mfc教程2_ mfc和win32.htm
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://www.vczx.com/tutorial/mfc/mfc2.php -->
<HTML><HEAD><TITLE>MFC教程_ MFC和Win32</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3157" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<OL start=2>
<P align=justify>
<LI><A name=_Toc445888977></A><A name=_Toc445782380></A><A
name=_Toc452640876></A><A name=_Toc457298941></A><B>MFC和Win32</B>
<P></P>
<OL>
<P align=justify>
<LI><B><A name=_Toc445888978></A><A name=_Toc445782381></A><A
name=_Toc452640877></A><A name=_Toc457298942></A>MFC Object和Windows
Object的關(guān)系</B>
<P></P></LI></OL></LI></OL>
<P align=justify>MFC中最重要的封裝是對(duì)Win32 API的封裝,因此,理解Windows Object和MFC Object
(C++對(duì)象,一個(gè)C++類的實(shí)例)之間的關(guān)系是理解MFC的關(guān)鍵之一。所謂Windows
Object(Windows對(duì)象)是Win32下用句柄表示的Windows操作系統(tǒng)對(duì)象;所謂MFC Object
(MFC對(duì)象)是C++對(duì)象,是一個(gè)C++類的實(shí)例,這里(本書范圍內(nèi))MFC Object是有特定含義的,指封裝Windows Object的C++
Object,并非指任意的C++ Object。</P>
<P align=justify>MFC Object 和Windows Object是不一樣的,但兩者緊密聯(lián)系。以窗口對(duì)象為例:</P><IMG
height=198 hspace=12 src="MFC教程_ MFC和Win32.files/image106.gif" width=385
align=left>
<P align=justify>一個(gè)MFC窗口對(duì)象是一個(gè)C++
CWnd類(或派生類)的實(shí)例,是程序直接創(chuàng)建的。在程序執(zhí)行中它隨著窗口類構(gòu)造函數(shù)的調(diào)用而生成,隨著析構(gòu)函數(shù)的調(diào)用而消失。而Windows窗口則是Windows系統(tǒng)的一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的實(shí)例,由一個(gè)“窗口句柄”標(biāo)識(shí),Windows系統(tǒng)創(chuàng)建它并給它分配系統(tǒng)資源。Windows窗口在MFC窗口對(duì)象創(chuàng)建之后,由CWnd類的Create成員函數(shù)創(chuàng)建,“窗口句柄”保存在窗口對(duì)象的m_hWnd成員變量中。Windows窗口可以被一個(gè)程序銷毀,也可以被用戶的動(dòng)作銷毀。MFC窗口對(duì)象和Windows窗口對(duì)象的關(guān)系如圖2-1所示。其他的Windows
Object和對(duì)應(yīng)的MFC Object也有類似的關(guān)系。</P>
<P align=justify></P>
<P align=justify>下面,對(duì)MFC Object和Windows
Object作一個(gè)比較。有些論斷對(duì)設(shè)備描述表(MFC類是CDC,句柄是HDC)可能不適用,但具體涉及到時(shí)會(huì)指出。</P>
<OL>
<P align=justify>
<LI>從數(shù)據(jù)結(jié)構(gòu)上比較
<P></P>
<P align=justify>MFC Object是相應(yīng)C++類的實(shí)例,這些類是MFC或者程序員定義的;</P>
<P align=justify>Windows Object是Windows系統(tǒng)的內(nèi)部結(jié)構(gòu),通過一個(gè)句柄來引用;</P>
<P align=justify>MFC給這些類定義了一個(gè)成員變量來保存MFC Object對(duì)應(yīng)的Windows
Object的句柄。對(duì)于設(shè)備描述表CDC類,將保存兩個(gè)HDC句柄。</P>
<P align=justify></P>
<LI>從層次上講比較
<P></P>
<P align=justify>MFC Object是高層的,Windows Object是低層的;</P>
<P align=justify>MFC Object封裝了Windows Object的大部分或全部功能,MFC
Object的使用者不需要直接應(yīng)用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相應(yīng)的MFC
Object的成員函數(shù)。</P>
<P align=justify></P>
<LI>從創(chuàng)建上比較
<P></P>
<P align=justify>MFC Object通過構(gòu)造函數(shù)由程序直接創(chuàng)建;Windows Object由相應(yīng)的SDK函數(shù)創(chuàng)建。</P>
<P align=justify>MFC中,使用這些MFC Object,一般分兩步:</P>
<P align=justify>首先,創(chuàng)建一個(gè)MFC Object,或者在STACK中創(chuàng)建,或者在HEAP中創(chuàng)建,這時(shí),MFC
Object的句柄實(shí)例變量為空,或者說不是一個(gè)有效的句柄。</P>
<P align=justify>然后,調(diào)用MFC Object的成員函數(shù)創(chuàng)建相應(yīng)的Windows Object,MFC的句柄變量存儲(chǔ)一個(gè)有效句柄。</P>
<P align=justify>CDC(設(shè)備描述表類)的創(chuàng)建有所不同,在后面的2.3節(jié)會(huì)具體說明CDC及其派生類的創(chuàng)建和使用。</P>
<P align=justify>當(dāng)然,可以在MFC
Object的構(gòu)造函數(shù)中創(chuàng)建相應(yīng)的Windows對(duì)象,MFC的GDI類就是如此實(shí)現(xiàn)的,但從實(shí)質(zhì)上講,MFC Object的創(chuàng)建和Windows
Object的創(chuàng)建是兩回事。</P>
<P align=justify></P>
<LI>從轉(zhuǎn)換上比較
<P></P>
<P align=justify>可以從一個(gè)MFC Object得到對(duì)應(yīng)的Windows Object的句柄;一般使用MFC
Object的成員函數(shù)GetSafeHandle得到對(duì)應(yīng)的句柄。</P>
<P align=justify>可以從一個(gè)已存在的Windows Object創(chuàng)建一個(gè)對(duì)應(yīng)的MFC Object; 一般使用MFC
Object的成員函數(shù)Attach或者FromHandle來創(chuàng)建,前者得到一個(gè)永久性對(duì)象,后者得到的可能是一個(gè)臨時(shí)對(duì)象。</P>
<P align=justify></P>
<LI>從使用范圍上比較
<P></P>
<P align=justify>MFC Object對(duì)系統(tǒng)的其他進(jìn)程來說是不可見、不可用的;而Windows
Object一旦創(chuàng)建,其句柄是整個(gè)Windows系統(tǒng)全局的。一些句柄可以被其他進(jìn)程使用。典型地,一個(gè)進(jìn)程可以獲得另一進(jìn)程的窗口句柄,并給該窗口發(fā)送消息。</P>
<P align=justify>對(duì)同一個(gè)進(jìn)程的線程來說,只可以使用本線程創(chuàng)建的MFC Object,不能使用其他線程的MFC Object。</P>
<P align=justify></P>
<LI>從銷毀上比較
<P></P></LI></OL>
<P align=justify>MFC Object隨著析構(gòu)函數(shù)的調(diào)用而消失;但Windows Object必須由相應(yīng)的Windows系統(tǒng)函數(shù)銷毀。</P>
<P align=justify>設(shè)備描述表CDC類的對(duì)象有所不同,它對(duì)應(yīng)的HDC句柄對(duì)象可能不是被銷毀,而是被釋放。</P>
<P align=justify>當(dāng)然,可以在MFC Object的析構(gòu)函數(shù)中完成Windows Object的銷毀,MFC
Object的GDI類等就是如此實(shí)現(xiàn)的,但是,應(yīng)該看到:兩者的銷毀是不同的。</P>
<P align=justify>每類Windows Object都有對(duì)應(yīng)的MFC
Object,下面用表格的形式列出它們之間的對(duì)應(yīng)關(guān)系,如表2-1所示:</P>
<P align=center>表2-1 MFC Object和Windows Object的對(duì)應(yīng)關(guān)系</P>
<P align=left>
<TABLE cellSpacing=1 cellPadding=7 width=480 border=1>
<TBODY>
<TR>
<TD vAlign=top width="18%">
<P align=justify>描述 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>Windows句柄 </P></TD>
<TD vAlign=top width="60%">
<P align=justify>MFC Object </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>窗口 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HWND </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CWnd and CWnd-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>設(shè)備上下文 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HDC </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CDC and CDC-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>菜單 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HMENU </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CMenu </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>筆 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HPEN </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CGdiObject類,CPen和CPen-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>刷子 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HBRUSH </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CGdiObject類,CBrush和CBrush-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>字體 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HFONT </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CGdiObject類,CFont和CFont-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>位圖 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HBITMAP </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CGdiObject類,CBitmap和CBitmap-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>調(diào)色板 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HPALETTE </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CGdiObject類,CPalette和CPalette-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>區(qū)域 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HRGN </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CGdiObject類,CRgn和CRgn-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>圖像列表 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>HimageLIST </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CimageList和CimageList-derived classes </P></TD></TR>
<TR>
<TD vAlign=top width="18%">
<P align=justify>套接字 </P></TD>
<TD vAlign=top width="22%">
<P align=justify>SOCKET </P></TD>
<TD vAlign=top width="60%">
<P align=justify>CSocket,CAsynSocket及其派生類 </P></TD></TR></TBODY></TABLE>
<P></P>
<P align=justify></P>
<P align=justify> </P>
<P align=justify>
<HR width="0%" SIZE=1>
表2-1中的OBJECT分以下幾類:
<P></P>
<P align=justify>Windows對(duì)象,</P>
<P align=justify>設(shè)備上下文對(duì)象,</P>
<P align=justify>GDI對(duì)象(BITMAP,BRUSH,F(xiàn)ONT,PALETTE,PEN,RGN),</P>
<P align=justify>菜單,</P>
<P align=justify>圖像列表,</P>
<P align=justify>網(wǎng)絡(luò)套接字接口。</P>
<P align=justify>從廣義上來看,文檔對(duì)象和文件可以看作一對(duì)MFC Object和Windows
Object,分別用CDocument類和文件句柄描述。</P>
<P align=justify>后續(xù)幾節(jié)分別對(duì)前四類作一個(gè)簡明扼要的論述。</P>
<OL>
<OL>
<P align=justify>
<LI><A name=_Toc445888979></A><A name=_Toc445782382></A><A
name=_Toc452640878></A><A name=_Toc457298943></A><B>Windows Object</B>
<P></P>
<P align=justify>用SDK的Win32
API編寫各種Windows應(yīng)用程序,有其共同的規(guī)律:首先是編寫WinMain函數(shù),編寫處理消息和事件的窗口過程WndProc,在WinMain里頭注冊(cè)窗口(Register
Window),創(chuàng)建窗口,然后開始應(yīng)用程序的消息循環(huán)。</P>
<P align=justify>MFC應(yīng)用程序也不例外,因?yàn)镸FC是一個(gè)建立在SDK
API基礎(chǔ)上的編程框架。對(duì)程序員來說所不同的是:一般情況下,MFC框架自動(dòng)完成了Windows登記、創(chuàng)建等工作。</P>
<P align=justify>下面,簡要介紹MFC Window對(duì)Windows Window的封裝。</P>
<OL>
<P align=justify>
<LI><A name=_Toc445888980></A><A name=_Toc445782383></A><A
name=_Toc452640879></A><A name=_Toc457298944></A><B>Windows的注冊(cè)</B>
<P></P></LI></OL></LI></OL></OL>
<P align=justify>一個(gè)應(yīng)用程序在創(chuàng)建某個(gè)類型的窗口前,必須首先注冊(cè)該“窗口類”(Windows
Class)。注意,這里不是C++類的類。Register Window把窗口過程、窗口類型以及其他類型信息和要登記的窗口類關(guān)聯(lián)起來。</P>
<OL>
<P align=justify>
<LI>“窗口類”的數(shù)據(jù)結(jié)構(gòu)
<P></P>
<P
align=justify>“窗口類”是Windows系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),可以把它理解為Windows系統(tǒng)的類型定義,而Windows窗口則是相應(yīng)“窗口類”的實(shí)例。Windows使用一個(gè)結(jié)構(gòu)來描述“窗口類”,其定義如下:</P>
<P align=justify>typedef struct _WNDCLASSEX { </P>
<P align=justify>UINT cbSize; //該結(jié)構(gòu)的字節(jié)數(shù)</P>
<P align=justify>UINT style; //窗口類的風(fēng)格</P>
<P align=justify>WNDPROC lpfnWndProc; //窗口過程</P>
<P align=justify>int cbClsExtra; </P>
<P align=justify>int cbWndExtra; </P>
<P align=justify>HANDLE hInstance; //該窗口類的窗口過程所屬的應(yīng)用實(shí)例</P>
<P align=justify>HICON hIcon; //該窗口類所用的像標(biāo)</P>
<P align=justify>HCURSOR hCursor; //該窗口類所用的光標(biāo)</P>
<P align=justify>HBRUSH hbrBackground; //該窗口類所用的背景刷</P>
<P align=justify>LPCTSTR lpszMenuName; //該窗口類所用的菜單資源</P>
<P align=justify>LPCTSTR lpszClassName; //該窗口類的名稱</P>
<P align=justify>HICON hIconSm; //該窗口類所用的小像標(biāo)</P>
<P align=justify>} WNDCLASSEX; </P>
<P
align=justify>從“窗口類”的定義可以看出,它包含了一個(gè)窗口的重要信息,如窗口風(fēng)格、窗口過程、顯示和繪制窗口所需要的信息,等等。關(guān)于窗口過程,將在后面消息映射等有關(guān)章節(jié)作詳細(xì)論述。</P>
<P
align=justify>Windows系統(tǒng)在初始化時(shí),會(huì)注冊(cè)(Register)一些全局的“窗口類”,例如通用控制窗口類。應(yīng)用程序在創(chuàng)建自己的窗口時(shí),首先必須注冊(cè)自己的窗口類。在MFC環(huán)境下,有幾種方法可以用來注冊(cè)“窗口類”,下面分別予以討論。</P>
<P align=justify></P>
<LI>調(diào)用AfxRegisterClass注冊(cè)
<P></P>
<P align=justify>AfxRegisterClass函數(shù)是MFC全局函數(shù)。AfxRegisterClass的函數(shù)原型:</P>
<P align=justify>BOOL AFXAPI AfxRegisterClass(WNDCLASS *lpWndClass);</P>
<P align=justify>參數(shù)lpWndClass是指向WNDCLASS結(jié)構(gòu)的指針,表示一個(gè)“窗口類”。</P>
<P
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -