窗口和對話框_第1頁
窗口和對話框_第2頁
窗口和對話框_第3頁
窗口和對話框_第4頁
窗口和對話框_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于GUI的桌面應用程序的VC++實現(xiàn)

移動應用開發(fā)教研室

第二部分窗口和對話框4.1框架窗口4.2消息和消息映射4.3創(chuàng)建和使用對話框4.4通用對話框和消息對話框4.1框架窗口4.1.1主窗口和文檔窗口文檔窗口對于單文檔應用程序來說,它和主框架窗口是一致的,即主框架窗口就是文檔窗口;而對于多文檔應用程序,文檔窗口是主框架窗口的子窗口,如圖4.1所示。4.1.2窗口樣式的設置1.窗口樣式窗口樣式通常有一般(以WS_為前綴)和擴展(以WS_EX_為前綴)兩種形式。這兩種形式的窗口樣式可在函數(shù)CWnd::Create或CWnd::CreateEx參數(shù)中指定,其中CreateEx函數(shù)可同時支持以上兩種樣式,而CWnd::Create只能指定窗口的一般樣式。需要說明的是,對于控件和對話框這樣的窗口來說,它們的窗口樣式可直接通過其屬性對話框來設置。常見的一般窗口樣式如表4.1所示。4.1.2窗口樣式的設置2.用MFCAppWizard設置MFCAppWizard有一個

按鈕(在創(chuàng)建單文檔或多文檔應用程序過程的第四步中),允許用戶指定有關SDI和MDI框架窗口的屬性,圖4.2表示了“高級選項”(AdvancedOptions)對話框的“窗口樣式”(WindowStyles)頁面,其中的選項含義見表4.2。

4.1.2窗口樣式的設置選

項含

義使用可拆分窗口(Usesplitwindow)選中時,將程序的文檔窗口創(chuàng)建成“切分”(或稱拆分)窗口厚邊框(Thickframe)選中時,設置窗口樣式WS_THICKFRAME最小化邊框(Minimizebox)選中時,設置窗口樣式WS_MINIMIZEBOX,標題右側含有最小化按鈕

最大化邊框(Maximizebox)選中時,設置窗口樣式WS_MAXIMIZEBOX,標題右側含有最大化按鈕

系統(tǒng)菜單(Systemmenu)選中時,設置窗口樣式WS_SYSMENU,標題左側有系統(tǒng)菜單

最小化(Minimized)選中時,設置窗口樣式WS_MINIMIZE最大化(Maximized)選中時,設置窗口樣式WS_MAXIMIZE表4.2“高級選項”對話框窗口樣式的各項含義4.1.2窗口樣式的設置3.修改CREATESTRUCT結構例如,在單文檔應用程序中,框架窗口默認的樣式是WS_OVERLAPPEDWINDOW和FWS_ADDTOTITLE的組合,更改其樣式可用如下的代碼:BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ //新窗口不含“最大化”按鈕 cs.style&=~WS_MAXIMIZEBOX; //將窗口的大小設為1/3屏幕并居中 cs.cy=::GetSystemMetrics(SM_CYSCREEN)/3; cs.cx=::GetSystemMetrics(SM_CXSCREEN)/3; cs.y=((cs.cy*3)-cs.cy)/2; cs.x=((cs.cx*3)-cs.cx)/2; returnCFrameWnd::PreCreateWindow(cs);}4.1.2窗口樣式的設置代碼中,前面有“::”作用域符號的函數(shù)是指全局函數(shù),一般都是一些API函數(shù)?!癱s.style&=~WS_MAXIMIZEBOX;”中的“~”是按位取“反”運算符,它將WS_MAXIMIZEBOX的值按位取反后,再和cs.style值按位“與”,其結果是將cs.style值中的WS_MAXIMIZEBOX標志位清零。再如,對于多文檔應用程序,文檔窗口的樣式可用下列代碼更改:BOOLCChildFrame::PreCreateWindow(CREATESTRUCT&cs){ cs.style&=~WS_MAXIMIZEBOX; //創(chuàng)建不含“最大化”按鈕的子窗口 returnCMDIChildWnd::PreCreateWindow(cs);}4.1.2窗口樣式的設置4.使用ModifyStyle和ModifyStyleExCWnd類中的成員函數(shù)ModifyStyle和ModifyStyleEx也可用來更改窗口的樣式,其中ModifyStyleEx還可更改窗口的擴展樣式。這兩個函數(shù)具有相同的參數(shù),其含義如下。BOOLModifyXXXX(DWORDdwRemove,DWORDdwAdd,UINTnFlags=0);由于框架窗口在創(chuàng)建時不能直接設定其擴展樣式,因此只能通過調用ModifyStyle函數(shù)來進行。例如用MFCClassWizard為一個多文檔應用程序Ex_MDI的子文檔窗口類CChildFrame添加OnCreateClient消息處理,并增加下列代碼:BOOLCChildFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){ ModifyStyle(0,WS_VSCROLL,0); returnCMDIChildWnd::OnCreateClient(lpcs,pContext);}4.1.2窗口樣式的設置當窗口創(chuàng)建客戶區(qū)時就會調用虛函數(shù)OnCreateClient。運行結果如圖4.3所示。添加的滾動條4.1.3窗口狀態(tài)的改變1.用ShowWindow改變窗口的顯示狀態(tài)當應用程序運行時,Windows會自動調用應用程序框架內部的WinMain函數(shù),并自動查找該應用程序類的全局變量theApp,然后自動調用用戶應用程序類的虛函數(shù)InitInstance,該函數(shù)會進一步調用相應的函數(shù)來完成主窗口的構造和顯示工作,如下面的代碼(以單文檔應用程序項目Ex_SDI為例):BOOLCEx_SDIApp::InitInstance(){ //…… m_pMainWnd->ShowWindow(SW_SHOW); //顯示窗口 m_pMainWnd->UpdateWindow(); //更新窗口 returnTRUE;}4.1.3窗口狀態(tài)的改變代碼中,m_pMainWnd是主框架窗口指針變量,ShowWindow是CWnd類的成員函數(shù),用來按指定的參數(shù)顯示窗口,該參數(shù)的值如表4.3所示。參

