大家網(wǎng)visual c擴展編程實例_第1頁
大家網(wǎng)visual c擴展編程實例_第2頁
大家網(wǎng)visual c擴展編程實例_第3頁
免費預(yù)覽已結(jié)束,剩余5頁可下載查看

下載本文檔

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

文檔簡介

1、第11章普 通 窗 口MFC應(yīng)用程序中幾乎所有的窗口都是特殊的 要框,要視窗口或是控件窗口。但它們都是同一種窗口即普通窗口的不同變化。本章的實例將講解如何創(chuàng)建一個通用 窗口,它適用于任何情況。Windows應(yīng)用程序的用戶界面完全是由單個的窗口所組成的,這些窗口具有不同的和風(fēng)格。多數(shù)情況下,使用Developer Studio中的編輯器和向?qū)ё詣拥貙⒋翱诩尤氲綉?yīng)用程序中去,縱觀除此之外就需要以找到許多這方面的例子。不幸的是,向?qū)е荒軇?chuàng)建一些特定種類的窗口,動手去創(chuàng)建的窗口了。本章中包含在應(yīng)用程序用戶界面的任何位置創(chuàng)手工建各種窗口的實例。它們包括:實例38實例39創(chuàng)建普通窗口。本例將演示如何只用M

2、FC的一般窗口過程來創(chuàng)建窗口。創(chuàng)建一個窗口類 短調(diào)用形式,本例將演示如何使用 MFC的AfxRegisterWnd-Class ()函數(shù)創(chuàng)建自定義窗口類,該函數(shù)自動填充了很多空白。實例40 創(chuàng)建一個窗口類 長調(diào)用形式,本例將演示如何使用MFC的AfxRegisterClass()函數(shù)創(chuàng)建一個窗口類,該函數(shù)可以由用戶完全窗口的類創(chuàng)建過程。11.1 實例38:創(chuàng)建普通窗口1. 目標(biāo)創(chuàng)建一個普通窗口,如圖11-1所示。2. 策略本例將使用MFC的通用窗口類CWnd 來創(chuàng)建這些窗口。同時還將用 Windows API來直接創(chuàng)建窗口。然后使用一種將這個CWnd對象連接到已存在窗口上的方法。3. 步驟1)

3、 使用CWnd創(chuàng)建一個普通窗口使用MFC創(chuàng)建一個普通窗口,可以使用:CWnd wnd;使用CWnd和的窗使用“ BUTTON”窗口類 和CWnd類創(chuàng)建的按鈕 口類創(chuàng)建的重疊窗口 使用Windows API 創(chuàng)建并用一 個CWnd類封裝的重疊窗口 圖11-1 四個普通窗口Hh= :Load( NULL,MAKEINTRESOURCE( IDR_WZD_) );wnd.CreateEx( 0,_T( "AfxWnd" ), "Caption", WS_CHILD|WS_VISIBLE, 10,10,100,75,/ extended window style

4、/ MFC window class name/ window caption/ window style/ x,y position/ width and height使用CButton類創(chuàng)建的按鈕第11章 普 通 窗 口255m_hWnd,h/ parent window handle/handle,or if child window, a window id);上面使用的的窗口類名是通用MFC窗口。為了創(chuàng)建一個按鈕控件,只需要使用 AfxWnd來代替BUTTON:CWnd wndButton;wndButton.CreateEx( 0,_T( "BUTTON" ),

5、"My Button", WS_CHILD|WS_VISIBLE, 10,10,100,75,hWnd,/ extended window style/ window class name/ window caption/ window style/ x,y position/ width and height/ parent window handle/ in this case, a button id( H);)IDC_WZD_BUTTON為使用MFC CButton類來創(chuàng)建完全相同的按鈕,可使用以下代碼, CButton中的Create()成員函數(shù)只完成上面我們所完

6、成的工作:CRect rect( 200, 200, 300, 275 );CButton button; button.Create("Button", WS_CHILD|WS_VISIBLE,rect, this,IDC_WZD_BUTTON);/ window caption/ window style/ position and dimensions/ parent window class/ button id2) 使用Windows API創(chuàng)建一個普通窗口為了直接用Windows API創(chuàng)建一個普通窗口,可以直接使用下面的代碼。這個例子中將創(chuàng)建一個重疊窗口。請參

7、照后面的注意以了解重疊窗口、彈出窗口和子窗口的不同之處。HWND hWnd = :CreateWindowEx(WS_EX_CLIENTEDGE,"AfxWnd", "Overlapped",WS_CAPTION|WS_SYS/ extended window style/ windows class name/ window caption|WS_OVERLAPPED|WS_VISIBLE|WS_DLGFRAME,/ window style/ position and dimensions/ owner window handleNULL is De

8、sktop/ for popup and overlapped windows/ handle to application instance/ pointer to window-creation data220, 220, 200, 100,NULL,h,AfxGetInstanceHandle(), NULL);3) 使用CWnd對象封裝Windows對象可以使用下面的代碼,使用Wnd類來封裝剛才創(chuàng)建的窗口:CWnd wndWrapper; wndWrapper.Attach( hWnd );256第二部分 用戶界面實例一旦封裝該窗口,當(dāng)CWnd類被析構(gòu)時, CWnd將會銷毀這個窗口。為

