




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第6章框架窗口界面設(shè)計(jì)章框架窗口界面設(shè)計(jì) 6.16.1框架窗口框架窗口 6.26.2菜單菜單 6.36.3工具欄工具欄 6.46.4形狀欄形狀欄 6.56.5交互對(duì)象的動(dòng)態(tài)更新交互對(duì)象的動(dòng)態(tài)更新 6.66.6圖標(biāo)和光標(biāo)圖標(biāo)和光標(biāo) 6.16.1框架窗口框架窗口 6.1.1單文檔和多文檔程序框架窗口單文檔和多文檔程序框架窗口 文檔運(yùn)用程序的文檔運(yùn)用程序的MFC類構(gòu)造類構(gòu)造 如圖是單文檔運(yùn)用程序如圖是單文檔運(yùn)用程序Ex_SDI和多文檔運(yùn)用程序和多文檔運(yùn)用程序Ex_MDI的的MFC類類構(gòu)造。構(gòu)造。 CAboutDlg是每一個(gè)運(yùn)用程序框架都有的,用來(lái)顯示本程序的有關(guān)信息。CEx_SDIApp和CEx_
2、MDIApp是運(yùn)用程序類,是從CWinApp類派生而來(lái),擔(dān)任運(yùn)用程序創(chuàng)建、運(yùn)轉(zhuǎn)和終止,每一個(gè)運(yùn)用程序都需求這樣的類。CEx_SDIDoc和CEx_MDIDoc是文檔類,它們是從CDocument類派生而來(lái),擔(dān)任運(yùn)用程序文檔數(shù)據(jù)管理。CEx_SDIView和CEx_MDIView是視圖類,它們既可以從基類CView派生,也可以從CView派生類派生,擔(dān)任數(shù)據(jù)的顯示、繪制和其他用戶交互。CMainFrame類是用來(lái)?yè)?dān)任主框架窗口的顯示和管理,包括工具欄和形狀欄等界面元素的初始化。對(duì)于單文檔運(yùn)用程序來(lái)說(shuō),主框架窗口類是從CFrameWnd派生而來(lái)的,而對(duì)于多文檔運(yùn)用程序程序,主框架窗口是從CMDIF
3、rameWnd派生的。 6.16.1框架窗口框架窗口CChildFrame類是從CMDIChildWnd派生而來(lái),專門(mén)用來(lái)管理多文檔運(yùn)用程序中的文檔窗口。無(wú)論是CMDIChildWnd還是CMDIFrameWnd類,它們都是從CFrameWnd派生而來(lái)的。對(duì)于基于對(duì)話框的運(yùn)用程序,普通有CAboutDlg類、運(yùn)用程序類和對(duì)話框類。上述MFC類之間的承繼和派生關(guān)系如圖6.2所示。 圖6.2 MFC類的根本層次構(gòu)造CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWn
4、dCMiniFrameWnd6.16.1框架窗口框架窗口工程的文件組織工程的文件組織 工程中源文件都是采用文件夾的方式進(jìn)展管理的,將工程名作為文件夾工程中源文件都是采用文件夾的方式進(jìn)展管理的,將工程名作為文件夾名,此文件夾下包含源程序代碼文件、工程文件以及工程任務(wù)區(qū)文件等。每一名,此文件夾下包含源程序代碼文件、工程文件以及工程任務(wù)區(qū)文件等。每一個(gè)類的源代碼均保管同名的個(gè)類的源代碼均保管同名的h和和cpp文件。其他一些文件類型的含義:文件。其他一些文件類型的含義:.opt 關(guān)于開(kāi)發(fā)環(huán)境的參數(shù)文件,如工具關(guān)于開(kāi)發(fā)環(huán)境的參數(shù)文件,如工具條位置等信息條位置等信息 .aps(AppStudio File
5、)資源輔助文件,二進(jìn)制格式資源輔助文件,二進(jìn)制格式.clw ClassWizard信息文件信息文件.dsp(DeveloperStudio Project)工程文件工程文件.plg 編譯信息文件編譯信息文件.mdp(Microsoft DevStudio Project)舊版本的工程文件舊版本的工程文件.bsc 用于閱讀工程信息用于閱讀工程信息.map 執(zhí)行文件的映像信息紀(jì)錄文件執(zhí)行文件的映像信息紀(jì)錄文件.pch(Pre-Compiled File)預(yù)編譯文件,可以加快編譯速度,預(yù)編譯文件,可以加快編譯速度,但是文件非常大但是文件非常大.pdb(Program Database)記錄程序有關(guān)的
6、一些數(shù)據(jù)和調(diào)試信記錄程序有關(guān)的一些數(shù)據(jù)和調(diào)試信息息.ncb 無(wú)編譯閱讀文件無(wú)編譯閱讀文件(no compile browser) 還有相應(yīng)的還有相應(yīng)的Debug(調(diào)試調(diào)試)、Res(資源資源)等子文件夾。用運(yùn)用程序?qū)в蝿?chuàng)建工程時(shí),等子文件夾。用運(yùn)用程序?qū)в蝿?chuàng)建工程時(shí),系統(tǒng)自動(dòng)為工程創(chuàng)建系統(tǒng)自動(dòng)為工程創(chuàng)建Win32 Debug版本的運(yùn)轉(zhuǎn)程序,并運(yùn)用相應(yīng)的默許配置。版本的運(yùn)轉(zhuǎn)程序,并運(yùn)用相應(yīng)的默許配置。程序編連后,用于該工程的可執(zhí)行文件以及其他調(diào)試的信息文件都安放在程序編連后,用于該工程的可執(zhí)行文件以及其他調(diào)試的信息文件都安放在Debug文件夾中。文件夾中。 程序工程有一個(gè)程序工程有一個(gè)Win32
7、 Release版本,與版本,與Release的區(qū)別在于:的區(qū)別在于:Debug版本的運(yùn)版本的運(yùn)轉(zhuǎn)程序有相應(yīng)的調(diào)試信息碼,轉(zhuǎn)程序有相應(yīng)的調(diào)試信息碼,Release版本的運(yùn)轉(zhuǎn)程序沒(méi)有,但版本的運(yùn)轉(zhuǎn)程序沒(méi)有,但Release版本的版本的運(yùn)轉(zhuǎn)程序經(jīng)過(guò)代碼的優(yōu)化,其程序的運(yùn)轉(zhuǎn)效率被最大提升。運(yùn)轉(zhuǎn)程序經(jīng)過(guò)代碼的優(yōu)化,其程序的運(yùn)轉(zhuǎn)效率被最大提升。 選擇選擇“編譯編譯“配置菜單命令,在配置菜單命令,在“配置對(duì)話框?qū)⒐こ淘O(shè)置成配置對(duì)話框?qū)⒐こ淘O(shè)置成Win32 Release版本。版本。 6.16.1框架窗口框架窗口主框架窗口和文檔窗口主框架窗口和文檔窗口 主框架窗口是直接放置在桌面主框架窗口是直接放置在桌面(
8、DeskTop)上的那個(gè)窗口,上的那個(gè)窗口,每個(gè)運(yùn)用程序只能有一個(gè)主框架窗口。主框架窗口擔(dān)任每個(gè)運(yùn)用程序只能有一個(gè)主框架窗口。主框架窗口擔(dān)任管理各個(gè)用戶交互對(duì)象并根據(jù)用戶操作相應(yīng)地創(chuàng)建或更管理各個(gè)用戶交互對(duì)象并根據(jù)用戶操作相應(yīng)地創(chuàng)建或更新文檔窗口及其視圖。新文檔窗口及其視圖。 文檔窗口對(duì)文檔窗口對(duì)SDI程序來(lái)說(shuō),和主框架窗口是一致的,主框程序來(lái)說(shuō),和主框架窗口是一致的,主框架窗口就是文檔窗口;對(duì)于架窗口就是文檔窗口;對(duì)于MDI程序,文檔窗口是主框程序,文檔窗口是主框架窗口的子窗口,如圖。架窗口的子窗口,如圖。 文檔窗口普通都有相應(yīng)的可見(jiàn)邊框,它的客戶區(qū)文檔窗口普通都有相應(yīng)的可見(jiàn)邊框,它的客戶區(qū)
9、(除了窗除了窗口標(biāo)題欄、邊框外的區(qū)域口標(biāo)題欄、邊框外的區(qū)域)是由相應(yīng)的視圖來(lái)構(gòu)成的,因是由相應(yīng)的視圖來(lái)構(gòu)成的,因此可以說(shuō)視圖是文檔窗口內(nèi)的子窗口。文檔窗口時(shí)辰跟此可以說(shuō)視圖是文檔窗口內(nèi)的子窗口。文檔窗口時(shí)辰跟蹤當(dāng)前處于活動(dòng)形狀的視圖的變化,并將用戶或系統(tǒng)產(chǎn)蹤當(dāng)前處于活動(dòng)形狀的視圖的變化,并將用戶或系統(tǒng)產(chǎn)生的音訊傳送給當(dāng)前活動(dòng)視圖。生的音訊傳送給當(dāng)前活動(dòng)視圖。 6.16.1框架窗口框架窗口6.1.2窗口形狀的改動(dòng)窗口形狀的改動(dòng)MFC AppWizard為每個(gè)窗口設(shè)置了相應(yīng)的大小和位置。為每個(gè)窗口設(shè)置了相應(yīng)的大小和位置。運(yùn)轉(zhuǎn)程序時(shí),會(huì)自動(dòng)調(diào)用框架內(nèi)部的運(yùn)轉(zhuǎn)程序時(shí),會(huì)自動(dòng)調(diào)用框架內(nèi)部的WinMain
10、函數(shù),并自動(dòng)查找該函數(shù),并自動(dòng)查找該運(yùn)用程序類的全局變量運(yùn)用程序類的全局變量theApp,然后自動(dòng)調(diào)用用戶運(yùn)用程序類的虛,然后自動(dòng)調(diào)用用戶運(yùn)用程序類的虛函數(shù)函數(shù)InitInstance,該函數(shù)會(huì)進(jìn)一步伐用相應(yīng)的函數(shù)來(lái)完成主窗口的,該函數(shù)會(huì)進(jìn)一步伐用相應(yīng)的函數(shù)來(lái)完成主窗口的構(gòu)造和顯示任務(wù),代碼:構(gòu)造和顯示任務(wù),代碼:BOOL CEx_SDIApp:InitInstance()m_pMainWnd-ShowWindow(SW_SHOW);/ 顯示窗口顯示窗口m_pMainWnd-UpdateWindow();/ 更新窗口更新窗口return TRUE; m_pMainWnd是主框架窗口指針變量,是
11、主框架窗口指針變量,ShowWindow是是CWnd類的類的成員函數(shù),用來(lái)按指定的參數(shù)顯示窗口。成員函數(shù),用來(lái)按指定的參數(shù)顯示窗口。 6.16.1框架窗口框架窗口經(jīng)過(guò)指定ShowWindow函數(shù)的參數(shù)值可以改動(dòng)改動(dòng)窗口顯示形狀。例如下面的代碼是將窗口的初始形狀設(shè)置為“最小化:BOOL CEx_SDIApp:InitInstance().m_pMainWnd-ShowWindow(SW_SHOWMINIMIZED);m_pMainWnd-UpdateWindow();return TRUE; 6.16.1框架窗口框架窗口6.1.3窗口風(fēng)格的設(shè)置窗口風(fēng)格的設(shè)置 窗口風(fēng)格窗口風(fēng)格 通常有普通和擴(kuò)展兩
12、種方式??稍诤瘮?shù)通常有普通和擴(kuò)展兩種方式??稍诤瘮?shù)CWnd:Create或或CWnd:CreateEx參數(shù)中指定,參數(shù)中指定,CreateEx函數(shù)可同時(shí)支持以上兩種風(fēng)函數(shù)可同時(shí)支持以上兩種風(fēng)格,格,CWnd:Create只能指定窗口的普通風(fēng)格??丶蛯?duì)話框的窗口只能指定窗口的普通風(fēng)格。控件和對(duì)話框的窗口風(fēng)格可直接經(jīng)過(guò)其屬性對(duì)話框來(lái)設(shè)置。風(fēng)格可直接經(jīng)過(guò)其屬性對(duì)話框來(lái)設(shè)置。 除了上述風(fēng)格外,框架窗口還有以下三個(gè)本人的風(fēng)格。它們都可以在除了上述風(fēng)格外,框架窗口還有以下三個(gè)本人的風(fēng)格。它們都可以在PreCreateWindow重載函數(shù)的重載函數(shù)的CREATESTRUCT構(gòu)造中指定。構(gòu)造中指定。 FWS
13、_ADDTOTITLE該風(fēng)格指定相關(guān)的信息如文檔名添加到框架窗口標(biāo)題的后面。該風(fēng)格指定相關(guān)的信息如文檔名添加到框架窗口標(biāo)題的后面。 FWS_PREFIXTITLE 該風(fēng)格使得框架窗口標(biāo)題中的文檔名顯示在運(yùn)用程序名之前。該風(fēng)格使得框架窗口標(biāo)題中的文檔名顯示在運(yùn)用程序名之前。 FWS_SNAPTOBARS 該風(fēng)格用來(lái)調(diào)整窗口的大小,使它剛好包含了框架窗口中的控制欄。該風(fēng)格用來(lái)調(diào)整窗口的大小,使它剛好包含了框架窗口中的控制欄。 6.16.1框架窗口框架窗口在在MFC AppWizard中進(jìn)展修正中進(jìn)展修正 例例Ex_SDI 在導(dǎo)游中修正窗口風(fēng)格。在導(dǎo)游中修正窗口風(fēng)格。 (1)選擇選擇“文件文件“新建
14、,選擇新建,選擇“工程,選擇工程,選擇MFC AppWizard(exe)的工程類型,指定工程任務(wù)文件夾位置,輸入工程名的工程類型,指定工程任務(wù)文件夾位置,輸入工程名Ex_SDI,單擊,單擊確定確定按鈕。按鈕。(2) 在導(dǎo)游的第一步中,將運(yùn)用程序類型選為在導(dǎo)游的第一步中,將運(yùn)用程序類型選為“單個(gè)文檔單個(gè)文檔(SDI)。(3) 單擊單擊下一個(gè)下一個(gè),如圖,可以選擇程序中能否參與數(shù)據(jù)庫(kù)的支持。,如圖,可以選擇程序中能否參與數(shù)據(jù)庫(kù)的支持。(4)單擊單擊下一個(gè)下一個(gè),出現(xiàn)導(dǎo)游的第三步對(duì)話框,如圖,允許在程序中參,出現(xiàn)導(dǎo)游的第三步對(duì)話框,如圖,允許在程序中參與復(fù)合文檔、自動(dòng)化、與復(fù)合文檔、自動(dòng)化、Act
15、iveX控件的支持??丶闹С帧?6.16.1框架窗口框架窗口(5)單擊下一個(gè),如圖,對(duì)話框的前幾項(xiàng)依次確定對(duì)浮開(kāi)工具條、打印與預(yù)覽以及通訊網(wǎng)絡(luò)等特性的支持。對(duì)話框的最后兩項(xiàng)是最近文件列表數(shù)目的設(shè)置(默許時(shí)為4)和一個(gè)高級(jí)按鈕 。6.16.1框架窗口框架窗口(6)(6)在第四步對(duì)話框中,單擊在第四步對(duì)話框中,單擊 高級(jí)高級(jí) ,如圖,分別用于文檔,如圖,分別用于文檔模板字串資源內(nèi)容和窗口風(fēng)格模板字串資源內(nèi)容和窗口風(fēng)格的修正。的修正。 6.16.1框架窗口框架窗口(7)(7)單擊單擊 封鎖封鎖 ,單擊,單擊 下一個(gè)下一個(gè) ,如圖??蛇x擇:運(yùn)用程序的主窗口是,如圖??蛇x擇:運(yùn)用程序的主窗口是MFCM
16、FC規(guī)規(guī)范風(fēng)格還是窗口左邊有切分窗口的閱讀器風(fēng)格,在源文件中能否參與注釋用范風(fēng)格還是窗口左邊有切分窗口的閱讀器風(fēng)格,在源文件中能否參與注釋用來(lái)引導(dǎo)用戶編寫(xiě)程序代碼,是運(yùn)用動(dòng)態(tài)鏈接庫(kù)來(lái)引導(dǎo)用戶編寫(xiě)程序代碼,是運(yùn)用動(dòng)態(tài)鏈接庫(kù)(DLL)(DLL)還是靜態(tài)鏈接庫(kù)。還是靜態(tài)鏈接庫(kù)。(8)(8)單擊單擊 下一個(gè)下一個(gè) 按鈕,出現(xiàn)如圖按鈕,出現(xiàn)如圖6.96.9所示的對(duì)話框。在這里,用戶可以對(duì)所示的對(duì)話框。在這里,用戶可以對(duì)MFC AppWizardMFC AppWizard提供的默許類名、基類名、各個(gè)源文件名進(jìn)展修正。提供的默許類名、基類名、各個(gè)源文件名進(jìn)展修正。 6.16.1框架窗口框架窗口(9)(9)
17、單擊單擊 完成完成 ,單擊,單擊 確定確定 ,回到主界面。,回到主界面。在導(dǎo)游中作出的選擇,有部分內(nèi)容反映在在導(dǎo)游中作出的選擇,有部分內(nèi)容反映在CEx_SDIApp:InitInstanceCEx_SDIApp:InitInstance函數(shù)中,代碼:函數(shù)中,代碼:BOOL CEx_SDIApp:InitInstance()BOOL CEx_SDIApp:InitInstance()/ / 假設(shè)用戶在假設(shè)用戶在MFC AppWizardMFC AppWizard的第三步中,選中了的第三步中,選中了“ActiveX ControlsActiveX Controls,/ / 那么表示所創(chuàng)建的運(yùn)用程序
18、支持那么表示所創(chuàng)建的運(yùn)用程序支持ActiveXActiveX控件控件AfxEnableControlContainer();AfxEnableControlContainer(); / / 假設(shè)用戶在假設(shè)用戶在MFC AppWizardMFC AppWizard的第四步中,選中了的第四步中,選中了“3D controls3D controls/ / 那么表示所創(chuàng)建的運(yùn)用程序支持那么表示所創(chuàng)建的運(yùn)用程序支持3D3D控件風(fēng)格控件風(fēng)格#ifdef _AFXDLL#ifdef _AFXDLLEnable3dControls();Enable3dControls();/ / 運(yùn)用運(yùn)用MFCMFC動(dòng)態(tài)鏈接
19、庫(kù)的動(dòng)態(tài)鏈接庫(kù)的3D3D控件控件#else#elseEnable3dControlsStatic();Enable3dControlsStatic();/ / 運(yùn)用運(yùn)用MFCMFC靜態(tài)鏈接庫(kù)的靜態(tài)鏈接庫(kù)的3D3D控件控件#endif#endif/ / 在在WindowsWindows系統(tǒng)注冊(cè)表中登記運(yùn)用程序的主鍵值,以便將一些與運(yùn)用程序系統(tǒng)注冊(cè)表中登記運(yùn)用程序的主鍵值,以便將一些與運(yùn)用程序/ / 相關(guān)的參數(shù)存放在該主鍵值下相關(guān)的參數(shù)存放在該主鍵值下SetRegistryKey(_T(Local MFC AppWizard-Generated Applications);SetRegistryK
20、ey(_T(Local MFC AppWizard-Generated Applications);/ / 從注冊(cè)表中調(diào)入運(yùn)用程序的一些規(guī)范參數(shù)值,其中包括最近文件列表的文件名從注冊(cè)表中調(diào)入運(yùn)用程序的一些規(guī)范參數(shù)值,其中包括最近文件列表的文件名LoadStdProfileSettings(); LoadStdProfileSettings(); return TRUE;return TRUE; 6.16.1框架窗口框架窗口修正修正CREATESTRUCT構(gòu)造構(gòu)造 窗口創(chuàng)建前,自動(dòng)調(diào)用窗口創(chuàng)建前,自動(dòng)調(diào)用PreCreateWindow虛函數(shù)。用虛函數(shù)。用MFC AppWizard創(chuàng)建文檔運(yùn)用程序
21、構(gòu)造時(shí),創(chuàng)建文檔運(yùn)用程序構(gòu)造時(shí),MFC已為主窗口或文檔窗口已為主窗口或文檔窗口類自動(dòng)重載了該虛函數(shù)??梢栽诖撕瘮?shù)中經(jīng)過(guò)修正類自動(dòng)重載了該虛函數(shù)??梢栽诖撕瘮?shù)中經(jīng)過(guò)修正CREATESTRUCT構(gòu)造來(lái)設(shè)置窗口的絕大多數(shù)風(fēng)格。構(gòu)造來(lái)設(shè)置窗口的絕大多數(shù)風(fēng)格。對(duì)于多文檔運(yùn)用程序,文檔窗口的風(fēng)格可用以下的代碼更改:對(duì)于多文檔運(yùn)用程序,文檔窗口的風(fēng)格可用以下的代碼更改:BOOL CChildFrame:PreCreateWindow(CREATESTRUCT& cs) / 創(chuàng)建不含有創(chuàng)建不含有最大化最大化按鈕的子窗口按鈕的子窗口cs.style &= WS_MAXIMIZEBOX; / 調(diào)用
22、基類的調(diào)用基類的PreCreateWindow函數(shù)函數(shù)return CMDIChildWnd:PreCreateWindow(cs); 6.16.1框架窗口框架窗口運(yùn)用運(yùn)用ModifyStyle和和ModifyStyleEx ModifyStyleEx可更改窗口的擴(kuò)展風(fēng)格。兩個(gè)函數(shù)具有一樣的參數(shù),含可更改窗口的擴(kuò)展風(fēng)格。兩個(gè)函數(shù)具有一樣的參數(shù),含義。義。BOOL ModifyXXXX( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );參數(shù)參數(shù)dwRemove 指定需求刪除的風(fēng)格,指定需求刪除的風(fēng)格,dwAdd指定需求添加的風(fēng)指定需求添加的風(fēng)格,格,
23、nFlags表示表示SetWindowPos的標(biāo)志。的標(biāo)志。 框架窗口設(shè)定擴(kuò)展風(fēng)格只能經(jīng)過(guò)調(diào)用框架窗口設(shè)定擴(kuò)展風(fēng)格只能經(jīng)過(guò)調(diào)用ModifyStyle函數(shù)來(lái)進(jìn)展。例如用函數(shù)來(lái)進(jìn)展。例如用MFC ClassWizard為一個(gè)多文檔運(yùn)用程序?yàn)橐粋€(gè)多文檔運(yùn)用程序Ex_MDI的子文檔窗口類的子文檔窗口類CChildFrame添加添加OnCreateClient音訊處置,并添加以下代碼:音訊處置,并添加以下代碼:BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) ModifyStyle(0, WS_V
24、SCROLL, 0);return CMDIChildWnd:OnCreateClient(lpcs, pContext); 6.16.1框架窗口框架窗口6.1.4改動(dòng)窗口的大小和位置改動(dòng)窗口的大小和位置CWnd類的成員函數(shù)類的成員函數(shù)SetWindowPos或或MoveWindow可以改動(dòng)窗口的可以改動(dòng)窗口的大小和位置。大小和位置。SetWindowPos可以改動(dòng)窗口的大小、位置,還可以改可以改動(dòng)窗口的大小、位置,還可以改動(dòng)一切窗口在堆棧陳列的次序動(dòng)一切窗口在堆棧陳列的次序(Z次序次序),這個(gè)次序是根據(jù)它們?cè)谄聊唬@個(gè)次序是根據(jù)它們?cè)谄聊怀霈F(xiàn)的先后來(lái)確定的。出現(xiàn)的先后來(lái)確定的。BOOL Se
25、tWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );參數(shù)參數(shù)pWndInsertAfter表示窗口對(duì)象指針,以下預(yù)定義窗口表示窗口對(duì)象指針,以下預(yù)定義窗口對(duì)象的地址:對(duì)象的地址:wndBottom將窗口放置在將窗口放置在Z次序中的底層次序中的底層wndTop 將窗口放置在將窗口放置在Z次序中的頂層次序中的頂層wndTopMost 設(shè)置最頂窗口設(shè)置最頂窗口wndNoTopMost 將窗口放置在一切最頂層的后面,假設(shè)此窗口將窗口放置在一切最頂層的后面,假設(shè)此窗口不是最頂窗口,那么此
26、標(biāo)志無(wú)效。不是最頂窗口,那么此標(biāo)志無(wú)效。x和和y表示窗口新的左上角坐標(biāo),表示窗口新的左上角坐標(biāo),cx和和cy分別表示表示窗口新的寬度和分別表示表示窗口新的寬度和高度,高度,nFlags表示窗口新的大小和位置方式。表示窗口新的大小和位置方式。 6.16.1框架窗口框架窗口 函數(shù)CWnd:MoveWindow也可用來(lái)改動(dòng)窗口的大小和位置,必需在MoveWindow函數(shù)中指定窗口的大小。void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );void MoveWindow( LPCRECT lpRe
27、ct, BOOL bRepaint = TRUE );參數(shù)x和y表示窗口新的左上角坐標(biāo),nWidth和nHeight表示窗口新的寬度和高度,bRepaint用于指定窗口能否重繪,lpRect表示窗口新的大小和位置。 例如,在CEx_SDIApp:InitInstance中return TRUE語(yǔ)句之前添加以下代碼,可以使主框架窗口挪動(dòng)到屏幕的(100,100)處:/ 假設(shè)運(yùn)用SetWindowPos函數(shù),那么可以有m_pMainWnd-SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOZORDER);/ 或運(yùn)用MoveWindow函數(shù),那么有CRec
28、t rcWindow;m_pMainWnd-GetWindowRect(rcWindow);m_pMainWnd-MoveWindow(100,100,rcWindow.Width(),rcWindow.Height(),TRUE);CRect是一個(gè)矩形類,GetWindowRect是一個(gè)CWnd類的成員函數(shù),用來(lái)獲取窗口在屏幕的位置和大小。 6.2菜單菜單 許多程序員對(duì)于菜單的設(shè)計(jì)都遵照以下一些規(guī)那么:l 假設(shè)選擇某菜單項(xiàng)會(huì)彈出一對(duì)話框,那么在該菜單項(xiàng)文本后有“。l 假設(shè)某項(xiàng)菜單有子菜單,那么在該菜單項(xiàng)文本后有“。l 假設(shè)菜單項(xiàng)需求助記符,用括號(hào)將帶下劃線的字母括起來(lái)。助記符與Alt構(gòu)成一個(gè)
29、組合鍵,當(dāng)按住“Alt鍵不放,敲擊該字母時(shí),對(duì)應(yīng)的菜單項(xiàng)就會(huì)被選中。l 假設(shè)某項(xiàng)菜單需求快捷鍵的支持,那么普通將其列在相應(yīng)菜單項(xiàng)文本之后。所謂“快捷鍵是一個(gè)組合鍵,如Ctrl+N,運(yùn)用時(shí)是先按下“Ctrl健不放,然后再按“N鍵。任何時(shí)候按下快捷鍵,相應(yīng)的菜單命令都會(huì)被執(zhí)行。 圖6.11 菜單樣例子 6.2菜單菜單6.2.1更改運(yùn)用程序菜單更改運(yùn)用程序菜單 菜單菜單“文件文件“翻開(kāi)任務(wù)區(qū)。在任務(wù)區(qū)中選擇翻開(kāi)任務(wù)區(qū)。在任務(wù)區(qū)中選擇ResourceView頁(yè)面,頁(yè)面,雙擊資源雙擊資源“Menu中的中的IDR_MAINFRAME,經(jīng)過(guò)菜單編輯器修正菜,經(jīng)過(guò)菜單編輯器修正菜單資源單資源IDR_MAINF
30、RAME ,可以為程序重新指定一個(gè)菜單,下面,可以為程序重新指定一個(gè)菜單,下面的例如過(guò)程:的例如過(guò)程:(1) 翻開(kāi)前面的單文檔運(yùn)用程序翻開(kāi)前面的單文檔運(yùn)用程序Ex_SDI。(2) 按快捷鍵按快捷鍵Ctrl+R,在資源類型中選定,在資源類型中選定“Menu,如圖。,如圖。 (3) 單擊單擊新建新建,如圖。,如圖。 6.2菜單菜單(4)(4)在在MenuMenu的的ID_MENU1ID_MENU1上右擊鼠標(biāo),選擇上右擊鼠標(biāo),選擇“PropertiesProperties命令,如圖,可以重命令,如圖,可以重新指定菜單資源新指定菜單資源IDID,設(shè)置菜單資源的言語(yǔ)和條件,這個(gè)條件用來(lái)決議菜單資,設(shè)置菜
31、單資源的言語(yǔ)和條件,這個(gè)條件用來(lái)決議菜單資源包含到哪個(gè)環(huán)境中,例如當(dāng)指定條件為源包含到哪個(gè)環(huán)境中,例如當(dāng)指定條件為_(kāi)DEBUG_DEBUG,那么菜單資源只存在于,那么菜單資源只存在于DebugDebug編譯環(huán)境中。編譯環(huán)境中。 (5)(5)菜單菜單ID_MENU1ID_MENU1添加一個(gè)頂層彈出菜單項(xiàng)添加一個(gè)頂層彈出菜單項(xiàng)“測(cè)試測(cè)試(&T)(&T),并在該菜單下添加,并在該菜單下添加一個(gè)子菜單項(xiàng)一個(gè)子菜單項(xiàng)“前往前往(&R)(&R),IDID設(shè)為設(shè)為ID_TEST_RETURNID_TEST_RETURN,如圖。,如圖。 (6)(6)翻開(kāi)翻開(kāi)Ex_SDIEx_S
32、DI程序菜單資源程序菜單資源IDR_MAINFRAMEIDR_MAINFRAME,在,在“查看菜單的最后添加一查看菜單的最后添加一個(gè)子菜單項(xiàng)個(gè)子菜單項(xiàng)“顯示測(cè)試菜單顯示測(cè)試菜單(&M)(&M),IDID設(shè)為設(shè)為ID_VIEW_TESTID_VIEW_TEST。(7)(7)為為CMainFrameCMainFrame類添加一個(gè)類添加一個(gè)CMenuCMenu類型的成員變量類型的成員變量m_NewMenum_NewMenu,CMenuCMenu類是用類是用來(lái)處置菜單的一個(gè)來(lái)處置菜單的一個(gè)MFCMFC類。類。 6.2菜單菜單(8)(8)按快捷鍵按快捷鍵Ctrl+WCtrl+W,切換到,
33、切換到Message MapsMessage Maps頁(yè)面,從頁(yè)面,從“Class nameClass name列表中選擇列表中選擇CMainFrameCMainFrame,分別為菜單項(xiàng),分別為菜單項(xiàng)ID_VIEW_TESTID_VIEW_TEST和和ID_TEST_RETURNID_TEST_RETURN添加添加COMMANDCOMMAND音訊音訊映射,運(yùn)用默許的音訊映射函數(shù)名,并添中以下代碼:映射,運(yùn)用默許的音訊映射函數(shù)名,并添中以下代碼:void CMainFrame:OnViewTest() void CMainFrame:OnViewTest() m_NewMenu.Detach()
34、;m_NewMenu.Detach();/ / 使菜單對(duì)象和菜單句柄分別使菜單對(duì)象和菜單句柄分別m_NewMenu.LoadMenu( IDR_MENU1 ); m_NewMenu.LoadMenu( IDR_MENU1 ); SetMenu(NULL); SetMenu(NULL); / / 去除運(yùn)用程序菜單去除運(yùn)用程序菜單SetMenu( &m_NewMenu ); SetMenu( &m_NewMenu ); / / 設(shè)置運(yùn)用程序菜單設(shè)置運(yùn)用程序菜單 void CMainFrame:OnTestReturn() void CMainFrame:OnTestReturn()
35、 m_NewMenu.Detach();m_NewMenu.Detach();m_NewMenu.LoadMenu( IDR_MAINFRAME );m_NewMenu.LoadMenu( IDR_MAINFRAME );SetMenu(NULL);SetMenu(NULL);SetMenu( &m_NewMenu );SetMenu( &m_NewMenu ); LoadMenuLoadMenu裝載菜單資源,裝載菜單資源,DetachDetach使菜單對(duì)象與菜單句柄分別。調(diào)用使菜單對(duì)象與菜單句柄分別。調(diào)用LoadMenuLoadMenu后,后,菜單對(duì)象菜單對(duì)象m_NewMen
36、um_NewMenu就擁有一個(gè)菜單句柄,再次調(diào)用就擁有一個(gè)菜單句柄,再次調(diào)用LoadMenuLoadMenu時(shí),發(fā)生運(yùn)轉(zhuǎn)時(shí)時(shí),發(fā)生運(yùn)轉(zhuǎn)時(shí)錯(cuò)誤,當(dāng)菜單對(duì)象與菜單句柄分別后,就可以再創(chuàng)建菜單。錯(cuò)誤,當(dāng)菜單對(duì)象與菜單句柄分別后,就可以再創(chuàng)建菜單。SetMenuSetMenu是是CWndCWnd類類的一個(gè)成員函數(shù),用來(lái)設(shè)置運(yùn)用程序的菜單。的一個(gè)成員函數(shù),用來(lái)設(shè)置運(yùn)用程序的菜單。(9)(9)編譯運(yùn)轉(zhuǎn)并測(cè)試。編譯運(yùn)轉(zhuǎn)并測(cè)試。 6.2菜單菜單6.2.2運(yùn)用鍵盤(pán)快捷鍵運(yùn)用鍵盤(pán)快捷鍵 經(jīng)過(guò)上述的菜單系統(tǒng),可以選擇幾乎一切可用的命令和選項(xiàng),保證了經(jīng)過(guò)上述的菜單系統(tǒng),可以選擇幾乎一切可用的命令和選項(xiàng),保證了菜單命令
37、系統(tǒng)的完好性,菜單系統(tǒng)操作效率不高。對(duì)于那些反復(fù)運(yùn)菜單命令系統(tǒng)的完好性,菜單系統(tǒng)操作效率不高。對(duì)于那些反復(fù)運(yùn)用的命令,有必要進(jìn)一步提高效率,于是加速鍵應(yīng)運(yùn)而生。用的命令,有必要進(jìn)一步提高效率,于是加速鍵應(yīng)運(yùn)而生。 一個(gè)加速鍵就是一個(gè)按鍵或幾個(gè)按鍵的組合,用于激活特定的命令。一個(gè)加速鍵就是一個(gè)按鍵或幾個(gè)按鍵的組合,用于激活特定的命令。加速鍵也是一種資源。加速鍵也是一種資源。 例如:為前面兩個(gè)菜單例如:為前面兩個(gè)菜單ID_VIEW_TEST和和ID_TEST_RETURN定義鍵定義鍵盤(pán)快捷鍵:盤(pán)快捷鍵:(1)翻開(kāi)上例的任務(wù)區(qū)窗口中翻開(kāi)上例的任務(wù)區(qū)窗口中Accelerator的資源項(xiàng),雙擊的資源項(xiàng),
38、雙擊IDR_MAINFRAME,如圖。,如圖。 6.2菜單菜單(2)(2)建立一新的加速鍵,雙擊加速鍵列表的最下端的空行,彈出如圖的建立一新的加速鍵,雙擊加速鍵列表的最下端的空行,彈出如圖的“Accel ProperitiesAccel Properities( (加速鍵屬性加速鍵屬性) )對(duì)話框,可設(shè)置的屬性如表。對(duì)話框,可設(shè)置的屬性如表。 6.2菜單菜單(3)(3)選擇選擇Ex_SDIEx_SDI添加的添加的“顯示測(cè)試菜單菜單項(xiàng)顯示測(cè)試菜單菜單項(xiàng)ID_VIEW_TESTID_VIEW_TEST作為要聯(lián)用的加速作為要聯(lián)用的加速鍵的鍵的IDID號(hào),然后單擊號(hào),然后單擊 下一鍵下一鍵 按鈕,并按
39、下按鈕,并按下Ctrl+1Ctrl+1作為此加速鍵的鍵值。作為此加速鍵的鍵值。(4)(4)按同樣的方法,為菜單項(xiàng)按同樣的方法,為菜單項(xiàng)ID_TEST_RETURNID_TEST_RETURN添加加速鍵添加加速鍵Ctrl+2Ctrl+2。需求闡明的是,。需求闡明的是,為了使其他用戶能查看并運(yùn)用該加速鍵,還需在相應(yīng)的菜單項(xiàng)文本后面添加為了使其他用戶能查看并運(yùn)用該加速鍵,還需在相應(yīng)的菜單項(xiàng)文本后面添加加速鍵內(nèi)容。例如,可將加速鍵內(nèi)容。例如,可將ID_VIEW_TESTID_VIEW_TEST菜單項(xiàng)的標(biāo)題改成菜單項(xiàng)的標(biāo)題改成“顯示測(cè)試菜單顯示測(cè)試菜單(&M)tCtrl+1(&M)tCt
40、rl+1,其中,其中“tt是將后面的是將后面的“Ctrl+1Ctrl+1定位到一個(gè)程度制表位。定位到一個(gè)程度制表位。(5)(5)編譯運(yùn)轉(zhuǎn)并測(cè)試。當(dāng)程序運(yùn)轉(zhuǎn)后,按編譯運(yùn)轉(zhuǎn)并測(cè)試。當(dāng)程序運(yùn)轉(zhuǎn)后,按“Ctrl+1Ctrl+1和和“Ctrl+2Ctrl+2將執(zhí)行相應(yīng)的菜將執(zhí)行相應(yīng)的菜單命令。單命令。 6.2菜單菜單6.2.3菜單的編程控制菜單的編程控制 創(chuàng)建菜單創(chuàng)建菜單 CreateMenu和和CreatePopupMenu用來(lái)創(chuàng)建一個(gè)菜單或子菜單框架,原型:用來(lái)創(chuàng)建一個(gè)菜單或子菜單框架,原型:BOOL CreateMenu( );/ 產(chǎn)生一個(gè)空菜單產(chǎn)生一個(gè)空菜單BOOL CreatePopupMen
41、u( );/ 產(chǎn)生一個(gè)空的彈出式子菜單產(chǎn)生一個(gè)空的彈出式子菜單 裝入菜單資源裝入菜單資源 需調(diào)用需調(diào)用CMenu成員函數(shù)成員函數(shù)LoadMenu,再用,再用SetMenu對(duì)運(yùn)用程序菜單進(jìn)展重新設(shè)對(duì)運(yùn)用程序菜單進(jìn)展重新設(shè)置。置。BOOL LoadMenu( LPCTSTR lpszResourceName );BOOL LoadMenu( UINT nIDResource );lpszResourceName為菜單資源稱號(hào),為菜單資源稱號(hào),nIDResource為菜單資源為菜單資源ID號(hào)。號(hào)。 添加菜單項(xiàng)添加菜單項(xiàng) 可以調(diào)用可以調(diào)用AppendMenu或或InsertMenu函數(shù)來(lái)添加菜單項(xiàng)。函
42、數(shù)來(lái)添加菜單項(xiàng)。AppendMenu是將菜是將菜單項(xiàng)添加在菜單的末尾處,單項(xiàng)添加在菜單的末尾處,InsertMenu在指定位置處插入菜單項(xiàng),將后面的菜在指定位置處插入菜單項(xiàng),將后面的菜單項(xiàng)依次下移。單項(xiàng)依次下移。BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL );BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );BOOL InsertMenu( UINT nPosition, UINT nFlags,
43、UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );nIDNewItem表示新菜單項(xiàng)的表示新菜單項(xiàng)的ID號(hào),號(hào),lpszNewItem表示新菜單項(xiàng)的內(nèi)容,表示新菜單項(xiàng)的內(nèi)容,pBmp用于菜單項(xiàng)的位圖指針,用于菜單項(xiàng)的位圖指針,nPosition表示新菜單項(xiàng)要插入的菜單項(xiàng)位置。表示新菜單項(xiàng)要插入的菜單項(xiàng)位置。nFlags表示要添加的新菜單項(xiàng)的形狀信息。表示要添加的新菜單項(xiàng)的形狀信息
44、。 6.2菜單菜單留意:l 當(dāng)nFlags為MF_BYPOSITION時(shí),nPosition表示新菜單項(xiàng)要插入的詳細(xì)位置,為0時(shí)表示第一個(gè)菜單項(xiàng),為 -1時(shí),將菜單項(xiàng)添加菜單的末尾處。l nFlags的標(biāo)志中,可以用“|(按位或)來(lái)組合。有些組合是不允許的,例如MF_DISABLED、MF_ENABLED和MF_GRAYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位圖,MF_CHECKED和MF_UNCHECKED 都不能組合在一同。l當(dāng)菜單項(xiàng)添加后,不論菜單依靠的窗口能否改動(dòng),都應(yīng)調(diào)用CWnd:DrawMenuBar來(lái)更新菜單。 6.2菜單菜單刪除菜單項(xiàng)刪除
45、菜單項(xiàng) DeleteMenu函數(shù)可將菜單項(xiàng)刪除,留意:調(diào)用該函數(shù)后,不論菜單依函數(shù)可將菜單項(xiàng)刪除,留意:調(diào)用該函數(shù)后,不論菜單依靠的窗口能否改動(dòng),都應(yīng)調(diào)用靠的窗口能否改動(dòng),都應(yīng)調(diào)用CWnd:DrawMenuBar使菜單更新。函數(shù)原型:使菜單更新。函數(shù)原型:BOOL DeleteMenu( UINT nPosition, UINT nFlags );nPosition表示要?jiǎng)h除菜單項(xiàng)位置,由表示要?jiǎng)h除菜單項(xiàng)位置,由nFlags進(jìn)展闡明。進(jìn)展闡明。nFlags為為MF_BYCOMMAND時(shí),時(shí),nPosition表示菜單項(xiàng)表示菜單項(xiàng)ID號(hào),號(hào),nFlags為為MF_BYPOSITION時(shí),時(shí),nP
46、osition表示菜單項(xiàng)的位置。表示菜單項(xiàng)的位置。 獲取菜單項(xiàng)獲取菜單項(xiàng) 下面四個(gè)下面四個(gè)CMenu成員函數(shù)分別獲得菜單的項(xiàng)數(shù)、菜單項(xiàng)的成員函數(shù)分別獲得菜單的項(xiàng)數(shù)、菜單項(xiàng)的ID號(hào)、菜單號(hào)、菜單項(xiàng)的文本內(nèi)容以及彈出式子菜單的句柄。項(xiàng)的文本內(nèi)容以及彈出式子菜單的句柄。UINT GetMenuItemCount( ) const;/用來(lái)獲得菜單的菜單項(xiàng)數(shù)。用來(lái)獲得菜單的菜單項(xiàng)數(shù)。UINT GetMenuItemID( int nPos ) const;/用來(lái)獲得由用來(lái)獲得由nPos指定菜單項(xiàng)指定菜單項(xiàng)位置的菜單項(xiàng)的標(biāo)識(shí)號(hào)。位置的菜單項(xiàng)的標(biāo)識(shí)號(hào)。int GetMenuString( UINT nIDI
47、tem, CString& rString, UINT nFlags ) const;/獲得由獲得由nIDItem指定菜單項(xiàng)位置的菜單項(xiàng)的文本內(nèi)容,由指定菜單項(xiàng)位置的菜單項(xiàng)的文本內(nèi)容,由rString參數(shù)前往,參數(shù)前往,nFlags為為MF_BYPOSITION時(shí),時(shí),nPosition表示菜單項(xiàng)的位表示菜單項(xiàng)的位置。置。CMenu* GetSubMenu( int nPos ) const;/用來(lái)獲得指定菜單的彈用來(lái)獲得指定菜單的彈出式菜單的菜單句柄。出式菜單的菜單句柄。 6.2菜單菜單例如例如 例如過(guò)程利用例如過(guò)程利用CMenu成員函數(shù)向運(yùn)用程序菜單中添加并處置一個(gè)菜單項(xiàng):成員函數(shù)
48、向運(yùn)用程序菜單中添加并處置一個(gè)菜單項(xiàng):(1) 翻開(kāi)前面的單文檔運(yùn)用程序翻開(kāi)前面的單文檔運(yùn)用程序Ex_SDI或重新創(chuàng)建?;蛑匦聞?chuàng)建。(2) “查看菜單查看菜單“Resource Symbols,如圖。,如圖。(3) 單擊單擊新建新建,如圖。在名字框中輸入標(biāo)識(shí)符,如圖。在名字框中輸入標(biāo)識(shí)符ID_NEW_MENUITEM。在。在值框中輸入值框中輸入ID的值,單擊的值,單擊確定確定。 6.2菜單菜單(4) (4) 封鎖封鎖“資源符號(hào)對(duì)話框,在資源符號(hào)對(duì)話框,在CMainFrame:OnCreateCMainFrame:OnCreate函數(shù)中添加以下代碼。函數(shù)中添加以下代碼。int CMainFrame
49、:OnCreate(LPCREATESTRUCT lpCreateStruct)int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) .CMenuCMenu* * pSysMenu = GetMenu(); pSysMenu = GetMenu();/ / 獲獲得程序菜單指針得程序菜單指針CMenuCMenu* * pSubMenu = pSysMenu-GetSubMenu(1);/ pSubMenu = pSysMenu-GetSubMenu(1);/ 獲得第二個(gè)子菜單的指獲得第二個(gè)子菜單的指針針CString StrMenuItem
50、(CString StrMenuItem(新的菜單項(xiàng)新的菜單項(xiàng)););pSubMenu-AppendMenu(MF_SEPARATOR);pSubMenu-AppendMenu(MF_SEPARATOR);/ / 添加一程度分隔線添加一程度分隔線pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);/ / 在子菜單中添加一菜單項(xiàng)在子菜單中添加一菜單項(xiàng)/ / 允許運(yùn)用允許運(yùn)用ON_UPDATE_COMMAND_UIO
51、N_UPDATE_COMMAND_UI或或ON_COMMANDON_COMMAND的菜單項(xiàng)的菜單項(xiàng)m_bAutoMenuEnable = FALSE; / m_bAutoMenuEnable = FALSE; / 封鎖系統(tǒng)自動(dòng)更新菜單形狀封鎖系統(tǒng)自動(dòng)更新菜單形狀pSysMenu-pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);/ / 激活菜單項(xiàng)激活菜單項(xiàng)DrawMenuBar();DrawMenuBar
52、();/ / 更新菜單更新菜單return 0;return 0; 6.2菜單菜單(5) (5) 用用MFC ClassWizardMFC ClassWizard處置處置OnCommandOnCommand音訊并檢測(cè)用戶菜單的音訊并檢測(cè)用戶菜單的nIDnID參數(shù)。參數(shù)。BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam/ wParam的低字節(jié)表示菜單、控件、加速鍵的命令的低字節(jié)表示菜單、控件、加速鍵的命令I(lǐng)
53、DIDif (LOWORD(wParam) = ID_NEW_MENUITEM) if (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(MessageBox(他選中了新的菜單項(xiàng)他選中了新的菜單項(xiàng)););return CFrameWnd:OnCommand(wParam, lParam);return CFrameWnd:OnCommand(wParam, lParam); (6)(6)編譯運(yùn)轉(zhuǎn)并測(cè)試。這樣中選擇菜單編譯運(yùn)轉(zhuǎn)并測(cè)試。這樣中選擇菜單“編輯編輯“新的菜單項(xiàng)命令后,就會(huì)彈新的菜單項(xiàng)命令后,就會(huì)彈一個(gè)對(duì)話框,顯示一個(gè)對(duì)話框,顯示“他選中了新的菜
54、單項(xiàng)音訊。他選中了新的菜單項(xiàng)音訊。 6.2菜單菜單6.2.4運(yùn)用快捷菜單運(yùn)用快捷菜單 快捷菜單實(shí)現(xiàn)函數(shù)快捷菜單實(shí)現(xiàn)函數(shù) 用資源編輯器和用資源編輯器和MFC庫(kù)的庫(kù)的CMenu:TrackPopupMenu函數(shù)可以創(chuàng)建函數(shù)可以創(chuàng)建這樣的菜單,這樣的菜單,CMenu:TrackPopupMenu函數(shù)原型:函數(shù)原型:BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );用來(lái)顯示一個(gè)浮動(dòng)的彈出式菜單。用來(lái)顯示一個(gè)浮動(dòng)的彈出式菜單。nFlags表示菜單在屏幕顯示的位置表示菜單在屏幕顯示的位置以
55、及鼠標(biāo)按鈕標(biāo)志,如表。以及鼠標(biāo)按鈕標(biāo)志,如表。x和和y表示菜單的程度坐標(biāo)和菜單的頂端表示菜單的程度坐標(biāo)和菜單的頂端的垂直坐標(biāo)。的垂直坐標(biāo)。pWnd表示彈出菜單的窗口,此窗口將收到菜單全部的表示彈出菜單的窗口,此窗口將收到菜單全部的WM_COMMAND音訊。音訊。lpRect是一個(gè)是一個(gè)RECT構(gòu)造或構(gòu)造或CRect對(duì)象指針,對(duì)象指針,表示一個(gè)矩形區(qū)域,單擊這個(gè)區(qū)域時(shí),彈出菜單不消逝。表示一個(gè)矩形區(qū)域,單擊這個(gè)區(qū)域時(shí),彈出菜單不消逝。lpRect為為NULL時(shí),在菜單外面單擊鼠標(biāo),菜單立刻消逝。時(shí),在菜單外面單擊鼠標(biāo),菜單立刻消逝。 6.2菜單菜單例如例如 顯示主菜單顯示主菜單IDR_MAINF
56、RAME時(shí),右擊鼠標(biāo)彈出時(shí),右擊鼠標(biāo)彈出“查看菜單的子菜單,顯示查看菜單的子菜單,顯示菜單菜單IDR_MENU1時(shí),右擊鼠標(biāo)彈出時(shí),右擊鼠標(biāo)彈出“測(cè)試菜單的子菜單。詳細(xì)步驟:測(cè)試菜單的子菜單。詳細(xì)步驟:(1) 翻開(kāi)前面的單文檔運(yùn)用程序翻開(kāi)前面的單文檔運(yùn)用程序Ex_SDI。(2) 在在CMainFrame類添加類添加WM_CONTEXTMENU音訊映射,函數(shù)代碼。音訊映射,函數(shù)代碼。void CMainFrame:OnContextMenu(CWnd* pWnd, CPoint point) CMenu* pSysMenu = GetMenu();/ 獲得程序菜單指針獲得程序菜單指針int nC
57、ount = pSysMenu-GetMenuItemCount();/ 獲得頂層菜單個(gè)數(shù)獲得頂層菜單個(gè)數(shù)int nSubMenuPos = -1;for (int i=0; iGetMenuString(i, str, MF_BYPOSITION);if (str.Left(4) = “查看查看) | (str.Left(4) = “測(cè)試測(cè)試)nSubMenuPos = i;break;if (nSubMenuPosGetSubMenu( nSubMenuPos) -TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,
58、 this);(3)編譯運(yùn)轉(zhuǎn)并測(cè)試。編譯運(yùn)轉(zhuǎn)并測(cè)試。 6.36.3工具欄工具欄 6.3.1運(yùn)用工具欄編輯器運(yùn)用工具欄編輯器 創(chuàng)建一個(gè)新的工具欄按鈕創(chuàng)建一個(gè)新的工具欄按鈕 雙擊新建的工具欄中最右端的空按鈕彈出屬性框,在雙擊新建的工具欄中最右端的空按鈕彈出屬性框,在ID框中輸入稱號(hào),右端框中輸入稱號(hào),右端出現(xiàn)一個(gè)空按鈕。單擊該按鈕,在資源編輯器的工具按鈕設(shè)計(jì)窗口內(nèi)進(jìn)展編出現(xiàn)一個(gè)空按鈕。單擊該按鈕,在資源編輯器的工具按鈕設(shè)計(jì)窗口內(nèi)進(jìn)展編輯,這個(gè)編輯就是繪制一個(gè)工具按鈕的位圖。輯,這個(gè)編輯就是繪制一個(gè)工具按鈕的位圖。 挪動(dòng)一個(gè)按鈕挪動(dòng)一個(gè)按鈕鼠標(biāo)左鍵點(diǎn)中它并拖動(dòng)至相應(yīng)位置。假設(shè)用戶拖動(dòng)它分開(kāi)工具欄位置
59、,那么鼠標(biāo)左鍵點(diǎn)中它并拖動(dòng)至相應(yīng)位置。假設(shè)用戶拖動(dòng)它分開(kāi)工具欄位置,那么此按鈕從工具欄中消逝。假設(shè)在挪動(dòng)一個(gè)按鈕的同時(shí),按下此按鈕從工具欄中消逝。假設(shè)在挪動(dòng)一個(gè)按鈕的同時(shí),按下Ctrl鍵,那么在鍵,那么在新位置復(fù)制一個(gè)按鈕,新位置可以是同一個(gè)工具欄中的其他位置,也可以在新位置復(fù)制一個(gè)按鈕,新位置可以是同一個(gè)工具欄中的其他位置,也可以在不同的工具欄中。不同的工具欄中。 刪除一個(gè)按鈕刪除一個(gè)按鈕 將選取中的按鈕拖離工具欄就消逝了。假設(shè)選中按鈕,將選取中的按鈕拖離工具欄就消逝了。假設(shè)選中按鈕,Delete鍵不能刪除,鍵不能刪除,將按鈕中的圖形全部以背風(fēng)光填充。將按鈕中的圖形全部以背風(fēng)光填充。 在工具
60、欄中插入空格在工具欄中插入空格 假設(shè)按扭前沒(méi)有任何空格,拖動(dòng)該按鈕向右挪動(dòng)并當(dāng)覆蓋相鄰按鈕的一半以上假設(shè)按扭前沒(méi)有任何空格,拖動(dòng)該按鈕向右挪動(dòng)并當(dāng)覆蓋相鄰按鈕的一半以上時(shí),釋放鼠標(biāo)鍵,那么此按鈕前出現(xiàn)空格。時(shí),釋放鼠標(biāo)鍵,那么此按鈕前出現(xiàn)空格。 假設(shè)按鈕前有空格而按鈕后沒(méi)有空格,拖動(dòng)該按鈕向左挪動(dòng)并當(dāng)按鈕的左邊境假設(shè)按鈕前有空格而按鈕后沒(méi)有空格,拖動(dòng)該按鈕向左挪動(dòng)并當(dāng)按鈕的左邊境接觸到前面按鈕時(shí),釋放鼠標(biāo)鍵,那么此按鈕后將出現(xiàn)空格。接觸到前面按鈕時(shí),釋放鼠標(biāo)鍵,那么此按鈕后將出現(xiàn)空格。 假設(shè)按鈕前后均有空格,拖動(dòng)該按鈕向右挪動(dòng)并當(dāng)接觸到相鄰按鈕時(shí),那么此假設(shè)按鈕前后均有空格,拖動(dòng)該按鈕向右挪動(dòng)并當(dāng)接觸到相鄰按鈕時(shí),那么此按鈕前的空格保管,按鈕后的空格消逝。相反,拖動(dòng)該按鈕向左挪動(dòng)并當(dāng)接按鈕前的空格保
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年軟件設(shè)計(jì)師考試綜合素質(zhì)測(cè)評(píng)試題及答案
- 政黨制度與選舉關(guān)系試題及答案
- 流行趨勢(shì)分析軟件設(shè)計(jì)師考試試題及答案
- 探索西方議會(huì)制度試題及答案
- 公共政策與區(qū)域協(xié)調(diào)發(fā)展試題及答案
- 生態(tài)文明政策的實(shí)施路徑探討試題及答案
- 2025年成人教育終身學(xué)習(xí)體系構(gòu)建與平臺(tái)運(yùn)營(yíng)中的老年教育市場(chǎng)研究報(bào)告
- 關(guān)注2025年西方政治試題及答案
- 2025年軟件設(shè)計(jì)師考試技術(shù)手段分享試題及答案
- 大數(shù)據(jù)背景下的公共政策試題及答案
- GB/T 18380.12-2008電纜和光纜在火焰條件下的燃燒試驗(yàn)第12部分:?jiǎn)胃^緣電線電纜火焰垂直蔓延試驗(yàn)1 kW預(yù)混合型火焰試驗(yàn)方法
- word基礎(chǔ)入門(mén)公開(kāi)課課件
- 綜合、??漆t(yī)院執(zhí)業(yè)校驗(yàn)標(biāo)準(zhǔn)
- 學(xué)習(xí)羅陽(yáng)青年隊(duì)故事PPT在急難險(xiǎn)重任務(wù)中攜手拼搏奉獻(xiàn)PPT課件(帶內(nèi)容)
- 稀土元素的分離方法-icaredbd課件
- 四年級(jí)下數(shù)學(xué)課件-火車過(guò)橋-通用版
- 版式設(shè)計(jì)課件3,網(wǎng)格系統(tǒng)全攻略
- 船舶防臺(tái)風(fēng)安全安全知識(shí)
- 國(guó)家開(kāi)放大學(xué)《人文英語(yǔ)3》章節(jié)測(cè)試參考答案
- 用雙棱鏡干涉測(cè)光波(20149)
- 靜音房聲學(xué)設(shè)計(jì)方案
評(píng)論
0/150
提交評(píng)論