數(shù)

值含

義SW_HIDE隱藏此窗口并將激活狀態(tài)移交給其他窗口SW_MINIMIZE將窗口最小化并激活系統(tǒng)中的頂層窗口SW_RESTORE激活并顯示窗口。若窗口是最小或最大狀態(tài),則恢復到原來的大小和位置SW_SHOW用當前的大小和位置激活并顯示窗口SW_SHOWMAXIMIZED激活窗口并使之最大化SW_SHOWMINIMIZED激活窗口并使之最小化SW_SHOWMINNOACTIVE窗口顯示成為一個圖標并保留其激活狀態(tài)(即原來是激活的,仍然是激活狀態(tài))SW_SHOWNA用當前狀態(tài)顯示窗口SW_SHOWNOACTIVATE用最近的大小和位置狀態(tài)顯示窗口并保留其激活狀態(tài)SW_SHOWNORMAL激活并顯示窗口4.1.3窗口狀態(tài)的改變通過指定ShowWindow函數(shù)的參數(shù)值可以改變窗口顯示狀態(tài)。例如,下面的代碼是將窗口的初始狀態(tài)設置為“最小化”:BOOLCEx_SDIApp::InitInstance(){ //…… m_pMainWnd->ShowWindow(SW_SHOWMINIMIZED); m_pMainWnd->UpdateWindow(); eturnTRUE;}4.1.3窗口狀態(tài)的改變2.etWindowPos或MoveWindow改變窗口的大小和位置CWnd中的SetWindowPos是一個非常有用的函數(shù),它不僅可以改變窗口的大小、位置,而且還可以改變所有窗口在堆棧排列的次序(Z次序),這個次序是根據(jù)它們在屏幕出現(xiàn)的先后來確定的。BOOLSetWindowPos(constCWnd*pWndInsertAfter,intx,inty,intcx,intcy,UINTnFlags);其中,參數(shù)pWndInsertAfter用來指定窗口對象指針,它可以是下列預定義窗口對象的地址:wndBottom 將窗口放置在Z次序中的底層wndTop 將窗口放置在Z次序中的頂層wndTopMost 設置最上層窗口wndNoTopMost 將窗口放置在所有最上層的后面,若此窗口不是最上層窗口,則此標志無效4.1.3窗口狀態(tài)的改變x和y表示窗口新的左上角坐標,cx和cy分別表示窗口新的寬度和高度,nFlags表示窗口新的大小和位置方式,如表4.4所示。

nFlags值含

義SWP_HIDEWINDOW

隱藏窗口SWP_NOACTIVATE

不激活窗口。如該標志沒有被指定,則依賴pWndInsertAfter參數(shù)SWP_NOMOVE

不改變當前的窗口位置(忽略x和y參數(shù))SWP_NOOWNERZORDER

不改變父窗口的Z次序SWP_NOREDRAW

不重新繪制窗口SWP_NOSIZE

不改變當前的窗口大?。ê雎詂x和cy參數(shù))SWP_NOZORDER