9、了在析構(gòu)CWnd類或其派生類(例如: Cbutton)時,CWnd附屬的窗口不被銷毀,可以在開始時用下面的代碼將進行分離:HWND hWnd = wndWrapper.Detach();:DestroyWindow( hWnd );如果希望窗口銷毀該窗口所附屬的MFC類,可使用ClassWizard加入WM_NCDESTROY消息處理函數(shù)到這個類中。然后在消息處理函數(shù)中加入如下的代碼:void CWzdWnd:OnNcDestroy()CWnd:OnNcDestroy();delete this;4. 注意 普通窗口是在Windows界面中所看到的所有窗口的基礎(chǔ)。共有三種普通類型的窗口:重疊窗

10、口、彈出窗口以及子窗口。它們是主窗口、框和消息框、控件窗口 (例如控件)的基礎(chǔ)。Windows API通常在重疊窗口或彈出窗口所謂的非客戶大量的繪制工作。另一方面,子窗口是在窗口類中定義的,它通常是在窗口過程中繪制??丶翱诙际蔷哂杏糜诶L制 各自控件的唯一窗口過程的子窗口。關(guān)于窗口的的細節(jié),請參閱第 1章。 在調(diào)用了CreateEx()和CreateWindow()函數(shù)之后, 使用一系列從Windows API到該窗口的窗口過程的消息便創(chuàng)建了一個MFC窗口。關(guān)于該發(fā)生序列,請參閱附錄 A。 添加一個WM_NCDESTROY消息處理函數(shù)來析構(gòu)一個MFC類在大多數(shù)情況下是不必要的。這是因為該類要嵌

11、入到另一個類中,而后者在應(yīng)用程序結(jié)束時將自動析構(gòu)前者,要被分配到某一函數(shù)的堆棧中,當(dāng)函數(shù)返回時,這個類也將被析構(gòu)。但是有一種情況需要這樣做,就是無模式框。只要用戶單擊 Close按鈕,無模式框窗口將會被銷毀。而該窗口附屬的類將被剩下,它沒有窗口可也無法析構(gòu),結(jié)果將導(dǎo)致內(nèi)存泄漏。 本例使用的類由Windows 操作系統(tǒng)和MFC所支持。為創(chuàng)建39和實例40。5. 使用光盤時注意執(zhí)行附帶光盤上的工程時,會發(fā)現(xiàn)視將由不同方式創(chuàng)建的四個基本窗口所填充。的窗口類,請參考實例11.2 實例39:創(chuàng)建短調(diào)用形式窗口類1. 目標(biāo)創(chuàng)建一個通用窗口類以便于創(chuàng)建窗口時所使用。2. 策略M F C 框架為創(chuàng)建和一個窗口

12、類提供了兩個函數(shù),本例將使用短版本的調(diào)用:AfxRegisterWndClass()。為了在創(chuàng)建窗口類的過程具有3. 步驟1) 用AfxRegisterWndClass()函數(shù)創(chuàng)建新窗口類為創(chuàng)建窗口類,可以使用:的,請參考實例 40???57第11章 普 通 窗l(fā)pszClass = AfxRegisterWndClass(/ window class styles CS_DBLCLKS |/ convert two mouse clicks into/a double click to this/windows processCS_HREDRAW |/ send WM_PAINT to wi

13、ndow/if horizontal size changesCS_VREDRAW/ send WM_PAINT to window/if vertical size changes/ CS_OWNDC |/ every window created from/this class gets its veryown device context/ CS_PARENTDC |/ device context created for/this window allows drawingin parent window too/ CS_NOCLOSE |/ disable the close com

14、mand/on the System:LoadCursor(NULL,IDC_CROSS),/ window class cursor/or NULL for default arrow cursor (this cursor is displayed the when mouse cursor is over a windowcreated with this class)(HBRUSH)(COLOR_BACKGROUND+1),/ background color/or NULL for no background erase (if NULL, windowwill not eraseb

15、ackground for you)AfxGetApp() -> LoadIcon(IDI_WZD_ICON)/ window icon or/NULL for default icon (icon displayed in window caption or in minimizedwindow);AfxRegisterWndClass()自動生成一個新的窗口類名。為了使用這個新的窗口類創(chuàng)建窗口, 只需使用這個已生成的名字來創(chuàng)建即可。2) 使用由AfxRegisterWndClass()創(chuàng)建的窗口類為使用新的窗口類,將AfxRegisterWndClass()創(chuàng)建的類名加入到CWnd:

