版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
框架窗口界面設計演示文稿現(xiàn)在是1頁\一共有57頁\編輯于星期六框架窗口界面設計現(xiàn)在是2頁\一共有57頁\編輯于星期六1框架窗口
1.1單文檔和多文檔程序框架窗口
文檔應用程序的MFC類結(jié)構(gòu)
如圖是單文檔應用程序Ex_SDI和多文檔應用程序Ex_MDI的MFC類結(jié)構(gòu)。
CAboutDlg是每一個應用程序框架都有的,用來顯示本程序的有關信息。 CEx_SDIApp和CEx_MDIApp是應用程序類,是從CWinApp類派生而來,負責應用程序創(chuàng)建、運行和終止,每一個應用程序都需要這樣的類。 CEx_SDIDoc和CEx_MDIDoc是文檔類,它們是從CDocument類派生而來,負責應用程序文檔數(shù)據(jù)管理。
CEx_SDIView和CEx_MDIView是視圖類,它們既可以從基類CView派生,也可以從CView派生類派生,負責數(shù)據(jù)的顯示、繪制和其他用戶交互。 CMainFrame類是用來負責主框架窗口的顯示和管理,包括工具欄和狀態(tài)欄等界面元素的初始化。對于單文檔應用程序來說,主框架窗口類是從CFrameWnd派生而來的,而對于多文檔應用程序程序,主框架窗口是從CMDIFrameWnd派生的。
現(xiàn)在是3頁\一共有57頁\編輯于星期六1框架窗口 CChildFrame類是從CMDIChildWnd派生而來,專門用來管理多文檔應用程序中的文檔窗口。無論是CMDIChildWnd還是CMDIFrameWnd類,它們都是從CFrameWnd派生而來的。 對于基于對話框的應用程序,一般有CAboutDlg類、應用程序類和對話框類。 上述MFC類之間的繼承和派生關系如圖2所示。
圖2MFC類的基本層次結(jié)構(gòu)CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd現(xiàn)在是4頁\一共有57頁\編輯于星期六1框架窗口項目的文件組織
項目中源文件都是采用文件夾的方式進行管理的,將項目名作為文件夾名,此文件夾下包含源程序代碼文件、項目文件以及項目工作區(qū)文件等。每一個類的源代碼均保存同名的h和cpp文件。其他一些文件類型的含義: .opt 關于開發(fā)環(huán)境的參數(shù)文件,如工具條位置等信息
.aps(AppStudioFile) 資源輔助文件,二進制格式 .clw ClassWizard信息文件 .dsp(DeveloperStudioProject) 項目文件 .plg 編譯信息文件 .mdp(MicrosoftDevStudioProject) 舊版本的項目文件 .bsc 用于瀏覽項目信息 .map 執(zhí)行文件的映像信息紀錄文件 .pch(Pre-CompiledFile) 預編譯文件,可以加快編譯速度,但是文件非常大 .pdb(ProgramDatabase) 記錄程序有關的一些數(shù)據(jù)和調(diào)試信息 .ncb 無編譯瀏覽文件(nocompilebrowser)還有相應的Debug(調(diào)試)、Res(資源)等子文件夾。用應用程序向?qū)?chuàng)建項目時,系統(tǒng)自動為項目創(chuàng)建Win32Debug版本的運行程序,并使用相應的默認配置。程序編連后,用于該項目的可執(zhí)行文件以及其他調(diào)試的信息文件都安放在Debug文件夾中。程序項目有一個Win32Release版本,與Release的區(qū)別在于:Debug版本的運行程序有相應的調(diào)試信息碼,Release版本的運行程序沒有,但Release版本的運行程序經(jīng)過代碼的優(yōu)化,其程序的運行效率被最大提升。選擇“編譯”“配置”菜單命令,在“配置”對話框?qū)㈨椖吭O置成Win32Release版本。
現(xiàn)在是5頁\一共有57頁\編輯于星期六1框架窗口主框架窗口和文檔窗口
主框架窗口是直接放置在桌面(DeskTop)上的那個窗口,每個應用程序只能有一個主框架窗口。主框架窗口負責管理各個用戶交互對象并根據(jù)用戶操作相應地創(chuàng)建或更新文檔窗口及其視圖。文檔窗口對SDI程序來說,和主框架窗口是一致的,主框架窗口就是文檔窗口;對于MDI程序,文檔窗口是主框架窗口的子窗口,如圖。文檔窗口一般都有相應的可見邊框,它的客戶區(qū)(除了窗口標題欄、邊框外的區(qū)域)是由相應的視圖來構(gòu)成的,因此可以說視圖是文檔窗口內(nèi)的子窗口。文檔窗口時刻跟蹤當前處于活動狀態(tài)的視圖的變化,并將用戶或系統(tǒng)產(chǎn)生的消息傳遞給當前活動視圖。
現(xiàn)在是6頁\一共有57頁\編輯于星期六1框架窗口1.2窗口狀態(tài)的改變 MFCAppWizard為每個窗口設置了相應的大小和位置。 運行程序時,會自動調(diào)用框架內(nèi)部的WinMain函數(shù),并自動查找該應用程序類的全局變量theApp,然后自動調(diào)用用戶應用程序類的虛函數(shù)InitInstance,該函數(shù)會進一步調(diào)用相應的函數(shù)來完成主窗口的構(gòu)造和顯示工作,代碼: BOOLCEx_SDIApp::InitInstance() { … m_pMainWnd->ShowWindow(SW_SHOW); //顯示窗口 m_pMainWnd->UpdateWindow(); //更新窗口 returnTRUE; }
m_pMainWnd是主框架窗口指針變量,ShowWindow是CWnd類的成員函數(shù),用來按指定的參數(shù)顯示窗口。
現(xiàn)在是7頁\一共有57頁\編輯于星期六1框架窗口 通過指定ShowWindow函數(shù)的參數(shù)值可以改變改變窗口顯示狀態(tài)。例如下面的代碼是將窗口的初始狀態(tài)設置為“最小化”: BOOLCEx_SDIApp::InitInstance() { ... m_pMainWnd->ShowWindow(SW_SHOWMINIMIZED); m_pMainWnd->UpdateWindow(); returnTRUE; }現(xiàn)在是8頁\一共有57頁\編輯于星期六1框架窗口1.3窗口風格的設置
窗口風格
通常有一般和擴展兩種形式??稍诤瘮?shù)CWnd::Create或CWnd::CreateEx參數(shù)中指定,CreateEx函數(shù)可同時支持以上兩種風格,CWnd::Create只能指定窗口的一般風格??丶蛯υ捒虻拇翱陲L格可直接通過其屬性對話框來設置。
除了上述風格外,框架窗口還有以下三個自己的風格。它們都可以在PreCreateWindow重載函數(shù)的CREATESTRUCT結(jié)構(gòu)中指定。FWS_ADDTOTITLE 該風格指定相關的信息如文檔名添加到框架窗口標題的后面。FWS_PREFIXTITLE
該風格使得框架窗口標題中的文檔名顯示在應用程序名之前。FWS_SNAPTOBARS
該風格用來調(diào)整窗口的大小,使它剛好包含了框架窗口中的控制欄。例
cs.cx=300;
cs.cy=200;
cs.style=cs.style&~FWS_ADDTOTITLE;//取反
cs.lpszName="大連理工大學";
現(xiàn)在是9頁\一共有57頁\編輯于星期六1框架窗口在MFCAppWizard中進行修改
[例Ex_SDI]在向?qū)е行薷拇翱陲L格。
(1)選擇“文件”“新建”,選擇“工程”,選擇MFCAppWizard(exe)的項目類型,指定項目工作文件夾位置,輸入項目名Ex_SDI,單擊[確定]按鈕。(2)
在向?qū)У牡谝徊街?,將應用程序類型選為“單個文檔”(SDI)。(3)單擊[下一個],如圖,可以選擇程序中是否加入數(shù)據(jù)庫的支持。(4)單擊[下一個],出現(xiàn)向?qū)У牡谌綄υ捒?,如圖,允許在程序中加入復合文檔、自動化、ActiveX控件的支持。
現(xiàn)在是10頁\一共有57頁\編輯于星期六1框架窗口
(5)單擊[下一個],如圖,對話框的前幾項依次確定對浮動工具條、打印與預覽以及通信網(wǎng)絡等特性的支持。對話框的最后兩項是最近文件列表數(shù)目的設置(默認時為4)和一個[高級]按鈕
?,F(xiàn)在是11頁\一共有57頁\編輯于星期六1框架窗口
(6)在第四步對話框中,單擊[高級],如圖,分別用于文檔模板字串資源內(nèi)容和窗口風格的修改。
現(xiàn)在是12頁\一共有57頁\編輯于星期六1框架窗口 (7)單擊[關閉],單擊[下一個],如圖??蛇x擇:應用程序的主窗口是MFC標準風格還是窗口左邊有切分窗口的瀏覽器風格,在源文件中是否加入注釋用來引導用戶編寫程序代碼,是使用動態(tài)鏈接庫(DLL)還是靜態(tài)鏈接庫。 (8)單擊[下一個]按鈕,出現(xiàn)如圖9所示的對話框。在這里,用戶可以對MFCAppWizard提供的默認類名、基類名、各個源文件名進行修改。
現(xiàn)在是13頁\一共有57頁\編輯于星期六1框架窗口(9)
單擊[完成],單擊[確定],回到主界面。在向?qū)е凶鞒龅倪x擇,有部分內(nèi)容反映在CEx_SDIApp::InitInstance函數(shù)中,代碼:BOOLCEx_SDIApp::InitInstance(){//若用戶在MFCAppWizard的第三步中,選中了“ActiveXControls”, //則表示所創(chuàng)建的應用程序支持ActiveX控件 AfxEnableControlContainer();
//若用戶在MFCAppWizard的第四步中,選中了“3Dcontrols” //則表示所創(chuàng)建的應用程序支持3D控件風格 #ifdef_AFXDLL Enable3dControls(); //使用MFC動態(tài)鏈接庫的3D控件 #else Enable3dControlsStatic(); //使用MFC靜態(tài)鏈接庫的3D控件 #endif //在Windows系統(tǒng)注冊表中登記應用程序的主鍵值,以便將一些與應用程序 //相關的參數(shù)存放在該主鍵值下 SetRegistryKey(_T("LocalMFCAppWizard-GeneratedApplications")); //從注冊表中調(diào)入應用程序的一些標準參數(shù)值,其中包括最近文件列表的文件名 LoadStdProfileSettings();… returnTRUE; }現(xiàn)在是14頁\一共有57頁\編輯于星期六1框架窗口修改CREATESTRUCT結(jié)構(gòu)
窗口創(chuàng)建前,自動調(diào)用PreCreateWindow虛函數(shù)。用MFCAppWizard創(chuàng)建文檔應用程序結(jié)構(gòu)時,MFC已為主窗口或文檔窗口類自動重載了該虛函數(shù)??梢栽诖撕瘮?shù)中通過修改CREATESTRUCT結(jié)構(gòu)來設置窗口的絕大多數(shù)風格。 對于多文檔應用程序,文檔窗口的風格可用下列的代碼更改: BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs) { //創(chuàng)建不含有[最大化]按鈕的子窗口 cs.style&=~WS_MAXIMIZEBOX; //調(diào)用基類的PreCreateWindow函數(shù) returnCFrameWnd::PreCreateWindow(cs); }現(xiàn)在是15頁\一共有57頁\編輯于星期六1框架窗口使用ModifyStyle和ModifyStyleEx
ModifyStyleEx可更改窗口的擴展風格。兩個函數(shù)具有相同的參數(shù),含義。 BOOLModifyXXXX(DWORDdwRemove,DWORDdwAdd,UINTnFlags=0); 參數(shù)dwRemove 指定需要刪除的風格,dwAdd指定需要增加的風格,nFlags表示SetWindowPos的標志??蚣艽翱谠O定擴展風格只能通過調(diào)用ModifyStyle函數(shù)來進行。例如用MFCClassWizard為一個多文檔應用程序Ex_MDI的子文檔窗口類CChildFrame添加OnCreateClient消息處理,并增加下列代碼: BOOLCMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext) { ModifyStyle(0,WS_VSCROLL,0); returnCMDIChildWnd::OnCreateClient(lpcs,pContext); }現(xiàn)在是16頁\一共有57頁\編輯于星期六1框架窗口1.4改變窗口的大小和位置
CWnd類的成員函數(shù)SetWindowPos或MoveWindow可以改變窗口的大小和位置。SetWindowPos可以改變窗口的大小、位置,還可以改變所有窗口在堆棧排列的次序(Z次序),這個次序是根據(jù)它們在屏幕出現(xiàn)的先后來確定的。 BOOLSetWindowPos(constCWnd*pWndInsertAfter,intx,inty,int
cx,int
cy,UINT
nFlags); 參數(shù)pWndInsertAfter 表示窗口對象指針,下列預定義窗口對象的地址: wndBottom 將窗口放置在Z次序中的底層 wndTop 將窗口放置在Z次序中的頂層 wndTopMost 設置最頂窗口 wndNoTopMost 將窗口放置在所有最頂層的后面,若此窗口不是最頂窗口,則此標志無效。 x和y表示窗口新的左上角坐標,cx和cy分別表示表示窗口新的寬度和高度,nFlags表示窗口新的大小和位置方式。
現(xiàn)在是17頁\一共有57頁\編輯于星期六1框架窗口函數(shù)CWnd::MoveWindow也可用來改變窗口的大小和位置,必須在MoveWindow函數(shù)中指定窗口的大小。 voidMoveWindow(intx,int
y,int
nWidth,intnHeight,BOOL
bRepaint=TRUE); voidMoveWindow(LPCRECT
lpRect,BOOLbRepaint
=TRUE); 參數(shù)x和y表示
窗口新的左上角坐標,nWidth和nHeight表示窗口新的寬度和高度,bRepaint用于指定窗口是否重繪,lpRect表示窗口新的大小和位置。例如,在CEx_SDIApp::InitInstance中[returnTRUE]語句之前添加下列代碼,可以使主框架窗口移動到屏幕的(100,100)處: //若使用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); CRect是一個矩形類,GetWindowRect是一個CWnd類的成員函數(shù),用來獲取窗口在屏幕的位置和大小。
現(xiàn)在是18頁\一共有57頁\編輯于星期六2菜單
許多程序員對于菜單的設計都遵循下列一些規(guī)則:l
若選擇某菜單項會彈出一對話框,那么在該菜單項文本后有“…”。l
若某項菜單有子菜單,那么在該菜單項文本后有“”。l
若菜單項需要助記符,用括號將帶下劃線的字母括起來。助記符與Alt構(gòu)成一個組合鍵,當按住“Alt”鍵不放,敲擊該字母時,對應的菜單項就會被選中。l若某項菜單需要快捷鍵的支持,則一般將其列在相應菜單項文本之后。所謂“快捷鍵”是一個組合鍵,如Ctrl+N,使用時是先按下“Ctrl”健不放,然后再按“N”鍵。任何時候按下快捷鍵,相應的菜單命令都會被執(zhí)行。
圖11菜單樣例子現(xiàn)在是19頁\一共有57頁\編輯于星期六2菜單2.1更改應用程序菜單
菜單“文件”“打開工作區(qū)”。在工作區(qū)中選擇ResourceView頁面,雙擊資源“Menu”中的IDR_MAINFRAME,通過菜單編輯器修改菜單資源IDR_MAINFRAME,可以為程序重新指定一個菜單,下面的示例過程:(1)
打開前面的單文檔應用程序Ex_SDI。(2)按快捷鍵Ctrl+R,在資源類型中選定“Menu”,如圖。
(3)單擊[新建],如圖。
現(xiàn)在是20頁\一共有57頁\編輯于星期六2菜單 (4)在Menu的ID_MENU1上右擊鼠標,選擇“Properties”命令,如圖,可以重新指定菜單資源ID,設置菜單資源的語言和條件,這個條件用來決定菜單資源包含到哪個環(huán)境中,例如當指定條件為_DEBUG,則菜單資源只存在于Debug編譯環(huán)境中。
(5)菜單ID_MENU1添加一個頂層彈出菜單項“測試(&T)”,并在該菜單下添加一個子菜單項“返回(&R)”,ID設為ID_TEST_RETURN,如圖。
(6)打開Ex_SDI程序菜單資源IDR_MAINFRAME,在“查看”菜單的最后添加一個子菜單項“顯示測試菜單(&M)”,ID設為ID_VIEW_TEST。 (7)為CMainFrame類添加一個CMenu類型的成員變量m_NewMenu,CMenu類是用來處理菜單的一個MFC類。
現(xiàn)在是21頁\一共有57頁\編輯于星期六2菜單(8)按快捷鍵Ctrl+W,切換到MessageMaps頁面,從“Classname”列表中選擇CMainFrame,分別為菜單項ID_VIEW_TEST和ID_TEST_RETURN添加COMMAND消息映射,使用默認的消息映射函數(shù)名,并添中下列代碼: voidCMainFrame::OnViewTest() { m_NewMenu.Detach(); //使菜單對象和菜單句柄分離 m_NewMenu.LoadMenu(IDR_MENU1); SetMenu(NULL); //清除應用程序菜單 SetMenu(&m_NewMenu); //設置應用程序菜單 } voidCMainFrame::OnTestReturn() { m_NewMenu.Detach(); m_NewMenu.LoadMenu(IDR_MAINFRAME); SetMenu(NULL); SetMenu(&m_NewMenu); }
LoadMenu裝載菜單資源,Detach使菜單對象與菜單句柄分離。調(diào)用LoadMenu后,菜單對象m_NewMenu就擁有一個菜單句柄,再次調(diào)用LoadMenu時,發(fā)生運行時錯誤,當菜單對象與菜單句柄分離后,就可以再創(chuàng)建菜單。SetMenu是CWnd類的一個成員函數(shù),用來設置應用程序的菜單。(9)編譯運行并測試。
現(xiàn)在是22頁\一共有57頁\編輯于星期六2菜單2.2使用鍵盤快捷鍵
通過上述的菜單系統(tǒng),可以選擇幾乎所有可用的命令和選項,保證了菜單命令系統(tǒng)的完整性,菜單系統(tǒng)操作效率不高。對于那些反復使用的命令,有必要進一步提高效率,于是加速鍵應運而生。一個加速鍵就是一個按鍵或幾個按鍵的組合,用于激活特定的命令。加速鍵也是一種資源。
例如:為前面兩個菜單ID_VIEW_TEST和ID_TEST_RETURN定義鍵盤快捷鍵:
(1)打開上例的工作區(qū)窗口中Accelerator的資源項,雙擊IDR_MAINFRAME,如圖。
現(xiàn)在是23頁\一共有57頁\編輯于星期六2菜單 (2)建立一新的加速鍵,雙擊加速鍵列表的最下端的空行,彈出如圖的“AccelProperities”(加速鍵屬性)對話框,可設置的屬性如表。
現(xiàn)在是24頁\一共有57頁\編輯于星期六2菜單(3)選擇Ex_SDI添加的“顯示測試菜單”菜單項ID_VIEW_TEST作為要聯(lián)用的加速鍵的ID號,然后單擊[下一鍵]按鈕,并按下Ctrl+1作為此加速鍵的鍵值。(4)按同樣的方法,為菜單項ID_TEST_RETURN添加加速鍵Ctrl+2。需要說明的是,為了使其他用戶能查看并使用該加速鍵,還需在相應的菜單項文本后面添加加速鍵內(nèi)容。例如,可將ID_VIEW_TEST菜單項的標題改成“顯示測試菜單(&M)\tCtrl+1”,其中“\t”是將后面的“Ctrl+1”定位到一個水平制表位。(5)編譯運行并測試。當程序運行后,按“Ctrl+1”和“Ctrl+2”將執(zhí)行相應的菜單命令。
現(xiàn)在是25頁\一共有57頁\編輯于星期六2菜單2.3菜單的編程控制
創(chuàng)建菜單
CreateMenu和CreatePopupMenu用來創(chuàng)建一個菜單或子菜單框架,原型: BOOLCreateMenu();
//
產(chǎn)生一個空菜單
BOOLCreatePopupMenu();
//產(chǎn)生一個空的彈出式子菜單
裝入菜單資源
需調(diào)用CMenu成員函數(shù)LoadMenu,再用SetMenu對應用程序菜單進行重新設置。
BOOLLoadMenu(LPCTSTRlpszResourceName); BOOLLoadMenu(UINTnIDResource); lpszResourceName為菜單資源名稱,nIDResource為菜單資源ID號。
添加菜單項
可以調(diào)用AppendMenu或InsertMenu函數(shù)來添加菜單項。AppendMenu是將菜單項添加在菜單的末尾處,InsertMenu在指定位置處插入菜單項,將后面的菜單項依次下移。
BOOLAppendMenu(UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);
BOOLAppendMenu(UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp); BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0, LPCTSTRlpszNewItem=NULL); BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp); nIDNewItem表示新菜單項的ID號,lpszNewItem表示新菜單項的內(nèi)容,pBmp用于菜單項的位圖指針,nPosition表示新菜單項要插入的菜單項位置。nFlags表示要增加的新菜單項的狀態(tài)信息。
現(xiàn)在是26頁\一共有57頁\編輯于星期六2菜單
注意:l
當nFlags為MF_BYPOSITION時,nPosition表示新菜單項要插入的具體位置,為0時表示第一個菜單項,為-1時,將菜單項添加菜單的末尾處。l
nFlags的標志中,可以用“|”(按位或)來組合。有些組合是不允許的,例如MF_DISABLED、MF_ENABLED和MF_GRAYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位圖,MF_CHECKED和MF_UNCHECKED都不能組合在一起。l當菜單項增加后,不管菜單依附的窗口是否改變,都應調(diào)用CWnd::DrawMenuBar來更新菜單。
現(xiàn)在是27頁\一共有57頁\編輯于星期六2菜單刪除菜單項
DeleteMenu函數(shù)可將菜單項刪除,注意:調(diào)用該函數(shù)后,不管菜單依附的窗口是否改變,都應調(diào)用CWnd::DrawMenuBar使菜單更新。函數(shù)原型: BOOLDeleteMenu(UINTnPosition,UINTnFlags);
nPosition表示要刪除菜單項位置,由nFlags進行說明。nFlags為MF_BYCOMMAND時,nPosition表示菜單項ID號,nFlags為MF_BYPOSITION時,nPosition表示菜單項的位置。
獲取菜單項
下面四個CMenu成員函數(shù)分別獲得菜單的項數(shù)、菜單項的ID號、菜單項的文本內(nèi)容以及彈出式子菜單的句柄。 UINTGetMenuItemCount()const;//用來獲得菜單的菜單項數(shù)。 UINTGetMenuItemID(intnPos)const;//用來獲得由nPos指定菜單項位置的菜單項的標識號。 intGetMenuString(UINTnIDItem,CString&rString,UINTnFlags)const; //獲得由nIDItem指定菜單項位置的菜單項的文本內(nèi)容,由rString參數(shù)返回,nFlags為MF_BYPOSITION時,nPosition表示菜單項的位置。 CMenu*GetSubMenu(intnPos)const; //用來獲得指定菜單的彈出式菜單的菜單句柄。
現(xiàn)在是28頁\一共有57頁\編輯于星期六2菜單示例
示例過程利用CMenu成員函數(shù)向應用程序菜單中添加并處理一個菜單項:(1)
打開前面的單文檔應用程序Ex_SDI或重新創(chuàng)建。(2)“查看”菜單“ResourceSymbols…”,如圖。(3)單擊[新建],如圖。在名字框中輸入標識符ID_NEW_MENUITEM。在值框中輸入ID的值,單擊[確定]。
現(xiàn)在是29頁\一共有57頁\編輯于星期六2菜單(4)
關閉“資源符號”對話框,在CMainFrame::OnCreate函數(shù)中添加下列代碼。 intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) { ... CMenu*pSysMenu=GetMenu(); //獲得程序菜單指針 CMenu*pSubMenu=pSysMenu->GetSubMenu(1);//獲得第二個子菜單的指針 CStringStrMenuItem("新的菜單項"); pSubMenu->AppendMenu(MF_SEPARATOR); //增加一水平分隔線 pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); //在子菜單中增加一菜單項 //允許使用ON_UPDATE_COMMAND_UI或ON_COMMAND的菜單項 m_bAutoMenuEnable=FALSE;//關閉系統(tǒng)自動更新菜單狀態(tài) pSysMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED); //激活菜單項 DrawMenuBar(); //更新菜單 return0; }現(xiàn)在是30頁\一共有57頁\編輯于星期六2菜單(5)
用MFCClassWizard處理OnCommand消息并檢測用戶菜單的nID參數(shù)。 BOOLCMainFrame::OnCommand(WPARAMwParam,LPARAMlParam) { //wParam的低字節(jié)表示菜單、控件、加速鍵的命令ID if(LOWORD(wParam)==ID_NEW_MENUITEM) MessageBox("你選中了新的菜單項"); returnCFrameWnd::OnCommand(wParam,lParam); }(6)編譯運行并測試。這樣當選擇菜單“編輯”“新的菜單項”命令后,就會彈一個對話框,顯示“你選中了新的菜單項”消息。
現(xiàn)在是31頁\一共有57頁\編輯于星期六2菜單2.4使用快捷菜單
快捷菜單實現(xiàn)函數(shù)
用資源編輯器和MFC庫的CMenu::TrackPopupMenu函數(shù)可以創(chuàng)建這樣的菜單,CMenu::TrackPopupMenu函數(shù)原型: BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL); 用來顯示一個浮動的彈出式菜單。nFlags表示菜單在屏幕顯示的位置以及鼠標按鈕標志,如表。x和y表示菜單的水平坐標和菜單的頂端的垂直坐標。pWnd表示彈出菜單的窗口,此窗口將收到菜單全部的WM_COMMAND消息。lpRect是一個RECT結(jié)構(gòu)或CRect對象指針,表示一個矩形區(qū)域,單擊這個區(qū)域時,彈出菜單不消失。lpRect為NULL時,在菜單外面單擊鼠標,菜單立刻消失。
現(xiàn)在是32頁\一共有57頁\編輯于星期六2菜單示例
顯示主菜單IDR_MAINFRAME時,右擊鼠標彈出“查看”菜單的子菜單,顯示菜單IDR_MENU1時,右擊鼠標彈出“測試”菜單的子菜單。具體步驟:(1)
打開前面的單文檔應用程序Ex_SDI。(2)
在CMainFrame類添加WM_CONTEXTMENU消息映射,函數(shù)代碼。 voidCMainFrame::OnContextMenu(CWnd*pWnd,CPointpoint) { CMenu*pSysMenu=GetMenu(); //獲得程序菜單指針 intnCount=pSysMenu->GetMenuItemCount(); //獲得頂層菜單個數(shù) intnSubMenuPos=-1; for(inti=0;i<nCount;i++) //查找菜單 { CStringstr; pSysMenu->GetMenuString(i,str,MF_BYPOSITION); if((str.Left(4)=="查看")||(str.Left(4)=="測試")) { nSubMenuPos=i; break; } } if(nSubMenuPos<0) return; //沒有找到,返回 pSysMenu->GetSubMenu(nSubMenuPos) ->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); }
(3)編譯運行并測試。
現(xiàn)在是33頁\一共有57頁\編輯于星期六3工具欄
3.1使用工具欄編輯器
創(chuàng)建一個新的工具欄按鈕
雙擊新建的工具欄中最右端的空按鈕彈出屬性框,在ID框中輸入名稱,右端出現(xiàn)一個空按鈕。單擊該按鈕,在資源編輯器的工具按鈕設計窗口內(nèi)進行編輯,這個編輯就是繪制一個工具按鈕的位圖。
移動一個按鈕 鼠標左鍵點中它并拖動至相應位置。如果用戶拖動它離開工具欄位置,則此按鈕從工具欄中消失。若在移動一個按鈕的同時,按下Ctrl鍵,則在新位置復制一個按鈕,新位置可以是同一個工具欄中的其他位置,也可以在不同的工具欄中。
刪除一個按鈕
將選取中的按鈕拖離工具欄就消失了。若選中按鈕,Delete鍵不能刪除,將按鈕中的圖形全部以背景色填充。
在工具欄中插入空格
如果按扭前沒有任何空格,拖動該按鈕向右移動并當覆蓋相鄰按鈕的一半以上時,釋放鼠標鍵,則此按鈕前出現(xiàn)空格。
如果按鈕前有空格而按鈕后沒有空格,拖動該按鈕向左移動并當按鈕的左邊界接觸到前面按鈕時,釋放鼠標鍵,則此按鈕后將出現(xiàn)空格。如果按鈕前后均有空格,拖動該按鈕向右移動并當接觸到相鄰按鈕時,則此按鈕前的空格保留,按鈕后的空格消失。相反,拖動該按鈕向左移動并當接觸到前一個相鄰按鈕時,則此按鈕前面的空格消失,后面的空格保留。
現(xiàn)在是34頁\一共有57頁\編輯于星期六3工具欄工具欄按鈕屬性的設置
現(xiàn)在是35頁\一共有57頁\編輯于星期六3工具欄3.2工具按鈕和菜單項相結(jié)合
指選擇工具按鈕或菜單命令時,操作結(jié)果是一樣的。使它們結(jié)合的具體方法是在工具按鈕的屬性對話框中將按鈕的ID號設置為相關聯(lián)的菜單項ID。
例如:示例是在前面Ex_SDI上進行的,通過兩個工具按鈕分別顯示主菜單IDR_MAINFRAME和菜單IDR_MENU1。具體步驟:(1)
打開前面的單文檔應用程序Ex_SDI。(2)利用工具欄編輯器設計兩個工具按鈕,如圖。
現(xiàn)在是36頁\一共有57頁\編輯于星期六3工具欄(3)
雙擊設計的第一個工具按鈕,將工具按鈕的ID號設為ID_TEST_RETURN,在提示框內(nèi)鍵入“返回應用程序主菜單\n返回主菜單”。(4)
雙擊設計的第二個工具按鈕,將工具按鈕的ID號設為ID_VIEW_TEST,在提示框內(nèi)鍵入“顯示測試菜單\n顯示測試菜單”。(5)編譯運行并測試。將鼠標移至設計的第一個工具按鈕處,這時在狀態(tài)欄上顯示出“返回應用程序主菜單”信息,若稍等片刻后,還會彈出提示小窗口,顯示出“返回主菜單”字樣,如圖。單擊新添加的這兩個按鈕,會執(zhí)行相應的菜單命令。
現(xiàn)在是37頁\一共有57頁\編輯于星期六3工具欄3.3多個工具欄的使用操作步驟如下:(1)
打開前面的單文檔應用程序Ex_SDI。(2)
將工作區(qū)切換到ResourceView,展開Toolbar(工具欄)資源,用鼠標單擊IDR_MAINFRAME不松開,按Ctrl,將IDR_MAINFRAME拖到Toolbar資源名稱上。(3)右擊工具欄資源IDR_MAINFRAME1,選擇Properties命令,如圖。(4)雙擊IDR_TOOLBAR1,按圖刪除不要的工具按鈕。(5)在CMainFrame類中添加一個成員變量m_wndTestBar,變量類型為CToolBar。CToolBar類封裝了工具欄的操作。
現(xiàn)在是38頁\一共有57頁\編輯于星期六3工具欄(6)
在CMainFrame::OnCreate函數(shù)中添加下面的工具欄創(chuàng)建代碼: intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) { if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1; intnRes=m_wndTestBar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE| CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY| CBRS_SIZE_DYNAMIC, CRect(0,0,0,0), AFX_IDW_TOOLBAR+10); if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP |CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|| !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate } if(!nRes||!m_wndTestBar.LoadToolBar(IDR_TOOLBAR1)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate } … m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); DockControlBar(&m_wndTestBar); … return0;}現(xiàn)在是39頁\一共有57頁\編輯于星期六3工具欄 (7)編譯運行,如圖。
(8)需要調(diào)用CFrameWnd類的成員函數(shù)ShowControlBar來使程序一開始運行時隱藏工具欄IDR_TOOLBAR1。在CMainFrame::OnCreate中添加代碼: intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) { … ShowControlBar(&m_wndTestBar,FALSE,FALSE);//關閉測試工具欄 return0; }現(xiàn)在是40頁\一共有57頁\編輯于星期六3工具欄(9)
在CMainFrame::OnViewTest和CMainFrame::OnTestReturn中添加代碼: voidCMainFrame::OnViewTest() { … ShowControlBar(&m_wndTestBar,TRUE,FALSE);//顯示測試工具欄 ShowControlBar(&m_wndToolBar,FALSE,FALSE);//關閉主工具欄 } voidCMainFrame::OnTestReturn() { … ShowControlBar(&m_wndTestBar,FALSE,FALSE);//關閉測試工具欄 ShowControlBar(&m_wndToolBar,TRUE,FALSE);//顯示主工具欄 }(10)
編譯運行并測試,如圖,左邊開始運行的結(jié)果,右邊是單擊按鈕運行的結(jié)果。
現(xiàn)在是41頁\一共有57頁\編輯于星期六4狀態(tài)欄
4.1狀態(tài)欄的定義
AppWizard創(chuàng)建的SDI或MDI應用程序框架中,有一個靜態(tài)的indicator數(shù)組,是在MainFrm.cpp文件中定義的,被MFC用作狀態(tài)欄的定義。
數(shù)組中的元素是一些標識常量或是字串資源的ID號。圖列出了indicators數(shù)組元素與標準狀態(tài)欄窗格的關系。
StaticUINTindicators[]={ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,}圖28indicators數(shù)組的定義現(xiàn)在是42頁\一共有57頁\編輯于星期六4狀態(tài)欄4.2狀態(tài)欄的常用操作
增加和減少窗格
在狀態(tài)欄中增加信息行窗格,在indicators數(shù)組中增加一個ID_SEPARATOR標識;在狀態(tài)欄中增加指示器窗格,在indicators數(shù)組中增加一個在字符串表中定義過的資源ID。狀態(tài)欄減少一個窗格,只需減少indicators數(shù)組元素。
在狀態(tài)欄上顯示文本
調(diào)用CStatusBar::SetPaneText函數(shù)更新任何窗格中的文本。函數(shù)原型: BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);示例
(1)
創(chuàng)建一個默認的單文檔應用程序Ex_SDIMouse。(2)
將工作區(qū)切換到ClassView頁面,展開CMainFrame,雙擊CMainFrame,在文檔窗口中出現(xiàn)該函數(shù)的定義,在它的前面就是狀態(tài)欄數(shù)組的定義。(3)
將狀態(tài)欄indicators數(shù)組的定義改為下列代碼: staticUINTindicators[]= { ID_SEPARATOR, ID_SEPARATOR, };現(xiàn)在是43頁\一共有57頁\編輯于星期六4狀態(tài)欄(4)在CEx_SDIMouseView類中添加CMainFrame類的代碼。CEx_SDIMouseView::OnMouseMove代碼: voidCEx_SDIMouseView::OnMouseMove(UINTnFlags,CPointpoint) { CStringstr; CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; //獲得主窗口指針 CStatusBar*pStatus=&pFrame->m_wndStatusBar; //獲得主窗口中的狀態(tài)欄指針 if(pStatus){ str.Format("X=%d,Y=%d",point.x,point.y); //格式化文本 pStatus->SetPaneText(1,str); //更新第二個窗格的文本 } CView::OnMouseMove(nFlags,point); }現(xiàn)在是44頁\一共有57頁\編輯于星期六4狀態(tài)欄(5)
將MainFrm.h文件中的受保護變量m_wndStatusBar變成公共變量。(6)
在Ex_SDIMouseView.cpp文件的開始處增加下列語句: #include"Ex_SDIMouseView.h" #include"MainFrm.h“(7)編譯并運行,如圖。
現(xiàn)在是45頁\一共有57頁\編輯于星期六4狀態(tài)欄4.3改變狀態(tài)欄的風格
在MFC的CStatusBar類中,有兩個成員函數(shù)可以改變狀態(tài)欄風格,它們是: voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth); voidSetPaneStyle(intnIndex,UINTnStyle); 參數(shù)nIndex表示要設置的狀態(tài)欄窗格的索引,nID為狀態(tài)欄窗格指定新的ID,cxWidth表示窗格的像素寬度,nStyle表示窗格的風格類型,指定窗格的外觀,例如SBPS_POPOUT表示窗格是凸起來的,見表。
現(xiàn)在是46頁\一共有57頁\編輯于星期六5交互對象的動態(tài)更新 在前面Ex_SDI基礎上,單擊工具按鈕,該按鈕被按下,按鈕彈起,單擊工具按鈕時,該按鈕被按下,按鈕彈起,如此反復。具體步驟:
(1)
打開上例的單文檔應用程序項目Ex_SDI。(2)
為CMainFrame添加一個BOOL型的成員變量m_bMainWork,將m_bMainWork的初值設為TRUE。(3)
在CMainFrame類中添加工具按鈕ID_VIEW_TEST和ID_TEST_RETURN的UPDATE_COMMAND_UI消息映射函數(shù),添加代碼: voidCMainFrame::OnUpdateViewTest(CCmdUI*pCmdUI){ pCmdUI->Enable(TRUE); pCmdUI->SetCheck(!m_bMainWork); } voidCMainFrame::OnUpdateTestReturn(CCmdUI*pCmdUI){ pCmdUI->Enable(TRUE); pCmdUI->SetCheck(m_bMainWork); }現(xiàn)在是47頁\一共有57頁\編輯于星期六5交互對象的動態(tài)更新(4)在CMainFrame::OnViewTest和CMainFrame::OnTestReturn添加代碼: voidCMainFrame::OnViewTest() { … m_bMainWork=FALSE; } voidCMainFrame::OnTestReturn() { … m_bMainWork=TRUE; }(5)編譯運行并測試,如圖。
現(xiàn)在是48頁\一共有57頁\編輯于星期六6圖標和光標
1使用圖形編輯器
創(chuàng)建一個新的圖標或光標
創(chuàng)建應用程序后,按快捷鍵Ctrl+R打開“插入資源”,選擇Cursor(光標)或Icon(圖標)資源類型,單擊[新建]。如圖。 創(chuàng)建新圖標或光標的時,圖形編輯器先創(chuàng)建的是一個適合于VGA環(huán)境中的圖像,開始的時候它以屏幕色(透明方式)來填充。如表。
新設備按鈕現(xiàn)在是49頁\一共有57頁\編輯于星期六6圖標和光標選用和定制顯示設備
圖形編輯器上,有一個NewDeviceImage按鈕,單擊,如圖。
單擊[定制],如圖。設置光標熱點
借助光標“熱點”確定光標實際的位置。如圖。
設置熱點按鈕現(xiàn)在是50頁\一共有57頁\編輯于星期六6圖標和光標2圖標
圖標的調(diào)入和清除
CWinApp::LoadIcon可將一個圖標資源調(diào)入并返回一個圖標句柄。原型: HICONLoadIcon(LPCTSTRlpszResourceName)const; HICONLoadIcon(UINTnIDResource)const;不想創(chuàng)建新的圖標資源,可使用預定義的標準圖標,調(diào)用CWinApp::LoadStandardIcon,原型:
HICONLoadStandardIcon(LPCTSTRlpszIconName)const; lpszIconName可以是下列值之一: IDI_APPLICATION 默認的應用程序圖標 IDI_HAND 手形圖標(用于嚴重警告) IDI_QUESTION 問號圖標(用于提示消息) IDI_EXCLAMATION 警告消息圖標(驚嘆號) IDI_ASTERISK 消息圖標
DestroyIcon可以用來刪除一個圖標,釋放為圖標分配的內(nèi)存,原型: BOOLDestroyIcon(HICONhIcon);hIcon用來指定要刪除的圖標句柄。
圖標的繪制
函數(shù)CDC::DrawIcon將一個圖標繪制在指定的位置處,原型: BOOLDrawIcon(intx,inty,HICONhIcon); BOOLDrawIcon(POINTpoint,HICONhIcon);
現(xiàn)在是51頁\一共有57頁\編輯于星期六6圖標和光標應用程序圖標的改變
使用GetClassLong和SetClassLong重新指定應用程序窗口的圖標,原型: DWORDSetClassLong(HWNDhWnd,intnIndex,LONGdwNewLong); DWORDGetClassLong(HWNDhWnd,intnIndex); hWnd用來指定窗口類句柄,dwNewLong用來指定新的32位值。nIndex用來指定與WNDCLASSEX結(jié)構(gòu)相關的索引,它可以是下列值之一: GCL_HBRBACKGROUND 窗口類的背景畫刷句柄 GCL_HCURSOR 窗口類的的光標句柄 GCL_HICON 窗口類的的圖標句柄
GCL_MENUNAME
窗口類的的菜單資源名稱示例
[例Ex_Icon]改變應用程序圖標。(1)
用MFCAppWizard創(chuàng)建一個默認的單文檔應用程序Ex_Icon。(2)
新添四個圖標資源,通過圖像設備選擇對話框(參見圖32)。圖標資源ID號分別為默認的IDI_ICON1~IDI_ICON4。
現(xiàn)在是52頁\一共有57頁\編輯于星期六6圖標和光標(3)
用圖形編輯器繪制圖標,如圖。(4)
CMainFrame類添加成員函數(shù)ChangeIcon。函數(shù)代碼: voidCMainFrame::ChangeIcon(UINTnIconID) { HICONhIconNew=AfxGetApp()->LoadIcon(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工試用期合同管理要點
- 酒店大堂發(fā)布會租賃合同
- 醫(yī)院救護車司機聘用合同
- 電子產(chǎn)品設計師錄用合同模板
- 2024版標準民間借款合同范本正規(guī)范本
- 農(nóng)業(yè)種植機械租賃合同
- 二手文化機構(gòu)買賣合同模板文本
- 通信公司法定代表人聘任合同
- 產(chǎn)品發(fā)布會現(xiàn)場制片服務協(xié)議
- 電子產(chǎn)品維修顧問聘用協(xié)議
- 安徽省水利工程質(zhì)量檢測和建筑材料試驗服務收費標準
- 2022課程標準解讀及學習心得:大單元教學的實踐與思考
- OA協(xié)同辦公系統(tǒng)運行管理規(guī)定
- 公安警察工作匯報PPT模板課件
- 直腸癌個案護理范文結(jié)腸癌個案護理.doc
- 某小區(qū)建筑節(jié)能保溫工程監(jiān)理實施細則
- 污水處理中常用的專業(yè)術語
- 石英砂過濾器說明書
- 外市電引入工程實施管理要求(重要)
- 公務員錄用體檢表模板
- 工資轉(zhuǎn)移證明(樣表)
評論
0/150
提交評論