不改變當前的窗口Z次序(忽略pWndInsertAfter參數(shù))SWP_SHOWWINDOW

顯示窗口4.1.3窗口狀態(tài)的改變函數(shù)CWnd::MoveWindow也可用來改變窗口的大小和位置,與SetWindowPos函數(shù)不同的是,用戶必須在MoveWindow函數(shù)中指定窗口的大小。voidMoveWindow(intx,inty,intnWidth,intnHeight,BOOLbRepaint=TRUE);voidMoveWindow(LPCRECTlpRect,BOOLbRepaint=TRUE);作為示例,這里將使用上述兩個函數(shù)把主窗口移動到屏幕的(100,100)處(代碼添在CEx_SDIApp::InitInstance中returnTRUE語句之前)。//使用SetWindowPos函數(shù)的示例m_pMainWnd->SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOZORDER);//使用MoveWindow函數(shù)的示例CRectrcWindow;m_pMainWnd->GetWindowRect(rcWindow);m_pMainWnd->MoveWindow(100,100,rcWindow.Width(),rcWindow.Height(),TRUE);4.2消息和消息映射4.2.1消息分類Windows應用程序中的消息主要有下面3種類型。(1)窗口消息(Windowsmessage)。這類消息主要是指由WM_開頭的除WM_COMMAND之外的消息,例如WM_CREATE(窗口對象創(chuàng)建時產生)、WM_DESTROY(窗口對象清除前發(fā)生)、WM_PAINT(窗口更新時產生繪制消息)等,一般由窗口類和視圖類對象來處理。(2)控件的通知消息(Controlnotifications)。當控件的狀態(tài)發(fā)生改變(例如,用戶在控件中進行輸入)時,控件就會向其父窗口發(fā)送WM_COMMAND通知消息。(3)命令消息(Commandmessage)。命令消息主要包括由用戶交互對象(菜單、工具條的按鈕、快捷鍵等)發(fā)送的WM_COMMAND通知消息。4.2.2消息映射將MFCClassWizard對話框切換到MessageMaps(消息映射)頁面(參看后面的圖4.4),可以看到它有許多選項,如項目(Project)組合框、類名(Classname)組合框等。各項功能說明如表4.5所示。項

目說

明Project框選擇應用程序項目名,一般只有一個Classname框在相應的項目中選擇指定的類,它的名稱與項目工作區(qū)中ClassView中是一樣的ObjectIDs列表資源標識符列表中列出了在Classname框指定的類中可以使用的ID號,用戶從中可以選擇要映射的資源號Messages列表該列表中列出了相應的資源對象的消息,若用戶從中選定某個消息,則按鈕“AddFunction”被激活Memberfunctions列表列出Classname中指定的類的成員函數(shù),若用戶從中選定某個成員函數(shù),則按鈕“DeleteFunction”被激活AddClass按鈕向項目中添加類AddFunction按鈕向指定的類中添加成員函數(shù)DeleteFunction按鈕刪除指定類中的成員函數(shù)EditCode按鈕轉向文檔窗口,并定位到相應的函數(shù)源代碼處4.2.2消息映射(1)按快捷鍵【Ctrl+W】,打開MFCClassWizard對話框。(2)在Classname組合框中,將類名選定為CEx_SDIView。此時,ObjectIDs和Messages列表內容會相應地改變。(3)在ObjectIDs列表框中選定CEx_SDIView,然后拖動Messages列表框右側的滾動塊,直到出現(xiàn)要映射的WM_LBUTTONDOWN消息為止。(4)雙擊Messages列表中的WM_LBUTTONDOWN消息或單擊

按鈕,都會在CEx_SDIView類中添加該消息的映射函數(shù)OnLButtonDown,同時在Memberfunctions列表中顯示這一消息映射函數(shù)和被映射的消息,結果如圖4.4所示。4.2.2消息映射(5)單擊