16、CreateEx()函數(shù)中, 如下所示:CWnd wnd;wnd.CreateEx( 0,lpszClass," ",WS_OVERLAPPEDWINDOW|WS_VISIBLE, 100, 100, 200, 100, NULL, NULL );3) 創(chuàng)建最簡單的窗口類為使用AfxRegisterWndClass()創(chuàng)建最簡單的窗口類,可以使用如下代碼:lpszClass = AfxRegisterWndClass( 0 );258第二部分 用戶界面實例通過該窗口類創(chuàng)建的窗口將有一個箭頭光標(biāo)和一個缺省圖標(biāo),其背景不能擦除。4. 注意 窗口類名只是一個文本字符串,用于標(biāo)識已

17、在系統(tǒng)中的窗口類結(jié)構(gòu)。窗口類結(jié)構(gòu)用于維護用戶窗口類的風(fēng)格、背景色以及在窗口創(chuàng)建的信息,請參閱第1章。初始化的窗口過程。關(guān)于窗口類 AfxRegisterWndClass()自動創(chuàng)建和初始化一個窗口結(jié)構(gòu)。對于窗口過程,它使用一個 名為AfxWndProc的普通MFC窗口過程。AfxRegisterWndClass()還可以根據(jù)所傳遞的參數(shù)自動 創(chuàng)建窗口類名。然而這種方式的一個缺點是如果使用完全相同的參數(shù)分兩次調(diào)用該函數(shù)時,將只能創(chuàng)建一個窗口類。一般情況下這將無傷大雅,除非使用不連續(xù)的 CS_CLASSDC。但即使在這種情況下,也只是在兩個由該窗口類創(chuàng)建的窗口試圖同關(guān)于這方面問題的詳細信息,請參閱

18、第 1章。繪制時才會出現(xiàn)問題。 如果希望在創(chuàng)建窗口類具有實例40。5. 使用光盤時注意的,包括給自行確定窗口類名等等,請參考執(zhí)行光盤上的工程時,在 WzdView中的OnTestWzd1() 函數(shù)中設(shè)置一個斷點。單擊Test和Wzd1菜單命令,在應(yīng)用程序中創(chuàng)建兩個窗口類及用這兩個窗口類創(chuàng)建兩個窗口時,跟蹤該過程。11.3 實例40:創(chuàng)建長調(diào)用形式窗口類1. 目標(biāo)創(chuàng)建一個特定的窗口類并將能夠自行確定窗口類名。2. 策略MFC框架中提供了兩個函數(shù)以創(chuàng)建和一個窗口類。在本例中將使用長形式的調(diào)用:AfxRegisterClass()。它在窗口類創(chuàng)建過程中用戶具有的權(quán)。為創(chuàng)建一個快速、通用的窗口類,請參

19、考實例39。3. 步驟1) 用AfxRegisterClass()創(chuàng)建一個窗口類為創(chuàng)建一個窗口類,必須首先如下所示初始化 WNDCLASS結(jié)構(gòu):WNDCLASS wndclass =/ window class stylesCS_DBLCLKS |/ convert two mouse clicks into a double/click to this windows processCS_HREDRAW |/ send WM_PAINT to window if horizontal/size changesCS_VREDRAW/ send WM_PAINT to window if ver

20、tical/size changes/ CS_GLOBALCLASS |/ CS_OWNDC |/ class is available to all process threads/ every window created from this class/gets its very own device context/ CS_PARENTDC |/ device context created for this window/allows drawing in parent window too第11章 普 通 窗 口259/ CS_NOCLOSE |/ disable the clos

21、e command on the/SystemAfxWndProc,/ window process for every window created/from this class0,0,/ extra window and class bytes unused/in MFCAfxGetInstanceHandle(),/ handle of this applications instanceAfxGetApp() -> LoadIcon( IDI_WZD_ICON ),:LoadCursor( NULL,IDC_CROSS ),/ window icon or NULL/ wind

22、ow class cursor or/NULL for defaultarrow cursor( HBRUSH )( COLOR_BACKGROUND + 1 ),/ background color or NULL/for no background eraseto be used when creating windowsusing this classMAKEINTRESOURCE( IDR_WZD_),"MyClassName"/ a class name you are/assigning this/windows class;然后可以在系統(tǒng)中窗口類,使用以下代碼

23、:AfxRegisterClass( &wndclass );2) 使用由AfxRegisterClass()創(chuàng)建的窗口類為使用這個新的窗口類,將其名字加入到 CWnd:CreateEx()函數(shù)中,如下所示:CWnd wnd;wnd.CreateEx( 0, "MyClassName",<<< new class name" ",WS_OVERLAPPEDWINDOW|WS_VISIBLE, 100, 100, 200, 100, NULL, NULL );4. 注意 所有由MFC創(chuàng)建的窗口都使用AfxWndProc窗口過程。這到 MFC窗口的消息以同樣的方式進行處理。該窗口過程確定了窗口的外觀和使用感覺。一個 BUTTON窗口類則給該過程的 WM_PAINT消息具有一個特殊的窗口過程,該過程將

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論