vc學(xué)習(xí)教程界面設(shè)計.ppt
《vc學(xué)習(xí)教程界面設(shè)計.ppt》由會員分享,可在線閱讀,更多相關(guān)《vc學(xué)習(xí)教程界面設(shè)計.ppt(58頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第6章框架窗口界面設(shè)計,6.1框架窗口6.2菜單6.3工具欄6.4狀態(tài)欄6.5交互對象的動態(tài)更新6.6圖標(biāo)和光標(biāo),6.1框架窗口,6.1.1單文檔和多文檔程序框架窗口文檔應(yīng)用程序的MFC類結(jié)構(gòu)如圖是單文檔應(yīng)用程序Ex_SDI和多文檔應(yīng)用程序Ex_MDI的MFC類結(jié)構(gòu)。,,,CAboutDlg是每一個應(yīng)用程序框架都有的,用來顯示本程序的有關(guān)信息。CEx_SDIApp和CEx_MDIApp是應(yīng)用程序類,是從CWinApp類派生而來,負(fù)責(zé)應(yīng)用程序創(chuàng)建、運行和終止,每一個應(yīng)用程序都需要這樣的類。CEx_SDIDoc和CEx_MDIDoc是文檔類,它們是從CDocument類派生而來,負(fù)責(zé)應(yīng)用程序文檔數(shù)據(jù)管理。CEx_SDIView和CEx_MDIView是視圖類,它們既可以從基類CView派生,也可以從CView派生類派生,負(fù)責(zé)數(shù)據(jù)的顯示、繪制和其他用戶交互。CMainFrame類是用來負(fù)責(zé)主框架窗口的顯示和管理,包括工具欄和狀態(tài)欄等界面元素的初始化。對于單文檔應(yīng)用程序來說,主框架窗口類是從CFrameWnd派生而來的,而對于多文檔應(yīng)用程序程序,主框架窗口是從CMDIFrameWnd派生的。,6.1框架窗口,CChildFrame類是從CMDIChildWnd派生而來,專門用來管理多文檔應(yīng)用程序中的文檔窗口。無論是CMDIChildWnd還是CMDIFrameWnd類,它們都是從CFrameWnd派生而來的。對于基于對話框的應(yīng)用程序,一般有CAboutDlg類、應(yīng)用程序類和對話框類。上述MFC類之間的繼承和派生關(guān)系如圖6.2所示。,6.1框架窗口,項目的文件組織項目中源文件都是采用文件夾的方式進(jìn)行管理的,將項目名作為文件夾名,此文件夾下包含源程序代碼文件、項目文件以及項目工作區(qū)文件等。每一個類的源代碼均保存同名的h和cpp文件。其他一些文件類型的含義:.opt關(guān)于開發(fā)環(huán)境的參數(shù)文件,如工具條位置等信息.aps(AppStudioFile)資源輔助文件,二進(jìn)制格式.clwClassWizard信息文件.dsp(DeveloperStudioProject)項目文件.plg編譯信息文件.mdp(MicrosoftDevStudioProject)舊版本的項目文件.bsc用于瀏覽項目信息.map執(zhí)行文件的映像信息紀(jì)錄文件.pch(Pre-CompiledFile)預(yù)編譯文件,可以加快編譯速度,但是文件非常大.pdb(ProgramDatabase)記錄程序有關(guān)的一些數(shù)據(jù)和調(diào)試信息.ncb無編譯瀏覽文件(nocompilebrowser)還有相應(yīng)的Debug(調(diào)試)、Res(資源)等子文件夾。用應(yīng)用程序向?qū)?chuàng)建項目時,系統(tǒng)自動為項目創(chuàng)建Win32Debug版本的運行程序,并使用相應(yīng)的默認(rèn)配置。程序編連后,用于該項目的可執(zhí)行文件以及其他調(diào)試的信息文件都安放在Debug文件夾中。程序項目有一個Win32Release版本,與Release的區(qū)別在于:Debug版本的運行程序有相應(yīng)的調(diào)試信息碼,Release版本的運行程序沒有,但Release版本的運行程序經(jīng)過代碼的優(yōu)化,其程序的運行效率被最大提升。選擇“編譯”?“配置”菜單命令,在“配置”對話框?qū)㈨椖吭O(shè)置成Win32Release版本。,6.1框架窗口,主框架窗口和文檔窗口主框架窗口是直接放置在桌面(DeskTop)上的那個窗口,每個應(yīng)用程序只能有一個主框架窗口。主框架窗口負(fù)責(zé)管理各個用戶交互對象并根據(jù)用戶操作相應(yīng)地創(chuàng)建或更新文檔窗口及其視圖。文檔窗口對SDI程序來說,和主框架窗口是一致的,主框架窗口就是文檔窗口;對于MDI程序,文檔窗口是主框架窗口的子窗口,如圖。文檔窗口一般都有相應(yīng)的可見邊框,它的客戶區(qū)(除了窗口標(biāo)題欄、邊框外的區(qū)域)是由相應(yīng)的視圖來構(gòu)成的,因此可以說視圖是文檔窗口內(nèi)的子窗口。文檔窗口時刻跟蹤當(dāng)前處于活動狀態(tài)的視圖的變化,并將用戶或系統(tǒng)產(chǎn)生的消息傳遞給當(dāng)前活動視圖。,,6.1框架窗口,6.1.2窗口狀態(tài)的改變MFCAppWizard為每個窗口設(shè)置了相應(yīng)的大小和位置。運行程序時,會自動調(diào)用框架內(nèi)部的WinMain函數(shù),并自動查找該應(yīng)用程序類的全局變量theApp,然后自動調(diào)用用戶應(yīng)用程序類的虛函數(shù)InitInstance,該函數(shù)會進(jìn)一步調(diào)用相應(yīng)的函數(shù)來完成主窗口的構(gòu)造和顯示工作,代碼:BOOLCEx_SDIApp::InitInstance(){…m_pMainWnd->ShowWindow(SW_SHOW);//顯示窗口m_pMainWnd->UpdateWindow();//更新窗口returnTRUE;}m_pMainWnd是主框架窗口指針變量,ShowWindow是CWnd類的成員函數(shù),用來按指定的參數(shù)顯示窗口。,6.1框架窗口,通過指定ShowWindow函數(shù)的參數(shù)值可以改變改變窗口顯示狀態(tài)。例如下面的代碼是將窗口的初始狀態(tài)設(shè)置為“最小化”:BOOLCEx_SDIApp::InitInstance(){...m_pMainWnd->ShowWindow(SW_SHOWMINIMIZED);m_pMainWnd->UpdateWindow();returnTRUE;},6.1框架窗口,6.1.3窗口風(fēng)格的設(shè)置窗口風(fēng)格通常有一般和擴(kuò)展兩種形式??稍诤瘮?shù)CWnd::Create或CWnd::CreateEx參數(shù)中指定,CreateEx函數(shù)可同時支持以上兩種風(fēng)格,CWnd::Create只能指定窗口的一般風(fēng)格??丶蛯υ捒虻拇翱陲L(fēng)格可直接通過其屬性對話框來設(shè)置。除了上述風(fēng)格外,框架窗口還有以下三個自己的風(fēng)格。它們都可以在PreCreateWindow重載函數(shù)的CREATESTRUCT結(jié)構(gòu)中指定。FWS_ADDTOTITLE該風(fēng)格指定相關(guān)的信息如文檔名添加到框架窗口標(biāo)題的后面。FWS_PREFIXTITLE該風(fēng)格使得框架窗口標(biāo)題中的文檔名顯示在應(yīng)用程序名之前。FWS_SNAPTOBARS該風(fēng)格用來調(diào)整窗口的大小,使它剛好包含了框架窗口中的控制欄。,6.1框架窗口,在MFCAppWizard中進(jìn)行修改[例Ex_SDI]在向?qū)е行薷拇翱陲L(fēng)格。(1)選擇“文件”?“新建”,選擇“工程”,選擇MFCAppWizard(exe)的項目類型,指定項目工作文件夾位置,輸入項目名Ex_SDI,單擊[確定]按鈕。(2)在向?qū)У牡谝徊街?,將?yīng)用程序類型選為“單個文檔”(SDI)。(3)單擊[下一個],如圖,可以選擇程序中是否加入數(shù)據(jù)庫的支持。(4)單擊[下一個],出現(xiàn)向?qū)У牡谌綄υ捒颍鐖D,允許在程序中加入復(fù)合文檔、自動化、ActiveX控件的支持。,,,6.1框架窗口,(5)單擊[下一個],如圖,對話框的前幾項依次確定對浮動工具條、打印與預(yù)覽以及通信網(wǎng)絡(luò)等特性的支持。對話框的最后兩項是最近文件列表數(shù)目的設(shè)置(默認(rèn)時為4)和一個[高級]按鈕。,,6.1框架窗口,(6)在第四步對話框中,單擊[高級],如圖,分別用于文檔模板字串資源內(nèi)容和窗口風(fēng)格的修改。,,6.1框架窗口,(7)單擊[關(guān)閉],單擊[下一個],如圖??蛇x擇:應(yīng)用程序的主窗口是MFC標(biāo)準(zhǔn)風(fēng)格還是窗口左邊有切分窗口的瀏覽器風(fēng)格,在源文件中是否加入注釋用來引導(dǎo)用戶編寫程序代碼,是使用動態(tài)鏈接庫(DLL)還是靜態(tài)鏈接庫。(8)單擊[下一個]按鈕,出現(xiàn)如圖6.9所示的對話框。在這里,用戶可以對MFCAppWizard提供的默認(rèn)類名、基類名、各個源文件名進(jìn)行修改。,,,6.1框架窗口,(9)單擊[完成],單擊[確定],回到主界面。在向?qū)е凶鞒龅倪x擇,有部分內(nèi)容反映在CEx_SDIApp::InitInstance函數(shù)中,代碼:BOOLCEx_SDIApp::InitInstance(){//若用戶在MFCAppWizard的第三步中,選中了“ActiveXControls”,//則表示所創(chuàng)建的應(yīng)用程序支持ActiveX控件AfxEnableControlContainer();//若用戶在MFCAppWizard的第四步中,選中了“3Dcontrols”//則表示所創(chuàng)建的應(yīng)用程序支持3D控件風(fēng)格#ifdef_AFXDLLEnable3dControls();//使用MFC動態(tài)鏈接庫的3D控件#elseEnable3dControlsStatic();//使用MFC靜態(tài)鏈接庫的3D控件#endif//在Windows系統(tǒng)注冊表中登記應(yīng)用程序的主鍵值,以便將一些與應(yīng)用程序//相關(guān)的參數(shù)存放在該主鍵值下SetRegistryKey(_T("LocalMFCAppWizard-GeneratedApplications"));//從注冊表中調(diào)入應(yīng)用程序的一些標(biāo)準(zhǔn)參數(shù)值,其中包括最近文件列表的文件名LoadStdProfileSettings();…returnTRUE;},6.1框架窗口,修改CREATESTRUCT結(jié)構(gòu)窗口創(chuàng)建前,自動調(diào)用PreCreateWindow虛函數(shù)。用MFCAppWizard創(chuàng)建文檔應(yīng)用程序結(jié)構(gòu)時,MFC已為主窗口或文檔窗口類自動重載了該虛函數(shù)??梢栽诖撕瘮?shù)中通過修改CREATESTRUCT結(jié)構(gòu)來設(shè)置窗口的絕大多數(shù)風(fēng)格。對于多文檔應(yīng)用程序,文檔窗口的風(fēng)格可用下列的代碼更改:BOOLCChildFrame::PreCreateWindow(CREATESTRUCT},6.1框架窗口,使用ModifyStyle和ModifyStyleExModifyStyleEx可更改窗口的擴(kuò)展風(fēng)格。兩個函數(shù)具有相同的參數(shù),含義。BOOLModifyXXXX(DWORDdwRemove,DWORDdwAdd,UINTnFlags=0);參數(shù)dwRemove指定需要刪除的風(fēng)格,dwAdd指定需要增加的風(fēng)格,nFlags表示SetWindowPos的標(biāo)志??蚣艽翱谠O(shè)定擴(kuò)展風(fēng)格只能通過調(diào)用ModifyStyle函數(shù)來進(jìn)行。例如用MFCClassWizard為一個多文檔應(yīng)用程序Ex_MDI的子文檔窗口類CChildFrame添加OnCreateClient消息處理,并增加下列代碼:BOOLCChildFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){ModifyStyle(0,WS_VSCROLL,0);returnCMDIChildWnd::OnCreateClient(lpcs,pContext);},,6.1框架窗口,6.1.4改變窗口的大小和位置CWnd類的成員函數(shù)SetWindowPos或MoveWindow可以改變窗口的大小和位置。SetWindowPos可以改變窗口的大小、位置,還可以改變所有窗口在堆棧排列的次序(Z次序),這個次序是根據(jù)它們在屏幕出現(xiàn)的先后來確定的。BOOLSetWindowPos(constCWnd*pWndInsertAfter,intx,inty,intcx,intcy,UINTnFlags);參數(shù)pWndInsertAfter表示窗口對象指針,下列預(yù)定義窗口對象的地址:wndBottom將窗口放置在Z次序中的底層wndTop將窗口放置在Z次序中的頂層wndTopMost設(shè)置最頂窗口wndNoTopMost將窗口放置在所有最頂層的后面,若此窗口不是最頂窗口,則此標(biāo)志無效。x和y表示窗口新的左上角坐標(biāo),cx和cy分別表示表示窗口新的寬度和高度,nFlags表示窗口新的大小和位置方式。,6.1框架窗口,函數(shù)CWnd::MoveWindow也可用來改變窗口的大小和位置,必須在MoveWindow函數(shù)中指定窗口的大小。voidMoveWindow(intx,inty,intnWidth,intnHeight,BOOLbRepaint=TRUE);voidMoveWindow(LPCRECTlpRect,BOOLbRepaint=TRUE);參數(shù)x和y表示窗口新的左上角坐標(biāo),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ù),用來獲取窗口在屏幕的位置和大小。,6.2菜單,許多程序員對于菜單的設(shè)計都遵循下列一些規(guī)則:l若選擇某菜單項會彈出一對話框,那么在該菜單項文本后有“…”。l若某項菜單有子菜單,那么在該菜單項文本后有“?”。l若菜單項需要助記符,用括號將帶下劃線的字母括起來。助記符與Alt構(gòu)成一個組合鍵,當(dāng)按住“Alt”鍵不放,敲擊該字母時,對應(yīng)的菜單項就會被選中。l若某項菜單需要快捷鍵的支持,則一般將其列在相應(yīng)菜單項文本之后。所謂“快捷鍵”是一個組合鍵,如Ctrl+N,使用時是先按下“Ctrl”健不放,然后再按“N”鍵。任何時候按下快捷鍵,相應(yīng)的菜單命令都會被執(zhí)行。,圖6.11菜單樣例子,6.2菜單,6.2.1更改應(yīng)用程序菜單菜單“文件”?“打開工作區(qū)”。在工作區(qū)中選擇ResourceView頁面,雙擊資源“Menu”中的IDR_MAINFRAME,通過菜單編輯器修改菜單資源IDR_MAINFRAME,可以為程序重新指定一個菜單,下面的示例過程:(1)打開前面的單文檔應(yīng)用程序Ex_SDI。(2)按快捷鍵Ctrl+R,在資源類型中選定“Menu”,如圖。(3)單擊[新建],如圖。,,,6.2菜單,(4)在Menu的ID_MENU1上右擊鼠標(biāo),選擇“Properties”命令,如圖,可以重新指定菜單資源ID,設(shè)置菜單資源的語言和條件,這個條件用來決定菜單資源包含到哪個環(huán)境中,例如當(dāng)指定條件為_DEBUG,則菜單資源只存在于Debug編譯環(huán)境中。(5)菜單ID_MENU1添加一個頂層彈出菜單項“測試(//使菜單對象和菜單句柄分離m_NewMenu.LoadMenu(IDR_MENU1);SetMenu(NULL);//清除應(yīng)用程序菜單SetMenu(}LoadMenu裝載菜單資源,Detach使菜單對象與菜單句柄分離。調(diào)用LoadMenu后,菜單對象m_NewMenu就擁有一個菜單句柄,再次調(diào)用LoadMenu時,發(fā)生運行時錯誤,當(dāng)菜單對象與菜單句柄分離后,就可以再創(chuàng)建菜單。SetMenu是CWnd類的一個成員函數(shù),用來設(shè)置應(yīng)用程序的菜單。(9)編譯運行并測試。,6.2菜單,6.2.2使用鍵盤快捷鍵通過上述的菜單系統(tǒng),可以選擇幾乎所有可用的命令和選項,保證了菜單命令系統(tǒng)的完整性,菜單系統(tǒng)操作效率不高。對于那些反復(fù)使用的命令,有必要進(jìn)一步提高效率,于是加速鍵應(yīng)運而生。一個加速鍵就是一個按鍵或幾個按鍵的組合,用于激活特定的命令。加速鍵也是一種資源。例如:為前面兩個菜單ID_VIEW_TEST和ID_TEST_RETURN定義鍵盤快捷鍵:(1)打開上例的工作區(qū)窗口中Accelerator的資源項,雙擊IDR_MAINFRAME,如圖。,,6.2菜單,(2)建立一新的加速鍵,雙擊加速鍵列表的最下端的空行,彈出如圖的“AccelProperities”(加速鍵屬性)對話框,可設(shè)置的屬性如表。,,6.2菜單,(3)選擇Ex_SDI添加的“顯示測試菜單”菜單項ID_VIEW_TEST作為要聯(lián)用的加速鍵的ID號,然后單擊[下一鍵]按鈕,并按下Ctrl+1作為此加速鍵的鍵值。(4)按同樣的方法,為菜單項ID_TEST_RETURN添加加速鍵Ctrl+2。需要說明的是,為了使其他用戶能查看并使用該加速鍵,還需在相應(yīng)的菜單項文本后面添加加速鍵內(nèi)容。例如,可將ID_VIEW_TEST菜單項的標(biāo)題改成“顯示測試菜單(//產(chǎn)生一個空菜單BOOLCreatePopupMenu();//產(chǎn)生一個空的彈出式子菜單裝入菜單資源需調(diào)用CMenu成員函數(shù)LoadMenu,再用SetMenu對應(yīng)用程序菜單進(jìn)行重新設(shè)置。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)信息。,6.2菜單,注意:l當(dāng)nFlags為MF_BYPOSITION時,nPosition表示新菜單項要插入的具體位置,為0時表示第一個菜單項,為-1時,將菜單項添加菜單的末尾處。lnFlags的標(biāo)志中,可以用“|”(按位或)來組合。有些組合是不允許的,例如MF_DISABLED、MF_ENABLED和MF_GRAYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位圖,MF_CHECKED和MF_UNCHECKED都不能組合在一起。l當(dāng)菜單項增加后,不管菜單依附的窗口是否改變,都應(yīng)調(diào)用CWnd::DrawMenuBar來更新菜單。,6.2菜單,刪除菜單項DeleteMenu函數(shù)可將菜單項刪除,注意:調(diào)用該函數(shù)后,不管菜單依附的窗口是否改變,都應(yīng)調(diào)用CWnd::DrawMenuBar使菜單更新。函數(shù)原型:BOOLDeleteMenu(UINTnPosition,UINTnFlags);nPosition表示要刪除菜單項位置,由nFlags進(jìn)行說明。nFlags為MF_BYCOMMAND時,nPosition表示菜單項ID號,nFlags為MF_BYPOSITION時,nPosition表示菜單項的位置。獲取菜單項下面四個CMenu成員函數(shù)分別獲得菜單的項數(shù)、菜單項的ID號、菜單項的文本內(nèi)容以及彈出式子菜單的句柄。UINTGetMenuItemCount()const;//用來獲得菜單的菜單項數(shù)。UINTGetMenuItemID(intnPos)const;//用來獲得由nPos指定菜單項位置的菜單項的標(biāo)識號。intGetMenuString(UINTnIDItem,CString//用來獲得指定菜單的彈出式菜單的菜單句柄。,6.2菜單,示例示例過程利用CMenu成員函數(shù)向應(yīng)用程序菜單中添加并處理一個菜單項:(1)打開前面的單文檔應(yīng)用程序Ex_SDI或重新創(chuàng)建。(2)“查看”菜單?“ResourceSymbols…”,如圖。(3)單擊[新建],如圖。在名字框中輸入標(biāo)識符ID_NEW_MENUITEM。在值框中輸入ID的值,單擊[確定]。,,,6.2菜單,(4)關(guān)閉“資源符號”對話框,在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;//關(guān)閉系統(tǒng)自動更新菜單狀態(tài)pSysMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);//激活菜單項DrawMenuBar();//更新菜單return0;},6.2菜單,(5)用MFCClassWizard處理OnCommand消息并檢測用戶菜單的nID參數(shù)。BOOLCMainFrame::OnCommand(WPARAMwParam,LPARAMlParam){//wParam的低字節(jié)表示菜單、控件、加速鍵的命令I(lǐng)Dif(LOWORD(wParam)==ID_NEW_MENUITEM)MessageBox("你選中了新的菜單項");returnCFrameWnd::OnCommand(wParam,lParam);}(6)編譯運行并測試。這樣當(dāng)選擇菜單“編輯”?“新的菜單項”命令后,就會彈一個對話框,顯示“你選中了新的菜單項”消息。,6.2菜單,6.2.4使用快捷菜單快捷菜單實現(xiàn)函數(shù)用資源編輯器和MFC庫的CMenu::TrackPopupMenu函數(shù)可以創(chuàng)建這樣的菜單,CMenu::TrackPopupMenu函數(shù)原型:BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);用來顯示一個浮動的彈出式菜單。nFlags表示菜單在屏幕顯示的位置以及鼠標(biāo)按鈕標(biāo)志,如表。x和y表示菜單的水平坐標(biāo)和菜單的頂端的垂直坐標(biāo)。pWnd表示彈出菜單的窗口,此窗口將收到菜單全部的WM_COMMAND消息。lpRect是一個RECT結(jié)構(gòu)或CRect對象指針,表示一個矩形區(qū)域,單擊這個區(qū)域時,彈出菜單不消失。lpRect為NULL時,在菜單外面單擊鼠標(biāo),菜單立刻消失。,6.2菜單,示例顯示主菜單IDR_MAINFRAME時,右擊鼠標(biāo)彈出“查看”菜單的子菜單,顯示菜單IDR_MENU1時,右擊鼠標(biāo)彈出“測試”菜單的子菜單。具體步驟:(1)打開前面的單文檔應(yīng)用程序Ex_SDI。(2)在CMainFrame類添加WM_CONTEXTMENU消息映射,函數(shù)代碼。voidCMainFrame::OnContextMenu(CWnd*pWnd,CPointpoint){CMenu*pSysMenu=GetMenu();//獲得程序菜單指針intnCount=pSysMenu->GetMenuItemCount();//獲得頂層菜單個數(shù)intnSubMenuPos=-1;for(inti=0;iGetMenuString(i,str,MF_BYPOSITION);if((str.Left(4)==“查看”)||(str.Left(4)==“測試”)){nSubMenuPos=i;break;}}if(nSubMenuPosGetSubMenu(nSubMenuPos)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);}(3)編譯運行并測試。,6.3工具欄,6.3.1使用工具欄編輯器創(chuàng)建一個新的工具欄按鈕雙擊新建的工具欄中最右端的空按鈕彈出屬性框,在ID框中輸入名稱,右端出現(xiàn)一個空按鈕。單擊該按鈕,在資源編輯器的工具按鈕設(shè)計窗口內(nèi)進(jìn)行編輯,這個編輯就是繪制一個工具按鈕的位圖。移動一個按鈕鼠標(biāo)左鍵點中它并拖動至相應(yīng)位置。如果用戶拖動它離開工具欄位置,則此按鈕從工具欄中消失。若在移動一個按鈕的同時,按下Ctrl鍵,則在新位置復(fù)制一個按鈕,新位置可以是同一個工具欄中的其他位置,也可以在不同的工具欄中。刪除一個按鈕將選取中的按鈕拖離工具欄就消失了。若選中按鈕,Delete鍵不能刪除,將按鈕中的圖形全部以背景色填充。在工具欄中插入空格如果按扭前沒有任何空格,拖動該按鈕向右移動并當(dāng)覆蓋相鄰按鈕的一半以上時,釋放鼠標(biāo)鍵,則此按鈕前出現(xiàn)空格。如果按鈕前有空格而按鈕后沒有空格,拖動該按鈕向左移動并當(dāng)按鈕的左邊界接觸到前面按鈕時,釋放鼠標(biāo)鍵,則此按鈕后將出現(xiàn)空格。如果按鈕前后均有空格,拖動該按鈕向右移動并當(dāng)接觸到相鄰按鈕時,則此按鈕前的空格保留,按鈕后的空格消失。相反,拖動該按鈕向左移動并當(dāng)接觸到前一個相鄰按鈕時,則此按鈕前面的空格消失,后面的空格保留。,6.3工具欄,工具欄按鈕屬性的設(shè)置,,6.3工具欄,6.3.2工具按鈕和菜單項相結(jié)合指選擇工具按鈕或菜單命令時,操作結(jié)果是一樣的。使它們結(jié)合的具體方法是在工具按鈕的屬性對話框中將按鈕的ID號設(shè)置為相關(guān)聯(lián)的菜單項ID。例如:示例是在前面Ex_SDI上進(jìn)行的,通過兩個工具按鈕分別顯示主菜單IDR_MAINFRAME和菜單IDR_MENU1。具體步驟:(1)打開前面的單文檔應(yīng)用程序Ex_SDI。(2)利用工具欄編輯器設(shè)計兩個工具按鈕,如圖。,,,6.3工具欄,(3)雙擊設(shè)計的第一個工具按鈕,將工具按鈕的ID號設(shè)為ID_TEST_RETURN,在提示框內(nèi)鍵入“返回應(yīng)用程序主菜單\n返回主菜單”。(4)雙擊設(shè)計的第二個工具按鈕,將工具按鈕的ID號設(shè)為ID_VEW_TEST,在提示框內(nèi)鍵入“顯示測試菜單\n顯示測試菜單”。(5)編譯運行并測試。將鼠標(biāo)移至設(shè)計的第一個工具按鈕處,這時在狀態(tài)欄上顯示出“返回應(yīng)用程序主菜單”信息,若稍等片刻后,還會彈出提示小窗口,顯示出“返回主菜單”字樣,如圖。單擊新添加的這兩個按鈕,會執(zhí)行相應(yīng)的菜單命令。,,6.3工具欄,6.3.3多個工具欄的使用操作步驟如下:(1)打開前面的單文檔應(yīng)用程序Ex_SDI。(2)將工作區(qū)切換到ResourceView,展開Toolbar(工具欄)資源,用鼠標(biāo)單擊IDR_MAINFRAME不松開,按Ctrl,將IDR_MAINFRAME拖到Toolbar資源名稱上。(3)右擊工具欄資源IDR_MAINFRAME1,選擇Properties命令,如圖。(4)雙擊IDR_TOOLBAR1,按圖刪除不要的工具按鈕。(5)在CMainFrame類中添加一個成員變量m_wndTestBar,變量類型為CToolBar。CToolBar類封裝了工具欄的操作。,,,6.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(!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(},6.3工具欄,(7)編譯運行,如圖。(8)需要調(diào)用CFrameWnd類的成員函數(shù)ShowControlBar來使程序一開始運行時隱藏工具欄IDR_TOOLBAR1。在CMainFrame::OnCreate中添加代碼:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){…ShowControlBar(},,6.3工具欄,(9)在CMainFrame::OnViewTest和CMainFrame::OnTestReturn中添加代碼:voidCMainFrame::OnViewTest(){…ShowControlBar(//顯示主工具欄}(10)編譯運行并測試,如圖,左邊開始運行的結(jié)果,右邊是單擊按鈕運行的結(jié)果。,,,6.4狀態(tài)欄,6.4.1狀態(tài)欄的定義AppWizard創(chuàng)建的SDI或MDI應(yīng)用程序框架中,有一個靜態(tài)的indicator數(shù)組,是在MainFrm.cpp文件中定義的,被MFC用作狀態(tài)欄的定義。數(shù)組中的元素是一些標(biāo)識常量或是字串資源的ID號。圖列出了indicators數(shù)組元素與標(biāo)準(zhǔn)狀態(tài)欄窗格的關(guān)系。,6.4狀態(tài)欄,6.4.2狀態(tài)欄的常用操作增加和減少窗格在狀態(tài)欄中增加信息行窗格,在indicators數(shù)組中增加一個ID_SEPARATOR標(biāo)識;在狀態(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)建一個默認(rèn)的單文檔應(yīng)用程序Ex_SDIMouse。(2)將工作區(qū)切換到ClassView頁面,展開CMainFrame,雙擊CMainFrame,在文檔窗口中出現(xiàn)該函數(shù)的定義,在它的前面就是狀態(tài)欄數(shù)組的定義。(3)將狀態(tài)欄indicators數(shù)組的定義改為下列代碼:staticUINTindicators[]={ID_SEPARATOR,ID_SEPARATOR,};,6.4狀態(tài)欄,(4)在CEx_SDIMouseView類中添加CMainFrame類的代碼。CEx_SDIMouseView::OnMouseMove代碼:voidCEx_SDIMouseView::OnMouseMove(UINTnFlags,CPointpoint){CStringstr;CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;//獲得主窗口指針CStatusBar*pStatus=},6.4狀態(tài)欄,(5)將MainFrm.h文件中的受保護(hù)變量m_wndStatusBar變成公共變量。(6)在Ex_SDIMouseView.cpp文件的開始處增加下列語句:#include"Ex_SDIMouseView.h"#include"MainFrm.h“(7)編譯并運行,如圖。,,6.4狀態(tài)欄,6.4.3改變狀態(tài)欄的風(fēng)格在MFC的CStatusBar類中,有兩個成員函數(shù)可以改變狀態(tài)欄風(fēng)格,它們是:voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);voidSetPaneStyle(intnIndex,UINTnStyle);參數(shù)nIndex表示要設(shè)置的狀態(tài)欄窗格的索引,nID為狀態(tài)欄窗格指定新的ID,cxWidth表示窗格的像素寬度,nStyle表示窗格的風(fēng)格類型,指定窗格的外觀,例如SBPS_POPOUT表示窗格是凸起來的,見表。,6.5交互對象的動態(tài)更新,在前面Ex_SDI基礎(chǔ)上,單擊工具按鈕,該按鈕被按下,按鈕彈起,單擊工具按鈕時,該按鈕被按下,按鈕彈起,如此反復(fù)。具體步驟:(1)打開上例的單文檔應(yīng)用程序項目Ex_SDI。(2)為CMainFrame添加一個BOOL型的成員變量m_bMainWork,將m_bMainWork的初值設(shè)為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);},6.5交互對象的動態(tài)更新,(4)在CMainFrame::OnViewTest和CMainFrame::OnTestReturn添加代碼:voidCMainFrame::OnViewTest(){…m_bMainWork=FALSE;}voidCMainFrame::OnTestReturn(){…m_bMainWork=TRUE;}(5)編譯運行并測試,如圖。,6.6圖標(biāo)和光標(biāo),6.6.1使用圖形編輯器創(chuàng)建一個新的圖標(biāo)或光標(biāo)創(chuàng)建應(yīng)用程序后,按快捷鍵Ctrl+R打開“插入資源”,選擇Cursor(光標(biāo))或Icon(圖標(biāo))資源類型,單擊[新建]。如圖。創(chuàng)建新圖標(biāo)或光標(biāo)的時,圖形編輯器先創(chuàng)建的是一個適合于VGA環(huán)境中的圖像,開始的時候它以屏幕色(透明方式)來填充。如表。,,新設(shè)備按鈕,6.6圖標(biāo)和光標(biāo),選用和定制顯示設(shè)備圖形編輯器上,有一個NewDeviceImage按鈕,單擊,如圖。單擊[定制],如圖。設(shè)置光標(biāo)熱點借助光標(biāo)“熱點”確定光標(biāo)實際的位置。如圖。,,,,設(shè)置熱點按鈕,6.6圖標(biāo)和光標(biāo),6.6.2圖標(biāo)圖標(biāo)的調(diào)入和清除CWinApp::LoadIcon可將一個圖標(biāo)資源調(diào)入并返回一個圖標(biāo)句柄。原型:HICONLoadIcon(LPCTSTRlpszResourceName)const;HICONLoadIcon(UINTnIDResource)const;不想創(chuàng)建新的圖標(biāo)資源,可使用預(yù)定義的標(biāo)準(zhǔn)圖標(biāo),調(diào)用CWinApp::LoadStandardIcon,原型:HICONLoadStandardIcon(LPCTSTRlpszIconName)const;lpszIconName可以是下列值之一:IDI_APPLICATION默認(rèn)的應(yīng)用程序圖標(biāo)IDI_HAND手形圖標(biāo)(用于嚴(yán)重警告)IDI_QUESTION問號圖標(biāo)(用于提示消息)IDI_EXCLAMATION警告消息圖標(biāo)(驚嘆號)IDI_ASTERISK消息圖標(biāo)DestroyIcon可以用來刪除一個圖標(biāo),釋放為圖標(biāo)分配的內(nèi)存,原型:BOOLDestroyIcon(HICONhIcon);hIcon用來指定要刪除的圖標(biāo)句柄。圖標(biāo)的繪制函數(shù)CDC::DrawIcon將一個圖標(biāo)繪制在指定的位置處,原型:BOOLDrawIcon(intx,inty,HICONhIcon);BOOLDrawIcon(POINTpoint,HICONhIcon);,6.6圖標(biāo)和光標(biāo),應(yīng)用程序圖標(biāo)的改變使用GetClassLong和SetClassLong重新指定應(yīng)用程序窗口的圖標(biāo),原型:DWORDSetClassLong(HWNDhWnd,intnIndex,LONGdwNewLong);DWORDGetClassLong(HWNDhWnd,intnIndex);hWnd用來指定窗口類句柄,dwNewLong用來指定新的32位值。nIndex用來指定與WNDCLASSEX結(jié)構(gòu)相關(guān)的索引,它可以是下列值之一:GCL_HBRBACKGROUND窗口類的背景畫刷句柄GCL_HCURSOR窗口類的的光標(biāo)句柄GCL_HICON窗口類的的圖標(biāo)句柄GCL_MENUNAME窗口類的的菜單資源名稱示例[例Ex_Icon]改變應(yīng)用程序圖標(biāo)。(1)用MFCAppWizard創(chuàng)建一個默認(rèn)的單文檔應(yīng)用程序Ex_Icon。(2)新添四個圖標(biāo)資源,通過圖像設(shè)備選擇對話框(參見圖6.32)。圖標(biāo)資源ID號分別為默認(rèn)的IDI_ICON1~IDI_ICON4。,6.6圖標(biāo)和光標(biāo),(3)用圖形編輯器繪制圖標(biāo),如圖。(4)CMainFrame類添加成員函數(shù)ChangeIcon。函數(shù)代碼:voidCMainFrame::ChangeIcon(UINTnIconID){HICONhIconNew=AfxGetApp()->LoadIcon(nIconID);HICONhIconOld=(HICON)GetClassLong(m_hWnd,GCL_HICON);if(hIconNew!=hIconOld){DestroyIcon(hIconOld);SetClassLong(m_hWnd,GCL_HICON,(long)hIconNew);RedrawWindow();//重繪窗口}},,6.6圖標(biāo)和光標(biāo),(5)在CMainFrame::OnCreate函數(shù)的最后添加計時器設(shè)置代碼:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;...SetTimer(1,500,NULL);return0;}(6)為CMainFrame類添加WM_TIMER的消息映射函數(shù),增加代碼:voidCMainFrame::OnTimer(UINTnIDEvent){staticinticons[]={IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4};staticintindex=0;ChangeIcon(icons[index]);index++;if(index>3)index=0;CFrameWnd::OnTimer(nIDEvent);},6.6圖標(biāo)和光標(biāo),(7)為CMainFrame類添加WM_DESTROY的消息映射函數(shù),增加代碼:voidCMainFrame::OnDestroy(){CFrameWnd::OnDestroy();KillTimer(1);}KillTimer函數(shù)是CWnd類成員函數(shù),用來停止WM_TIMER消息的傳送,其函數(shù)參數(shù)值用指定要停用的計時器標(biāo)識值。(8)編譯并運行。可以看到任務(wù)欄上的按鈕以及應(yīng)用程序的標(biāo)題欄上四個圖標(biāo)循環(huán)顯示的動態(tài)效果,顯示速度為每秒兩幀。,6.6圖標(biāo)和光標(biāo),6.6.3光標(biāo)使用系統(tǒng)光標(biāo)標(biāo)準(zhǔn)光標(biāo)可以使用CWinApp::LoadStandardCursor加載到程序中,函數(shù):HCURSORLoadStandardCursor(LPCTSTRlpszCursorName)const;lpszCursorName用來指定一個標(biāo)準(zhǔn)光標(biāo)名,可以是下列宏定義:IDC_ARROW標(biāo)準(zhǔn)箭頭光標(biāo)IDC_IBEAM標(biāo)準(zhǔn)文本輸入光標(biāo)IDC_WAIT漏斗型計時等待光標(biāo)IDC_CROSS十字形光標(biāo)IDC_UPARROW垂直箭頭光標(biāo)IDC_SIZEALL四向箭頭光標(biāo)IDC_SIZENWSE左上至右下的雙向箭頭光標(biāo)IDC_SIZENESW左下至右上的雙向箭頭光標(biāo)IDC_SIZEWE左右雙向箭頭光標(biāo)IDC_SIZENS上下雙向箭頭光標(biāo)使用光標(biāo)資源用編輯器創(chuàng)建或從外部調(diào)入的光標(biāo)資源,通過函數(shù)CWinApp::LoadCursor進(jìn)行加載,原型:HCURSORLoadCursor(LPCTSTRlpszResourceName)const;HCURSORLoadCursor(UINTnIDResource)const;,6.6圖標(biāo)和光標(biāo),更改程序中的光標(biāo)更改程序中的光標(biāo)最簡單的方法是MFCClassWizard映射WM_SETCURSOR消息,該消息是光標(biāo)移動到一個窗口內(nèi)并且還沒有捕捉到鼠標(biāo)時產(chǎn)生的。CWnd為此消息的映射函數(shù)定義這樣的原型:afx_msgBOOLOnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage);pWnd表示擁有光標(biāo)的窗口指針,nHitTest用來表示光標(biāo)所處的位置。message用來表示鼠標(biāo)消息。在OnSetCursor函數(shù)調(diào)用SetCursor來設(shè)置相應(yīng)的光標(biāo),并將OnSetCursor函數(shù)返回TRUE,就可改變當(dāng)前的光標(biāo)了。示例(1)打開前面的單文檔應(yīng)用程序Ex_Icon。(2)按Ctrl+R,打開“插入資源”對話框,選擇“Cursor”類型后,單擊[新建]。(3)圖形編輯器工作窗口的控制條上,單擊“NewDeviceImage”,單擊[定制]。(4)在彈出的“定制圖像”對話框中,保留默認(rèn)的大小和顏色數(shù),單擊[確定]。。(5)選擇“32x32,16colors”設(shè)備類型,單擊[確定]按鈕。(6)在“Device”組合框中,選擇“Monochrome[32x32]”,選擇“DeleteDeviceImage”命令,刪除“Monochrome[32x32]”類型。,6.6圖標(biāo)和光標(biāo),(7)用圖形編輯器繪制光標(biāo)圖形,指定光標(biāo)熱點位置為(15,15),如圖。,,6.6圖標(biāo)和光標(biāo),(8)為CMainFrame類添加成員變量m_hCursor,變量類型為光標(biāo)句柄HCURSOR。(9)為CMainFrame類添加WM_SETCURSOR的消息映射函數(shù),增加代碼:BOOLCMainFrame::OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage){BOOLbRes=CFrameWnd::OnSetCursor(pWnd,nHitTest,message);if(nHitTest==HTCAPTION){m_hCursor=LoadCursorFromFile("c:\\windows\\cursors\\globe.ani");SetCursor(m_hCursor);bRes=TRUE;}elseif(nHitTest==HTCLIENT){m_hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);SetCursor(m_hCursor);bRes=TRUE;}returnbRes;}(10)編譯運行并測試。當(dāng)鼠標(biāo)移動到標(biāo)題欄時,光標(biāo)變成了globe.ani的動畫光標(biāo),而當(dāng)移動到客戶區(qū)時,光標(biāo)變成了IDC_CURSOR1定義的形狀。,- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- vc 學(xué)習(xí) 教程 界面設(shè)計
鏈接地址:http://m.appdesigncorp.com/p-3201546.html