按鈕后,MFCClassWizard對話框退出,并轉向文檔窗口,定位到消息處理函數(shù)OnLButtonDown實現(xiàn)處,添加下列代碼:voidCEx_SDIView::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault MessageBox("你好,我的VisualC++世界!","問候",0); CView::OnLButtonDown(nFlags,point);}(6)這樣就完成了一個消息映射過程。程序運行后,在窗口客戶區(qū)單擊鼠標左鍵,就會彈出一個消息對話框。4.2.3消息映射代碼框架查看CEx_SDIView程序代碼,可以發(fā)現(xiàn)MFCClassWizard為WM_LBUTTONDOWN的消息映射作了以下三個方面的內容安排。(1)在頭文件Ex_SDIView.h中聲明消息處理函數(shù)OnLButtonDown:protected: //{{AFX_MSG(CEx_SDIView) afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint); //}}AFX_MSG DECLARE_MESSAGE_MAP()4.2.3消息映射代碼框架(2)在Ex_SDIView.cpp源文件前面的消息映射入口處,添加了相應的消息映射宏ON_WM_LBUTTONDOWN:BEGIN_MESSAGE_MAP(CEx_SDIView,CView) //消息映射開始 //{{AFX_MSG_MAP(CEx_SDIView) ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP //…END_MESSAGE_MAP() //消息映射結束(3)在Ex_SDIView.cpp文件中寫入一個空的消息處理函數(shù)的模板,以便用戶填入具體代碼,如下面的框架:voidCEx_SDIView::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault CView::OnLButtonDown(nFlags,point);}4.2.4鍵盤和鼠標消息MFCClassWizard能自動添加當前類的WM_KEYDOWN和WM_KEYUP擊鍵消息處理函數(shù)的調用,它們具有下列函數(shù)原型:afx_msgvoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags);afx_msgvoidOnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags);afx_msg是MFC用于定義消息函數(shù)的標志,參數(shù)nChar表示“虛擬鍵代碼”,nRepCnt表示當用戶按住一個鍵時的重復計數(shù),nFlags表示擊鍵消息標志。所謂虛擬鍵代碼,是指與設備無關的鍵盤編碼。在VisualC++中,最常用的虛擬鍵代碼已被定義在Winuser.h中,例如:VK_SHIFT表示【Shift】鍵,VK_F1表示功能鍵【F1】等。與擊鍵消息一樣,MFC中的ClassWizard也提供相應的字符消息處理框架,并自動添加了當前類的WM_CHAR消息處理函數(shù)調用,它具有下列函數(shù)原型:afx_msgvoidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags);4.2.4鍵盤和鼠標消息這里的客戶區(qū)是指窗口中用于輸出文檔的區(qū)域。由于MFC頭文件中定義的與鼠標按鈕相關的標識符使用了LBUTTON(左)、MBUTTON(中)和RBUTTON(右),因而當在窗口的客戶區(qū)中按下或釋放一個鼠標鍵時,還會產生如表4.6所示的消息。鼠

鍵按

下釋

放雙

擊左WM_LBUTTONDOWNWM_LBUTTONUPWM_LBUTTONDBLCLK中WM_MBUTTONDOWNWM_MBUTTONUPWM_MBUTTONDBLCLK右WM_RBUTTONDOWNWM_RBUTTONUPWM_RBUTTONDBLCLK4.2.4鍵盤和鼠標消息對于所有這些鼠標消息來說,MFCClassWizard都會將其映射成類似afx_msgvoidOnXXXX的消息處理函數(shù),如前面WM_LBUTTONDOWN的消息函數(shù)OnLButtonDown,它們具有下列函數(shù)原型:afx_msgvoidOnXXXX(UINTnFlags,CPointpoint);其中,point表示鼠標光標在屏幕的(x,y)坐標;nFlags表示鼠標按鈕和鍵盤組合情況,它可以是下列值的組合(MK前綴表示“鼠標鍵”):MK_CONTROL ——鍵盤上的Ctrl鍵被按下MK_LBUTTON ——鼠標左鍵被按下MK_MBUTTON ——鼠標中鍵被按下MK_RBUTTON ——鼠標右鍵被按下MK_SHIFT ——鍵盤上的【Shift】鍵被按下4.2.5其他窗口消息(1)WM_CREATE消息。該消息是在窗口對象創(chuàng)建后,Windows向視圖發(fā)送的第一個消息;如果用戶有什么工作需要在初始化時處理,就可在該消息處理函數(shù)中加入所需代碼。(2)WM_CLOSE或WM_DESTROY消息。當用戶從系統(tǒng)菜單中關閉窗口或者父窗口被關閉時,Windows都會發(fā)送WM_CLOSE消息;而WM_DESTROY消息是在窗口從屏幕消失后發(fā)送的,因此它緊隨WM_CLOSE之后。(3)WM_PAINT消息。當窗口的大小發(fā)生變化、窗口內容發(fā)生變化、窗口間的層疊關系發(fā)生變化或者調用函數(shù)UpdateWindow或RedrawWindow時,系統(tǒng)都將產生WM_PAINT消息,表示要重新繪制窗口的內容。該消息處理函數(shù)的原型是;afx_msgvoidOnPaint();4.3創(chuàng)建和使用對話框4.3.1創(chuàng)建對話框應用程序4.3.1創(chuàng)建對話框應用程序

