版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
MFC框架窗口界面設(shè)計(jì)
1框架窗口
2菜單
3工具欄
4狀態(tài)欄
5交互對(duì)象的動(dòng)態(tài)更新
6圖標(biāo)和光標(biāo)
當(dāng)前1頁,總共58頁。1框架窗口
1.1單文檔和多文檔程序框架窗口
文檔應(yīng)用程序的MFC類結(jié)構(gòu)
如圖是單文檔應(yīng)用程序Ex_SDI和多文檔應(yīng)用程序Ex_MDI的MFC類結(jié)構(gòu)。
CAboutDlg是每一個(gè)應(yīng)用程序框架都有的,用來顯示本程序的有關(guān)信息。 CEx_SDIApp和CEx_MDIApp是應(yīng)用程序類,是從CWinApp類派生而來,負(fù)責(zé)應(yīng)用程序創(chuàng)建、運(yùn)行和終止,每一個(gè)應(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)欄等界面元素的初始化。對(duì)于單文檔應(yīng)用程序來說,主框架窗口類是從CFrameWnd派生而來的,而對(duì)于多文檔應(yīng)用程序程序,主框架窗口是從CMDIFrameWnd派生的。
當(dāng)前2頁,總共58頁。1框架窗口 CChildFrame類是從CMDIChildWnd派生而來,專門用來管理多文檔應(yīng)用程序中的文檔窗口。無論是CMDIChildWnd還是CMDIFrameWnd類,它們都是從CFrameWnd派生而來的。 對(duì)于基于對(duì)話框的應(yīng)用程序,一般有CAboutDlg類、應(yīng)用程序類和對(duì)話框類。 上述MFC類之間的繼承和派生關(guān)系如圖2所示。
圖2MFC類的基本層次結(jié)構(gòu)CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd當(dāng)前3頁,總共58頁。1框架窗口項(xiàng)目的文件組織
項(xiàng)目中源文件都是采用文件夾的方式進(jìn)行管理的,將項(xiàng)目名作為文件夾名,此文件夾下包含源程序代碼文件、項(xiàng)目文件以及項(xiàng)目工作區(qū)文件等。每一個(gè)類的源代碼均保存同名的h和cpp文件。其他一些文件類型的含義: .opt 關(guān)于開發(fā)環(huán)境的參數(shù)文件,如工具條位置等信息
.aps(AppStudioFile) 資源輔助文件,二進(jìn)制格式 .clw ClassWizard信息文件 .dsp(DeveloperStudioProject) 項(xiàng)目文件 .plg 編譯信息文件 .mdp(MicrosoftDevStudioProject) 舊版本的項(xiàng)目文件 .bsc 用于瀏覽項(xiàng)目信息 .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)建項(xiàng)目時(shí),系統(tǒng)自動(dòng)為項(xiàng)目創(chuàng)建Win32Debug版本的運(yùn)行程序,并使用相應(yīng)的默認(rèn)配置。程序編連后,用于該項(xiàng)目的可執(zhí)行文件以及其他調(diào)試的信息文件都安放在Debug文件夾中。程序項(xiàng)目有一個(gè)Win32Release版本,與Release的區(qū)別在于:Debug版本的運(yùn)行程序有相應(yīng)的調(diào)試信息碼,Release版本的運(yùn)行程序沒有,但Release版本的運(yùn)行程序經(jīng)過代碼的優(yōu)化,其程序的運(yùn)行效率被最大提升。選擇“編譯”“配置”菜單命令,在“配置”對(duì)話框?qū)㈨?xiàng)目設(shè)置成Win32Release版本。
當(dāng)前4頁,總共58頁。1框架窗口主框架窗口和文檔窗口
主框架窗口是直接放置在桌面(DeskTop)上的那個(gè)窗口,每個(gè)應(yīng)用程序只能有一個(gè)主框架窗口。主框架窗口負(fù)責(zé)管理各個(gè)用戶交互對(duì)象并根據(jù)用戶操作相應(yīng)地創(chuàng)建或更新文檔窗口及其視圖。文檔窗口對(duì)SDI程序來說,和主框架窗口是一致的,主框架窗口就是文檔窗口;對(duì)于MDI程序,文檔窗口是主框架窗口的子窗口,如圖。文檔窗口一般都有相應(yīng)的可見邊框,它的客戶區(qū)(除了窗口標(biāo)題欄、邊框外的區(qū)域)是由相應(yīng)的視圖來構(gòu)成的,因此可以說視圖是文檔窗口內(nèi)的子窗口。文檔窗口時(shí)刻跟蹤當(dāng)前處于活動(dòng)狀態(tài)的視圖的變化,并將用戶或系統(tǒng)產(chǎn)生的消息傳遞給當(dāng)前活動(dòng)視圖。
當(dāng)前5頁,總共58頁。1框架窗口1.2窗口狀態(tài)的改變 MFCAppWizard為每個(gè)窗口設(shè)置了相應(yīng)的大小和位置。 運(yùn)行程序時(shí),會(huì)自動(dòng)調(diào)用框架內(nèi)部的WinMain函數(shù),并自動(dòng)查找該應(yīng)用程序類的全局變量theApp,然后自動(dòng)調(diào)用用戶應(yīng)用程序類的虛函數(shù)InitInstance,該函數(shù)會(huì)進(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ù)顯示窗口。
當(dāng)前6頁,總共58頁。1框架窗口 通過指定ShowWindow函數(shù)的參數(shù)值可以改變改變窗口顯示狀態(tài)。例如下面的代碼是將窗口的初始狀態(tài)設(shè)置為“最小化”: BOOLCEx_SDIApp::InitInstance() { ... m_pMainWnd->ShowWindow(SW_SHOWMINIMIZED); m_pMainWnd->UpdateWindow(); returnTRUE; }當(dāng)前7頁,總共58頁。1框架窗口1.3窗口風(fēng)格的設(shè)置
窗口風(fēng)格
通常有一般和擴(kuò)展兩種形式??稍诤瘮?shù)CWnd::Create或CWnd::CreateEx參數(shù)中指定,CreateEx函數(shù)可同時(shí)支持以上兩種風(fēng)格,CWnd::Create只能指定窗口的一般風(fēng)格??丶蛯?duì)話框的窗口風(fēng)格可直接通過其屬性對(duì)話框來設(shè)置。
除了上述風(fēng)格外,框架窗口還有以下三個(gè)自己的風(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)整窗口的大小,使它剛好包含了框架窗口中的控制欄。例
cs.cx=300;
cs.cy=200;
cs.style=cs.style&~FWS_ADDTOTITLE;//取反
cs.lpszName="大連理工大學(xué)";
當(dāng)前8頁,總共58頁。1框架窗口在MFCAppWizard中進(jìn)行修改
[例Ex_SDI]在向?qū)е行薷拇翱陲L(fēng)格。
(1)選擇“文件”“新建”,選擇“工程”,選擇MFCAppWizard(exe)的項(xiàng)目類型,指定項(xiàng)目工作文件夾位置,輸入項(xiàng)目名Ex_SDI,單擊[確定]按鈕。(2)
在向?qū)У牡谝徊街?,將?yīng)用程序類型選為“單個(gè)文檔”(SDI)。(3)單擊[下一個(gè)],如圖,可以選擇程序中是否加入數(shù)據(jù)庫的支持。(4)單擊[下一個(gè)],出現(xiàn)向?qū)У牡谌綄?duì)話框,如圖,允許在程序中加入復(fù)合文檔、自動(dòng)化、ActiveX控件的支持。
當(dāng)前9頁,總共58頁。1框架窗口
(5)單擊[下一個(gè)],如圖,對(duì)話框的前幾項(xiàng)依次確定對(duì)浮動(dòng)工具條、打印與預(yù)覽以及通信網(wǎng)絡(luò)等特性的支持。對(duì)話框的最后兩項(xiàng)是最近文件列表數(shù)目的設(shè)置(默認(rèn)時(shí)為4)和一個(gè)[高級(jí)]按鈕
。當(dāng)前10頁,總共58頁。1框架窗口
(6)在第四步對(duì)話框中,單擊[高級(jí)],如圖,分別用于文檔模板字串資源內(nèi)容和窗口風(fēng)格的修改。
當(dāng)前11頁,總共58頁。1框架窗口 (7)單擊[關(guān)閉],單擊[下一個(gè)],如圖??蛇x擇:應(yīng)用程序的主窗口是MFC標(biāo)準(zhǔn)風(fēng)格還是窗口左邊有切分窗口的瀏覽器風(fēng)格,在源文件中是否加入注釋用來引導(dǎo)用戶編寫程序代碼,是使用動(dòng)態(tài)鏈接庫(DLL)還是靜態(tài)鏈接庫。 (8)單擊[下一個(gè)]按鈕,出現(xiàn)如圖9所示的對(duì)話框。在這里,用戶可以對(duì)MFCAppWizard提供的默認(rèn)類名、基類名、各個(gè)源文件名進(jìn)行修改。
當(dāng)前12頁,總共58頁。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_AFXDLL Enable3dControls(); //使用MFC動(dòng)態(tài)鏈接庫的3D控件 #else Enable3dControlsStatic(); //使用MFC靜態(tài)鏈接庫的3D控件 #endif //在Windows系統(tǒng)注冊(cè)表中登記應(yīng)用程序的主鍵值,以便將一些與應(yīng)用程序 //相關(guān)的參數(shù)存放在該主鍵值下 SetRegistryKey(_T("LocalMFCAppWizard-GeneratedApplications")); //從注冊(cè)表中調(diào)入應(yīng)用程序的一些標(biāo)準(zhǔn)參數(shù)值,其中包括最近文件列表的文件名 LoadStdProfileSettings();… returnTRUE; }當(dāng)前13頁,總共58頁。1框架窗口修改CREATESTRUCT結(jié)構(gòu)
窗口創(chuàng)建前,自動(dòng)調(diào)用PreCreateWindow虛函數(shù)。用MFCAppWizard創(chuàng)建文檔應(yīng)用程序結(jié)構(gòu)時(shí),MFC已為主窗口或文檔窗口類自動(dòng)重載了該虛函數(shù)??梢栽诖撕瘮?shù)中通過修改CREATESTRUCT結(jié)構(gòu)來設(shè)置窗口的絕大多數(shù)風(fēng)格。 對(duì)于多文檔應(yīng)用程序,文檔窗口的風(fēng)格可用下列的代碼更改: BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs) { //創(chuàng)建不含有[最大化]按鈕的子窗口 cs.style&=~WS_MAXIMIZEBOX; //調(diào)用基類的PreCreateWindow函數(shù) returnCFrameWnd::PreCreateWindow(cs); }當(dāng)前14頁,總共58頁。1框架窗口使用ModifyStyle和ModifyStyleEx
ModifyStyleEx可更改窗口的擴(kuò)展風(fēng)格。兩個(gè)函數(shù)具有相同的參數(shù),含義。 BOOLModifyXXXX(DWORDdwRemove,DWORDdwAdd,UINTnFlags=0); 參數(shù)dwRemove 指定需要?jiǎng)h除的風(fēng)格,dwAdd指定需要增加的風(fēng)格,nFlags表示SetWindowPos的標(biāo)志。框架窗口設(shè)定擴(kuò)展風(fēng)格只能通過調(diào)用ModifyStyle函數(shù)來進(jìn)行。例如用MFCClassWizard為一個(gè)多文檔應(yīng)用程序Ex_MDI的子文檔窗口類CChildFrame添加OnCreateClient消息處理,并增加下列代碼: BOOLCMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext) { ModifyStyle(0,WS_VSCROLL,0); returnCMDIChildWnd::OnCreateClient(lpcs,pContext); }當(dāng)前15頁,總共58頁。1框架窗口1.4改變窗口的大小和位置
CWnd類的成員函數(shù)SetWindowPos或MoveWindow可以改變窗口的大小和位置。SetWindowPos可以改變窗口的大小、位置,還可以改變所有窗口在堆棧排列的次序(Z次序),這個(gè)次序是根據(jù)它們?cè)谄聊怀霈F(xiàn)的先后來確定的。 BOOLSetWindowPos(constCWnd*pWndInsertAfter,intx,inty,int
cx,int
cy,UINT
nFlags); 參數(shù)pWndInsertAfter 表示窗口對(duì)象指針,下列預(yù)定義窗口對(duì)象的地址: wndBottom 將窗口放置在Z次序中的底層 wndTop 將窗口放置在Z次序中的頂層 wndTopMost 設(shè)置最頂窗口 wndNoTopMost 將窗口放置在所有最頂層的后面,若此窗口不是最頂窗口,則此標(biāo)志無效。 x和y表示窗口新的左上角坐標(biāo),cx和cy分別表示表示窗口新的寬度和高度,nFlags表示窗口新的大小和位置方式。
當(dāng)前16頁,總共58頁。1框架窗口函數(shù)CWnd::MoveWindow也可用來改變窗口的大小和位置,必須在MoveWindow函數(shù)中指定窗口的大小。 voidMoveWindow(intx,int
y,int
nWidth,intnHeight,BOOL
bRepaint=TRUE); voidMoveWindow(LPCRECT
lpRect,BOOLbRepaint
=TRUE); 參數(shù)x和y表示
窗口新的左上角坐標(biāo),nWidth和nHeight表示窗口新的寬度和高度,bRepaint用于指定窗口是否重繪,lpRect表示窗口新的大小和位置。例如,在CEx_SDIApp::InitInstance中[returnTRUE]語句之前添加下列代碼,可以使主框架窗口移動(dòng)到屏幕的(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是一個(gè)矩形類,GetWindowRect是一個(gè)CWnd類的成員函數(shù),用來獲取窗口在屏幕的位置和大小。
當(dāng)前17頁,總共58頁。2菜單
許多程序員對(duì)于菜單的設(shè)計(jì)都遵循下列一些規(guī)則:l
若選擇某菜單項(xiàng)會(huì)彈出一對(duì)話框,那么在該菜單項(xiàng)文本后有“…”。l
若某項(xiàng)菜單有子菜單,那么在該菜單項(xiàng)文本后有“”。l
若菜單項(xiàng)需要助記符,用括號(hào)將帶下劃線的字母括起來。助記符與Alt構(gòu)成一個(gè)組合鍵,當(dāng)按住“Alt”鍵不放,敲擊該字母時(shí),對(duì)應(yīng)的菜單項(xiàng)就會(huì)被選中。l若某項(xiàng)菜單需要快捷鍵的支持,則一般將其列在相應(yīng)菜單項(xiàng)文本之后。所謂“快捷鍵”是一個(gè)組合鍵,如Ctrl+N,使用時(shí)是先按下“Ctrl”健不放,然后再按“N”鍵。任何時(shí)候按下快捷鍵,相應(yīng)的菜單命令都會(huì)被執(zhí)行。
圖11菜單樣例子當(dāng)前18頁,總共58頁。2菜單2.1更改應(yīng)用程序菜單
菜單“文件”“打開工作區(qū)”。在工作區(qū)中選擇ResourceView頁面,雙擊資源“Menu”中的IDR_MAINFRAME,通過菜單編輯器修改菜單資源IDR_MAINFRAME,可以為程序重新指定一個(gè)菜單,下面的示例過程:(1)
打開前面的單文檔應(yīng)用程序Ex_SDI。(2)按快捷鍵Ctrl+R,在資源類型中選定“Menu”,如圖。
(3)單擊[新建],如圖。
當(dāng)前19頁,總共58頁。2菜單 (4)在Menu的ID_MENU1上右擊鼠標(biāo),選擇“Properties”命令,如圖,可以重新指定菜單資源ID,設(shè)置菜單資源的語言和條件,這個(gè)條件用來決定菜單資源包含到哪個(gè)環(huán)境中,例如當(dāng)指定條件為_DEBUG,則菜單資源只存在于Debug編譯環(huán)境中。
(5)菜單ID_MENU1添加一個(gè)頂層彈出菜單項(xiàng)“測試(&T)”,并在該菜單下添加一個(gè)子菜單項(xiàng)“返回(&R)”,ID設(shè)為ID_TEST_RETURN,如圖。
(6)打開Ex_SDI程序菜單資源IDR_MAINFRAME,在“查看”菜單的最后添加一個(gè)子菜單項(xiàng)“顯示測試菜單(&M)”,ID設(shè)為ID_VIEW_TEST。 (7)為CMainFrame類添加一個(gè)CMenu類型的成員變量m_NewMenu,CMenu類是用來處理菜單的一個(gè)MFC類。
當(dāng)前20頁,總共58頁。2菜單(8)按快捷鍵Ctrl+W,切換到MessageMaps頁面,從“Classname”列表中選擇CMainFrame,分別為菜單項(xiàng)ID_VIEW_TEST和ID_TEST_RETURN添加COMMAND消息映射,使用默認(rèn)的消息映射函數(shù)名,并添中下列代碼: voidCMainFrame::OnViewTest() { m_NewMenu.Detach(); //使菜單對(duì)象和菜單句柄分離 m_NewMenu.LoadMenu(IDR_MENU1); SetMenu(NULL); //清除應(yīng)用程序菜單 SetMenu(&m_NewMenu); //設(shè)置應(yīng)用程序菜單 } voidCMainFrame::OnTestReturn() { m_NewMenu.Detach(); m_NewMenu.LoadMenu(IDR_MAINFRAME); SetMenu(NULL); SetMenu(&m_NewMenu); }
LoadMenu裝載菜單資源,Detach使菜單對(duì)象與菜單句柄分離。調(diào)用LoadMenu后,菜單對(duì)象m_NewMenu就擁有一個(gè)菜單句柄,再次調(diào)用LoadMenu時(shí),發(fā)生運(yùn)行時(shí)錯(cuò)誤,當(dāng)菜單對(duì)象與菜單句柄分離后,就可以再創(chuàng)建菜單。SetMenu是CWnd類的一個(gè)成員函數(shù),用來設(shè)置應(yīng)用程序的菜單。(9)編譯運(yùn)行并測試。
當(dāng)前21頁,總共58頁。2菜單2.2使用鍵盤快捷鍵
通過上述的菜單系統(tǒng),可以選擇幾乎所有可用的命令和選項(xiàng),保證了菜單命令系統(tǒng)的完整性,菜單系統(tǒng)操作效率不高。對(duì)于那些反復(fù)使用的命令,有必要進(jìn)一步提高效率,于是加速鍵應(yīng)運(yùn)而生。一個(gè)加速鍵就是一個(gè)按鍵或幾個(gè)按鍵的組合,用于激活特定的命令。加速鍵也是一種資源。
例如:為前面兩個(gè)菜單ID_VIEW_TEST和ID_TEST_RETURN定義鍵盤快捷鍵:
(1)打開上例的工作區(qū)窗口中Accelerator的資源項(xiàng),雙擊IDR_MAINFRAME,如圖。
當(dāng)前22頁,總共58頁。2菜單 (2)建立一新的加速鍵,雙擊加速鍵列表的最下端的空行,彈出如圖的“AccelProperities”(加速鍵屬性)對(duì)話框,可設(shè)置的屬性如表。
當(dāng)前23頁,總共58頁。2菜單(3)選擇Ex_SDI添加的“顯示測試菜單”菜單項(xiàng)ID_VIEW_TEST作為要聯(lián)用的加速鍵的ID號(hào),然后單擊[下一鍵]按鈕,并按下Ctrl+1作為此加速鍵的鍵值。(4)按同樣的方法,為菜單項(xiàng)ID_TEST_RETURN添加加速鍵Ctrl+2。需要說明的是,為了使其他用戶能查看并使用該加速鍵,還需在相應(yīng)的菜單項(xiàng)文本后面添加加速鍵內(nèi)容。例如,可將ID_VIEW_TEST菜單項(xiàng)的標(biāo)題改成“顯示測試菜單(&M)\tCtrl+1”,其中“\t”是將后面的“Ctrl+1”定位到一個(gè)水平制表位。(5)編譯運(yùn)行并測試。當(dāng)程序運(yùn)行后,按“Ctrl+1”和“Ctrl+2”將執(zhí)行相應(yīng)的菜單命令。
當(dāng)前24頁,總共58頁。2菜單2.3菜單的編程控制
創(chuàng)建菜單
CreateMenu和CreatePopupMenu用來創(chuàng)建一個(gè)菜單或子菜單框架,原型: BOOLCreateMenu();
//
產(chǎn)生一個(gè)空菜單
BOOLCreatePopupMenu();
//產(chǎn)生一個(gè)空的彈出式子菜單
裝入菜單資源
需調(diào)用CMenu成員函數(shù)LoadMenu,再用SetMenu對(duì)應(yīng)用程序菜單進(jìn)行重新設(shè)置。
BOOLLoadMenu(LPCTSTRlpszResourceName); BOOLLoadMenu(UINTnIDResource); lpszResourceName為菜單資源名稱,nIDResource為菜單資源ID號(hào)。
添加菜單項(xiàng)
可以調(diào)用AppendMenu或InsertMenu函數(shù)來添加菜單項(xiàng)。AppendMenu是將菜單項(xiàng)添加在菜單的末尾處,InsertMenu在指定位置處插入菜單項(xiàng),將后面的菜單項(xiàng)依次下移。
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表示新菜單項(xiàng)的ID號(hào),lpszNewItem表示新菜單項(xiàng)的內(nèi)容,pBmp用于菜單項(xiàng)的位圖指針,nPosition表示新菜單項(xiàng)要插入的菜單項(xiàng)位置。nFlags表示要增加的新菜單項(xiàng)的狀態(tài)信息。
當(dāng)前25頁,總共58頁。2菜單
注意:l
當(dāng)nFlags為MF_BYPOSITION時(shí),nPosition表示新菜單項(xiàng)要插入的具體位置,為0時(shí)表示第一個(gè)菜單項(xiàng),為-1時(shí),將菜單項(xiàng)添加菜單的末尾處。l
nFlags的標(biāo)志中,可以用“|”(按位或)來組合。有些組合是不允許的,例如MF_DISABLED、MF_ENABLED和MF_GRAYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位圖,MF_CHECKED和MF_UNCHECKED都不能組合在一起。l當(dāng)菜單項(xiàng)增加后,不管菜單依附的窗口是否改變,都應(yīng)調(diào)用CWnd::DrawMenuBar來更新菜單。
當(dāng)前26頁,總共58頁。2菜單刪除菜單項(xiàng)
DeleteMenu函數(shù)可將菜單項(xiàng)刪除,注意:調(diào)用該函數(shù)后,不管菜單依附的窗口是否改變,都應(yīng)調(diào)用CWnd::DrawMenuBar使菜單更新。函數(shù)原型: BOOLDeleteMenu(UINTnPosition,UINTnFlags);
nPosition表示要?jiǎng)h除菜單項(xiàng)位置,由nFlags進(jìn)行說明。nFlags為MF_BYCOMMAND時(shí),nPosition表示菜單項(xiàng)ID號(hào),nFlags為MF_BYPOSITION時(shí),nPosition表示菜單項(xiàng)的位置。
獲取菜單項(xiàng)
下面四個(gè)CMenu成員函數(shù)分別獲得菜單的項(xiàng)數(shù)、菜單項(xiàng)的ID號(hào)、菜單項(xiàng)的文本內(nèi)容以及彈出式子菜單的句柄。 UINTGetMenuItemCount()const;//用來獲得菜單的菜單項(xiàng)數(shù)。 UINTGetMenuItemID(intnPos)const;//用來獲得由nPos指定菜單項(xiàng)位置的菜單項(xiàng)的標(biāo)識(shí)號(hào)。 intGetMenuString(UINTnIDItem,CString&rString,UINTnFlags)const; //獲得由nIDItem指定菜單項(xiàng)位置的菜單項(xiàng)的文本內(nèi)容,由rString參數(shù)返回,nFlags為MF_BYPOSITION時(shí),nPosition表示菜單項(xiàng)的位置。 CMenu*GetSubMenu(intnPos)const; //用來獲得指定菜單的彈出式菜單的菜單句柄。
當(dāng)前27頁,總共58頁。2菜單示例
示例過程利用CMenu成員函數(shù)向應(yīng)用程序菜單中添加并處理一個(gè)菜單項(xiàng):(1)
打開前面的單文檔應(yīng)用程序Ex_SDI或重新創(chuàng)建。(2)“查看”菜單“ResourceSymbols…”,如圖。(3)單擊[新建],如圖。在名字框中輸入標(biāo)識(shí)符ID_NEW_MENUITEM。在值框中輸入ID的值,單擊[確定]。
當(dāng)前28頁,總共58頁。2菜單(4)
關(guān)閉“資源符號(hào)”對(duì)話框,在CMainFrame::OnCreate函數(shù)中添加下列代碼。 intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) { ... CMenu*pSysMenu=GetMenu(); //獲得程序菜單指針 CMenu*pSubMenu=pSysMenu->GetSubMenu(1);//獲得第二個(gè)子菜單的指針 CStringStrMenuItem("新的菜單項(xiàng)"); pSubMenu->AppendMenu(MF_SEPARATOR); //增加一水平分隔線 pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); //在子菜單中增加一菜單項(xiàng) //允許使用ON_UPDATE_COMMAND_UI或ON_COMMAND的菜單項(xiàng) m_bAutoMenuEnable=FALSE;//關(guān)閉系統(tǒng)自動(dòng)更新菜單狀態(tài) pSysMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED); //激活菜單項(xiàng) DrawMenuBar(); //更新菜單 return0; }當(dāng)前29頁,總共58頁。2菜單(5)
用MFCClassWizard處理OnCommand消息并檢測用戶菜單的nID參數(shù)。 BOOLCMainFrame::OnCommand(WPARAMwParam,LPARAMlParam) { //wParam的低字節(jié)表示菜單、控件、加速鍵的命令I(lǐng)D if(LOWORD(wParam)==ID_NEW_MENUITEM) MessageBox("你選中了新的菜單項(xiàng)"); returnCFrameWnd::OnCommand(wParam,lParam); }(6)編譯運(yùn)行并測試。這樣當(dāng)選擇菜單“編輯”“新的菜單項(xiàng)”命令后,就會(huì)彈一個(gè)對(duì)話框,顯示“你選中了新的菜單項(xiàng)”消息。
當(dāng)前30頁,總共58頁。2菜單2.4使用快捷菜單
快捷菜單實(shí)現(xiàn)函數(shù)
用資源編輯器和MFC庫的CMenu::TrackPopupMenu函數(shù)可以創(chuàng)建這樣的菜單,CMenu::TrackPopupMenu函數(shù)原型: BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL); 用來顯示一個(gè)浮動(dòng)的彈出式菜單。nFlags表示菜單在屏幕顯示的位置以及鼠標(biāo)按鈕標(biāo)志,如表。x和y表示菜單的水平坐標(biāo)和菜單的頂端的垂直坐標(biāo)。pWnd表示彈出菜單的窗口,此窗口將收到菜單全部的WM_COMMAND消息。lpRect是一個(gè)RECT結(jié)構(gòu)或CRect對(duì)象指針,表示一個(gè)矩形區(qū)域,單擊這個(gè)區(qū)域時(shí),彈出菜單不消失。lpRect為NULL時(shí),在菜單外面單擊鼠標(biāo),菜單立刻消失。
當(dāng)前31頁,總共58頁。2菜單示例
顯示主菜單IDR_MAINFRAME時(shí),右擊鼠標(biāo)彈出“查看”菜單的子菜單,顯示菜單IDR_MENU1時(shí),右擊鼠標(biāo)彈出“測試”菜單的子菜單。具體步驟:(1)
打開前面的單文檔應(yīng)用程序Ex_SDI。(2)
在CMainFrame類添加WM_CONTEXTMENU消息映射,函數(shù)代碼。 voidCMainFrame::OnContextMenu(CWnd*pWnd,CPointpoint) { CMenu*pSysMenu=GetMenu(); //獲得程序菜單指針 intnCount=pSysMenu->GetMenuItemCount(); //獲得頂層菜單個(gè)數(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)編譯運(yùn)行并測試。
當(dāng)前32頁,總共58頁。3工具欄
3.1使用工具欄編輯器
創(chuàng)建一個(gè)新的工具欄按鈕
雙擊新建的工具欄中最右端的空按鈕彈出屬性框,在ID框中輸入名稱,右端出現(xiàn)一個(gè)空按鈕。單擊該按鈕,在資源編輯器的工具按鈕設(shè)計(jì)窗口內(nèi)進(jìn)行編輯,這個(gè)編輯就是繪制一個(gè)工具按鈕的位圖。
移動(dòng)一個(gè)按鈕 鼠標(biāo)左鍵點(diǎn)中它并拖動(dòng)至相應(yīng)位置。如果用戶拖動(dòng)它離開工具欄位置,則此按鈕從工具欄中消失。若在移動(dòng)一個(gè)按鈕的同時(shí),按下Ctrl鍵,則在新位置復(fù)制一個(gè)按鈕,新位置可以是同一個(gè)工具欄中的其他位置,也可以在不同的工具欄中。
刪除一個(gè)按鈕
將選取中的按鈕拖離工具欄就消失了。若選中按鈕,Delete鍵不能刪除,將按鈕中的圖形全部以背景色填充。
在工具欄中插入空格
如果按扭前沒有任何空格,拖動(dòng)該按鈕向右移動(dòng)并當(dāng)覆蓋相鄰按鈕的一半以上時(shí),釋放鼠標(biāo)鍵,則此按鈕前出現(xiàn)空格。
如果按鈕前有空格而按鈕后沒有空格,拖動(dòng)該按鈕向左移動(dòng)并當(dāng)按鈕的左邊界接觸到前面按鈕時(shí),釋放鼠標(biāo)鍵,則此按鈕后將出現(xiàn)空格。如果按鈕前后均有空格,拖動(dòng)該按鈕向右移動(dòng)并當(dāng)接觸到相鄰按鈕時(shí),則此按鈕前的空格保留,按鈕后的空格消失。相反,拖動(dòng)該按鈕向左移動(dòng)并當(dāng)接觸到前一個(gè)相鄰按鈕時(shí),則此按鈕前面的空格消失,后面的空格保留。
當(dāng)前33頁,總共58頁。3工具欄工具欄按鈕屬性的設(shè)置
當(dāng)前34頁,總共58頁。3工具欄3.2工具按鈕和菜單項(xiàng)相結(jié)合
指選擇工具按鈕或菜單命令時(shí),操作結(jié)果是一樣的。使它們結(jié)合的具體方法是在工具按鈕的屬性對(duì)話框中將按鈕的ID號(hào)設(shè)置為相關(guān)聯(lián)的菜單項(xiàng)ID。
例如:示例是在前面Ex_SDI上進(jìn)行的,通過兩個(gè)工具按鈕分別顯示主菜單IDR_MAINFRAME和菜單IDR_MENU1。具體步驟:(1)
打開前面的單文檔應(yīng)用程序Ex_SDI。(2)利用工具欄編輯器設(shè)計(jì)兩個(gè)工具按鈕,如圖。
當(dāng)前35頁,總共58頁。3工具欄(3)
雙擊設(shè)計(jì)的第一個(gè)工具按鈕,將工具按鈕的ID號(hào)設(shè)為ID_TEST_RETURN,在提示框內(nèi)鍵入“返回應(yīng)用程序主菜單\n返回主菜單”。(4)
雙擊設(shè)計(jì)的第二個(gè)工具按鈕,將工具按鈕的ID號(hào)設(shè)為ID_VIEW_TEST,在提示框內(nèi)鍵入“顯示測試菜單\n顯示測試菜單”。(5)編譯運(yùn)行并測試。將鼠標(biāo)移至設(shè)計(jì)的第一個(gè)工具按鈕處,這時(shí)在狀態(tài)欄上顯示出“返回應(yīng)用程序主菜單”信息,若稍等片刻后,還會(huì)彈出提示小窗口,顯示出“返回主菜單”字樣,如圖。單擊新添加的這兩個(gè)按鈕,會(huì)執(zhí)行相應(yīng)的菜單命令。
當(dāng)前36頁,總共58頁。3工具欄3.3多個(gè)工具欄的使用操作步驟如下:(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類中添加一個(gè)成員變量m_wndTestBar,變量類型為CToolBar。CToolBar類封裝了工具欄的操作。
當(dāng)前37頁,總共58頁。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;}當(dāng)前38頁,總共58頁。3工具欄 (7)編譯運(yùn)行,如圖。
(8)需要調(diào)用CFrameWnd類的成員函數(shù)ShowControlBar來使程序一開始運(yùn)行時(shí)隱藏工具欄IDR_TOOLBAR1。在CMainFrame::OnCreate中添加代碼: intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) { … ShowControlBar(&m_wndTestBar,FALSE,FALSE);//關(guān)閉測試工具欄 return0; }當(dāng)前39頁,總共58頁。3工具欄(9)
在CMainFrame::OnViewTest和CMainFrame::OnTestReturn中添加代碼: voidCMainFrame::OnViewTest() { … ShowControlBar(&m_wndTestBar,TRUE,FALSE);//顯示測試工具欄 ShowControlBar(&m_wndToolBar,FALSE,FALSE);//關(guān)閉主工具欄 } voidCMainFrame::OnTestReturn() { … ShowControlBar(&m_wndTestBar,FALSE,FALSE);//關(guān)閉測試工具欄 ShowControlBar(&m_wndToolBar,TRUE,FALSE);//顯示主工具欄 }(10)
編譯運(yùn)行并測試,如圖,左邊開始運(yùn)行的結(jié)果,右邊是單擊按鈕運(yùn)行的結(jié)果。
當(dāng)前40頁,總共58頁。4狀態(tài)欄
4.1狀態(tài)欄的定義
AppWizard創(chuàng)建的SDI或MDI應(yīng)用程序框架中,有一個(gè)靜態(tài)的indicator數(shù)組,是在MainFrm.cpp文件中定義的,被MFC用作狀態(tài)欄的定義。
數(shù)組中的元素是一些標(biāo)識(shí)常量或是字串資源的ID號(hào)。圖列出了indicators數(shù)組元素與標(biāo)準(zhǔn)狀態(tài)欄窗格的關(guān)系。
StaticUINTindicators[]={ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,}圖28indicators數(shù)組的定義當(dāng)前41頁,總共58頁。4狀態(tài)欄4.2狀態(tài)欄的常用操作
增加和減少窗格
在狀態(tài)欄中增加信息行窗格,在indicators數(shù)組中增加一個(gè)ID_SEPARATOR標(biāo)識(shí);在狀態(tài)欄中增加指示器窗格,在indicators數(shù)組中增加一個(gè)在字符串表中定義過的資源ID。狀態(tài)欄減少一個(gè)窗格,只需減少indicators數(shù)組元素。
在狀態(tài)欄上顯示文本
調(diào)用CStatusBar::SetPaneText函數(shù)更新任何窗格中的文本。函數(shù)原型: BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);示例
(1)
創(chuàng)建一個(gè)默認(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, };當(dāng)前42頁,總共58頁。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); //更新第二個(gè)窗格的文本 } CView::OnMouseMove(nFlags,point); }當(dāng)前43頁,總共58頁。4狀態(tài)欄(5)
將MainFrm.h文件中的受保護(hù)變量m_wndStatusBar變成公共變量。(6)
在Ex_SDIMouseView.cpp文件的開始處增加下列語句: #include"Ex_SDIMouseView.h" #include"MainFrm.h“(7)編譯并運(yùn)行,如圖。
當(dāng)前44頁,總共58頁。4狀態(tài)欄4.3改變狀態(tài)欄的風(fēng)格
在MFC的CStatusBar類中,有兩個(gè)成員函數(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表示窗格是凸起來的,見表。
當(dāng)前45頁,總共58頁。5交互對(duì)象的動(dòng)態(tài)更新 在前面Ex_SDI基礎(chǔ)上,單擊工具按鈕,該按鈕被按下,按鈕彈起,單擊工具按鈕時(shí),該按鈕被按下,按鈕彈起,如此反復(fù)。具體步驟:
(1)
打開上例的單文檔應(yīng)用程序項(xiàng)目Ex_SDI。(2)
為CMainFrame添加一個(gè)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); }當(dāng)前46頁,總共58頁。5交互對(duì)象的動(dòng)態(tài)更新(4)在CMainFrame::OnViewTest和CMainFrame::OnTestReturn添加代碼: voidCMainFrame::OnViewTest() { … m_bMainWork=FALSE; } voidCMainFrame::OnTestReturn() { … m_bMainWork=TRUE; }(5)編譯運(yùn)行并測試,如圖。
當(dāng)前47頁,總共58頁。6圖標(biāo)和光標(biāo)
1使用圖形編輯器
創(chuàng)建一個(gè)新的圖標(biāo)或光標(biāo)
創(chuàng)建應(yīng)用程序后,按快捷鍵Ctrl+R打開“插入資源”,選擇Cursor(光標(biāo))或Icon(圖標(biāo))資源類型,單擊[新建]。如圖。 創(chuàng)建新圖標(biāo)或光標(biāo)的時(shí),圖形編輯器先創(chuàng)建的是一個(gè)適合于VGA環(huán)境中的圖像,開始的時(shí)候它以屏幕色(透明方式)來填充。如表。
新設(shè)備按鈕當(dāng)前48頁,總共58頁。6圖標(biāo)和光標(biāo)選用和定制顯示設(shè)備
圖形編輯器上,有一個(gè)NewDeviceImage按鈕,單擊,如圖。
單擊[定制],如圖。設(shè)置光標(biāo)熱點(diǎn)
借助光標(biāo)“熱點(diǎn)”確定光標(biāo)實(shí)際的位置。如圖。
設(shè)置熱點(diǎn)按鈕當(dāng)前49頁,總共58頁。6圖標(biāo)和光標(biāo)2圖標(biāo)
圖標(biāo)的調(diào)入和清除
CWinApp::LoadIcon可將一個(gè)圖標(biāo)資源調(diào)入并返回一個(gè)圖標(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 問號(hào)圖標(biāo)(用于提示消息) IDI_EXCLAMATION 警告消息圖標(biāo)(驚嘆號(hào)) IDI_ASTERISK 消息圖標(biāo)
DestroyIcon可以用來刪除一個(gè)圖標(biāo),釋放為圖標(biāo)分配的內(nèi)存,原型: BOOLDestroyIcon(HICONhIcon);hIcon用來指定要?jiǎng)h除的圖標(biāo)句柄。
圖標(biāo)的繪制
函數(shù)CDC::DrawIcon將一個(gè)圖標(biāo)繪制在指定的位置處,原型: BOOLDrawIcon(intx,inty,HICONhIcon); BOOLDrawIcon(POINTpoint,HICONhIcon);
當(dāng)前50頁,總共58頁。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)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_Icon。(2)
新添四個(gè)圖標(biāo)資源,通過圖像設(shè)備選擇對(duì)話框(參見圖32)。圖標(biāo)資源ID號(hào)分別為默認(rèn)的IDI_ICON1~IDI_ICON4。
當(dāng)前51頁,總共58頁。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(); //重繪窗口 }
}當(dāng)前52頁,總共58頁。6圖標(biāo)和光標(biāo)(5)
在CMainFrame::OnCreate函數(shù)的最后添加計(jì)時(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[i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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年分期付款購買旅行保險(xiǎn)協(xié)議
- 2025年分期付款債務(wù)協(xié)議
- 2025年利潤分配增資協(xié)議
- 2025年借殼上市管理協(xié)議
- 2025年新能源汽車核心部件貼牌制造協(xié)議3篇
- 2025年AI智能消費(fèi)金融科技合作協(xié)議樣本
- 2025年在線購物優(yōu)惠活動(dòng)協(xié)議
- 二零二五版SAP系統(tǒng)企業(yè)級(jí)數(shù)據(jù)倉庫建設(shè)合同2篇
- 2025年度毛石擋墻施工質(zhì)量檢測合同模板下載4篇
- 2025版馬戲團(tuán)動(dòng)物福利與保護(hù)合同3篇
- 課題申報(bào)書:大中小學(xué)鑄牢中華民族共同體意識(shí)教育一體化研究
- 巖土工程勘察課件0巖土工程勘察
- 《腎上腺腫瘤》課件
- 2024-2030年中國典當(dāng)行業(yè)發(fā)展前景預(yù)測及融資策略分析報(bào)告
- 《乘用車越野性能主觀評(píng)價(jià)方法》
- 幼師個(gè)人成長發(fā)展規(guī)劃
- 2024-2025學(xué)年北師大版高二上學(xué)期期末英語試題及解答參考
- 批發(fā)面包采購合同范本
- 乘風(fēng)化麟 蛇我其誰 2025XX集團(tuán)年終總結(jié)暨頒獎(jiǎng)盛典
- 2024年大數(shù)據(jù)分析公司與中國政府合作協(xié)議
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)匯編
評(píng)論
0/150
提交評(píng)論