圖4.5“步驟(2)”對話框

圖4.6“步驟(3)”對話框4.3.1創(chuàng)建對話框應用程序

4.3.2資源和資源標識符1.資源的分類先用MFCAppWizard(exe)來創(chuàng)建一個默認的單文檔應用程序Ex_SDI,然后將項目工作區(qū)切換到“ResourceView”頁面,展開所有節(jié)點,如圖4.9所示。資源類別資源標識符4.3.2資源和資源標識符VisualC++6.0使用的資源可分為下列幾類:(1)快捷鍵列表(Accelerator):一系列組合鍵的集合,被應用程序用來引發(fā)一個動作。(2)對話框(Dialog):含有按鈕、列表框、編輯框等各種控件的窗口。(3)圖標(Icon):代表應用程序顯示在Windows桌面上的位圖,它同時有32×32像素和16×16像素兩種規(guī)格。(4)菜單(Menu):用戶通過菜單可以完成應用程序的大部分操作。(5)字串表(StringTable):應用程序使用的全局字符串或其他標識符。(6)工具欄按鈕(Toolbar):工具欄外觀是以一系列具有相同尺寸的位圖組成的,它通常與一些菜單命令項相對應,用于提高用戶的工作效率。(7)版本信息(Version):包含應用程序的版本、用戶注冊碼等相關信息。4.3.2資源和資源標識符2.資源標識符(ID)(1)在標識符名稱中允許使用字母a~z、A~Z、0~9及下畫線。(2)標識符名稱不區(qū)分大小寫字母,如new_idd與New_Idd是相同的標識符。(3)不能以數(shù)字開頭,如8BIT是不合法的標識符名。(4)字符個數(shù)不得超過247個。4.3.3添加對話框資源選擇“插入”→“資源”菜單命令,或按快捷鍵【Ctrl+R】打開“插入資源”對話框,在對話框中可以看到資源列表中存在Dialog項,若單擊Dialog項左邊的“+”號,將展開對話框資源的不同類型選項,如圖4.10所示。4.3.3添加對話框資源表4.7列出了各種類型的對話框資源的不同用途。類

型說

明IDD_DIALOGBAR對話條,往往和工具條停放在一起IDD_FORMVIEW一個表單(一種樣式的對話框),用于表單視圖類的資源模板IDD_OLE_PROPPAGE_LARGE一個大的OLE屬性頁IDD_OLE_PROPPAGE_SMALL一個小的OLE屬性頁IDD_PROPPAGE_LARGE一個大屬性頁,用于屬性對話框IDD_PROPPAGE_MEDIUM一個中等大小的屬性頁,用于屬性對話框IDD_PROPPAGE_SMALL一個小的屬性頁,用于屬性對話框4.3.3添加對話框資源對展開的不同類型的對話框資源不作任何選擇,選中“Dialog”,單擊

按鈕,系統(tǒng)就會自動為當前的應用程序添加一個對話框資源,并出現(xiàn)如圖4.11所示的開發(fā)環(huán)境界面(這個界面和前面創(chuàng)建一個對話框應用程序后出現(xiàn)的界面是一樣的)。對話框模板控件工具欄布局工具欄默認標識符對話框編輯器4.3.4設置對話框屬性在對話框模板的空白處右擊鼠標,從彈出的快捷菜單中選擇“屬性”菜單項,彈出如圖4.12所示的對話框屬性窗口。4.3.4設置對話框屬性對話框具有這幾類屬性:常規(guī)(General)、樣式(Styles)、更多樣式(MoreStyles)、擴展樣式(ExtendedStyles)、更多擴展樣式(MoreExtendedStyles)等,這里僅介紹最常用的常規(guī)(General)屬性,如表4.8所示。項

目說

明ID框修改或選擇對話框的標識符名稱標題框輸入對話框的標題名稱,中英文均可,如“我的對話框”字體按鈕單擊此按鈕可選擇字體的種類(如宋體)及尺寸(如9號)位置X/位置Y對話框左上角在父窗口中的X、Y坐標,都為0時表示居中菜單框默認值為無,當對話框需要菜單時輸入或選擇指定的菜單資源類名稱框默認值為無,它提供C/C++語言編程時所需要的對話框類名,對MFC類庫的資源文件來說,該項不被激活4.3.5添加和布局控件1.控件的添加對話框編輯器一旦打開,“控件”工具欄一般都會隨之出現(xiàn)。若不出現(xiàn),則可在開發(fā)環(huán)境的工具欄區(qū)的空白處右擊鼠標,從彈出的快捷菜單中選擇“控件”。利用“控件”工具欄中的各個按鈕可以順利完成控件的添加。圖4.13說明了各個按鈕所對應的控件類型。靜態(tài)圖片編輯框按鈕單選框列表框垂直滾動條進展條熱鍵樹形視圖動畫日期選擇IP地址擴展組合框控件的選擇靜態(tài)文本組框復選框組合框水平滾動條旋轉按鈕滑動條列表視圖標簽復合編輯月歷用戶定制控件4.3.5添加和布局控件2.控件的選取控件的刪除、復制和布局操作一般都要先選取控件,若選取單個控件,則可用下列方法:(1)用鼠標直接選取。(2)用助記符來選取。(3)用【Tab】鍵選取。對于多個控件的選取,可采用下列方法:(1)先在對話框內按住鼠標左鍵不放,拖出一個大的虛框,然后釋放鼠標,則被該虛框所包圍的控件都將被選取。(2)先按住【Shift】鍵不放,然后用鼠標選取控件,直到所需要的多個控件選取之后再釋放【Shift】鍵。若在選取時,對已選取的控件再選取一下,則取消該控件選取。4.3.5添加和布局控件3.控件的刪除、復制和布局對于控件的布局,對話框編輯器中提供了控件布局工具欄,如圖4.15所示,它可以自動地排列對話框內的控件,并改變控件的大小。4.3.5添加和布局控件4.測試對話框“布局”菜單下的“測試”命令或布局工具欄上的測試按鈕

用來模擬所編輯的對話框的運行情況,幫助用戶檢驗對話框是否符合用戶的設計要求,以及控件功能是否有效等。5.操作示例4.3.5添加和布局控件

4.3.6創(chuàng)建對話框類(1)在對話框資源模板的空白區(qū)域(沒有其他元素或控件)內雙擊鼠標左鍵,將彈出如圖4.18所示的對話框,詢問是否為對話框資源創(chuàng)建一個新類。4.3.6創(chuàng)建對話框類(2)單擊“OK”

按鈕,彈出如圖4.19所示的NewClass(新類)對話框。(3)在Name框中輸入類名COneDlg,單擊“OK”按鈕,一個基于對話框資源模板IDD_DIALOG1的用戶對話框類COneDlg就創(chuàng)建好了。4.3.7映射WM_INITDIALOG消息在前面創(chuàng)建的Ex_Dlg應用程序項目中,VisualC++自動為其添加了WM_INITDIALOG消息的映射函數(shù)OnInitDialog,并自動添加了一系列的初始化代碼:BOOLCEx_DlgDlg::OnInitDialog(){ CDialog::OnInitDialog(); //…… returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}4.3.7映射WM_INITDIALOG消息下面以單文檔應用程序Ex_SDI添加的COneDlg對話框為例說明消息WM_INITDIALOG的映射過程:(1)按【Ctrl+W】快捷鍵,彈出MFCClassWizard對話框,將其切換到“MessageMaps”標簽頁面。(2)在Classname組合框中,將類名選定為COneDlg(圖4.20中的標記1);在ObjectIDs列表框中選定COneDlg(圖4.20中的標記2),然后拖動Messages列表框右側的滾動塊,直到出現(xiàn)要映射的WM_INITDIALOG消息為止(圖4.20中的標記3),結果如圖4.20所示。4.3.7映射WM_INITDIALOG消息4.3.8在程序中調用對話框(1)將項目工作區(qū)窗口切換到“ResourceView”頁面,展開所有節(jié)點,雙擊資源“Menu”項中的IDR_MAINFRAME,將打開菜單編輯器,相應的Ex_SDI項目的菜單資源被顯示出來,在菜單的最后一項,留出了一個空位置,用來輸入新的菜單項,如圖4.22所示。菜單的空位置4.3.8在程序中調用對話框(2)在菜單的空位置上雙擊鼠標左鍵,則出現(xiàn)它的屬性對話框,在標題框中輸入“對話框(&D)”,結果如圖4.23所示。子菜單的空位置4.3.8在程序中調用對話框(3)單擊菜單屬性對話框中的“保持可見”(KeepVisible)圖標按鈕

,使此屬性對話框一直可見,以方便操作。單擊“對話框”菜單項下方的空位置,在屬性對話框中,輸入標題“第一個對話框(&F)”,在ID框輸入該菜單項的資源標識符ID_DLG_FIRST,結果如圖4.24所示,單擊屬性對話框右上角的“關閉”按鈕。4.3.8在程序中調用對話框表4.9列出了菜單屬性對話框“常規(guī)(General)”的各項含義。項

目含

義ID菜單的資源ID標題(Caption)用來標識菜單項顯示文本。助記符字母的前面須有一個&符號,這個字母與【Alt】鍵構成組合鍵分隔符(Separator)選中時,菜單項是一個分隔符或是一條水平線已復選(Checked)選中時,菜單項文本前顯示一個選中標記彈出(Pop_up)選中時,菜單項含有一個彈出式子菜單已變灰(Grayed)選中時,菜單項顯示是灰色的,用戶不能選用非活動(Inactive)選中時,菜單項沒有被激活,用戶不能選用幫助(Help)選中時,菜單項在程序運行時被放在頂層菜單的最右端中斷(Break)當為Column時,對于頂層菜單上的菜單項來說,被放置在另外一行上,而對于彈出式子菜單的菜單項來說,則被放置在另外一列上;當為Bar時,與Column相同,只不過對于彈出式子菜單來說,它還在新列與原來的列之間增加一條豎直線;注意這些效果只能在程序運行后才能看到提示(Prompt)用來指明光標移至該菜單項時在狀態(tài)欄上顯示的提示信息4.3.8在程序中調用對話框(4)用鼠標將新添加的菜單項拖放到“查看”和“幫助”菜單項之間,如圖4.25所示。(5)按【Ctrl+W】快捷鍵,彈出MFCClassWizard對話框,該對話框將自動切換到MessageMaps頁面。4.3.8在程序中調用對話框(6)出現(xiàn)“AddMemberFunction”對話框,在其中可以輸入函數(shù)名稱,系統(tǒng)默認的函數(shù)名稱為OnDlgFirst,如圖4.26所示。4.3.8在程序中調用對話框(7)在MFCClassWizard的“Memberfunctions”列表中,選擇消息函數(shù)OnDlgFirst,如圖4.27所示,雙擊或單擊

按鈕,MFCClassWizard對話框退出,并轉向文檔窗口,定位到CEx_SDIView::OnDlgFirst函數(shù)實現(xiàn)的源代碼處,添加下列代碼:voidCEx_SDIView::OnDlgFirst(){ //…… COneDlgdlg; dlg.DoModal();}4.3.8在程序中調用對話框(8)在CEx_SDIView類的實現(xiàn)文件Ex_SDIView.cpp的前面,即將剛才添加代碼的文檔窗口滾動到最前面,添加COneDlg類的頭文件包含,即:#include"stdafx.h"http://……#include"Ex_SDIView.h"#include"OneDlg.h"(9)編譯并運行。在應用程序菜單上,選擇“對話框”→“第一個對話框”菜單項,彈出如圖4.28所示的對話框,這就是前面添加的對話框。4.3.9使用無模式對話框1.模式對話框所謂“模式對話框”是指當對話框被彈出,用戶必須在對話框中作出相應的操作,在退出對話框之前,對話框所在應用程序的其他操作不能繼續(xù)執(zhí)行。2.無模式對話框所謂“無模式對話框”是指當對話框被彈出后,一直保留在屏幕上,用戶可繼續(xù)在對話框所在的應用程序中進行其他操作;當需要使用對話框時,只需像激活一般窗口一樣單擊對話框所在的區(qū)域即可激活。4.3.9使用無模式對話框【例Ex_Modeless】創(chuàng)建并使用無模式對話框(1)用MFCAppWizard(exe)創(chuàng)建一個默認的單文檔應用程序Ex_Modeless。(2)為IDD_DIALOG1對話框資源創(chuàng)建一個對話框類CLessDlg。保留打開的MFCClassWizard對話框,在IDs列表中選擇IDOK,它是對話框中“確定”按鈕的標識符,然后在Messages框中選擇BN_CLICKED(單擊按鈕)消息,單擊

按鈕或雙擊BN_CLICKED消息,出現(xiàn)“AddMemberFunction”對話框以輸入成員函數(shù)的名稱,保留系統(tǒng)默認的函數(shù)名為OnOK,如圖4.29所示。4.3.9使用無模式對話框(3)雙擊消息函數(shù)OnOK或單擊

按鈕,MFCClassWizard對話框退出,并轉向文檔窗口,定位到CLessDlg::OnOK函數(shù)實現(xiàn)的源代碼處,添加下列代碼:voidCLessDlg::OnOK(){ //添加其他代碼,使用戶輸入對話框的數(shù)據(jù)有效 DestroyWindow(); //終止對話框顯示 deletethis; //刪除對話框,釋放內存空間 //CDialog::OnOK(); //去除默認的處理}4.3.9使用無模式對話框(4)類似的,打開MFCClassWizard對話框,在CLessDlg類添加“取消”按鈕(標識符為IDCANCEL)的BN_CLICKED消息映射函數(shù)OnCancel,并添加下列代碼:voidCLessDlg::OnCancel(){ //添加其他釋放代碼 DestroyWindow(); //終止對話框顯示 deletethis; //刪除對話框,釋放內存空間 //CDialog::OnCancel(); //去除默認的處理}(5)將項目工作區(qū)切換到ResourceView頁面,打開IDR_MAINFRAME菜單資源。在菜單“查看”與“幫助”之間添加一個“對話框(&D)”頂層菜單項,并在其下添加一個子菜單項,標題為“無模式對話框(&M)”,該菜單項的資源標識設為ID_DLG_MODELESS。4.3.9使用無模式對話框(6)打開MFCClassWizard對話框,在CEx_ModelessView類添加ID_DLG_MODELESS的COMMAND消息映射,保留默認的映射函數(shù)名OnDlgModeless,并添加下列代碼:voidCEx_ModelessView::OnDlgModeless(){ CLessDlg*pDlg=newCLessDlg; //使用new來為對話框分配內存空間 pDlg->Create(IDD_DIALOG1); //創(chuàng)建對話框 pDlg->ShowWindow(SW_NORMAL); //顯示對話框}(7)在CEx_ModelessView類的實現(xiàn)文件Ex_ModelessView.cpp的前面,即將剛才添加代碼的文檔窗口滾動到最前面,添加CLessDlg類的頭文件包含,即:#include"Ex_ModelessDoc.h"#include"Ex_ModelessView.h"#include"CLessDlg.h"4.3.9使用無模式對話框(8)編譯并運行。在應用程序菜單上,多次選擇“對話框”→“第一個對話框”菜單項,將會在同一個位置中出現(xiàn)多個對話框,拖動這些對話框到適當位置,如圖4.30所示。4.4通用對話框和消息對話框4.4.1通用對話框MFC對這些通用對話框所構造的類都是從一個公共的基類CCommonDialog派生而來的。表4.10列出了這些通用對話框類。對

框用

途CColorDialog“顏色”對話框,允許用戶選擇或創(chuàng)建顏色CFileDialog“文件”對話框,允許用戶打開或保存一個文件CFindReplaceDialog“查找和替換”對話框,允許用戶查找或替換指定字符串CPageSetupDialog“頁面設置”對話框,允許用戶設置頁面參數(shù)CFontDialog“字體”對話框,允許用戶從列出的可用字體中選擇一種字體CPrintDialog“打印”對話框,允許用戶設

溫馨提示

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

評論

0/150

提交評論