vc學(xué)習(xí)教程界面設(shè)計_第1頁
vc學(xué)習(xí)教程界面設(shè)計_第2頁
vc學(xué)習(xí)教程界面設(shè)計_第3頁
vc學(xué)習(xí)教程界面設(shè)計_第4頁
vc學(xué)習(xí)教程界面設(shè)計_第5頁
已閱讀5頁,還剩111頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第6章框架窗口界面設(shè)計

6.1框架窗口

6.2菜單

6.3工具欄

6.4狀態(tài)欄

6.5交互對象動態(tài)更新

6.6圖標(biāo)和光標(biāo)

第1頁6.1框架窗口

6.1.1單文檔和多文檔程序框架窗口

文檔應(yīng)用程序MFC類構(gòu)造

如圖是單文檔應(yīng)用程序Ex_SDI和多文檔應(yīng)用程序Ex_MDIMFC類構(gòu)造。

CAboutDlg是每一種應(yīng)用程序框架都有,用來顯示本程序有關(guān)信息。

CEx_SDIApp和CEx_MDIApp是應(yīng)用程序類,是從CWinApp類派生而來,負(fù)責(zé)應(yīng)用程序創(chuàng)建、運(yùn)行和終止,每一種應(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派生。

第2頁6.1框架窗口 CChildFrame類是從CMDIChildWnd派生而來,專門用來管理多文檔應(yīng)用程序中文檔窗口。無論是CMDIChildWnd還是CMDIFrameWnd類,它們都是從CFrameWnd派生而來。 對于基于對話框應(yīng)用程序,一般有CAboutDlg類、應(yīng)用程序類和對話框類。 上述MFC類之間繼承和派生關(guān)系如圖6.2所示。

圖6.2MFC類基本層次構(gòu)造CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd第3頁6.1框架窗口項目標(biāo)文獻(xiàn)組織

項目中源文獻(xiàn)都是采取文獻(xiàn)夾方式進(jìn)行管理,將項目名作為文獻(xiàn)夾名,此文獻(xiàn)夾下包括源程序代碼文獻(xiàn)、項目文獻(xiàn)以及項目工作區(qū)文獻(xiàn)等。每一種類源代碼均保存同名h和cpp文獻(xiàn)。其他某些文獻(xiàn)類型含義:

.opt 有關(guān)開發(fā)環(huán)境參數(shù)文獻(xiàn),如工具條位置等信息

.aps(AppStudioFile) 資源輔助文獻(xiàn),二進(jìn)制格式

.clw ClassWizard信息文獻(xiàn)

.dsp(DeveloperStudioProject) 項目文獻(xiàn)

.plg 編譯信息文獻(xiàn)

.mdp(MicrosoftDevStudioProject) 舊版本項目文獻(xiàn)

.bsc 用于瀏覽項目信息

.map 執(zhí)行文獻(xiàn)映像信息紀(jì)錄文獻(xiàn)

.pch(Pre-CompiledFile) 預(yù)編譯文獻(xiàn),能夠加快編譯速度,不過文獻(xiàn)非常大

.pdb(ProgramDatabase) 統(tǒng)計程序有關(guān)某些數(shù)據(jù)和調(diào)試信息

.ncb 無編譯瀏覽文獻(xiàn)(nocompilebrowser)

尚有對應(yīng)Debug(調(diào)試)、Res(資源)等子文獻(xiàn)夾。用應(yīng)用程序向?qū)?chuàng)建項目時,系統(tǒng)自動為項目創(chuàng)建Win32Debug版本運(yùn)行程序,并使用對應(yīng)默認(rèn)配備。程序編連后,用于該項目標(biāo)可執(zhí)行文獻(xiàn)以及其他調(diào)試信息文獻(xiàn)都安放在Debug文獻(xiàn)夾中。程序項目有一種Win32Release版本,與Release區(qū)分在于:Debug版本運(yùn)行程序有對應(yīng)調(diào)試信息碼,Release版本運(yùn)行程序沒有,但Release版本運(yùn)行程序通過代碼優(yōu)化,其程序運(yùn)行效率被最大提升。選擇“編譯”

“配備”菜單命令,在“配備”對話框?qū)㈨椖吭O(shè)置成Win32Release版本。

第4頁6.1框架窗口主框架窗口和文檔窗口

主框架窗口是直接放置在桌面(DeskTop)上那個窗口,每個應(yīng)用程序只能有一種主框架窗口。主框架窗口負(fù)責(zé)管理各個顧客交互對象并根據(jù)顧客操作對應(yīng)地創(chuàng)建或更新文檔窗口及其視圖。文檔窗口對SDI程序來說,和主框架窗口是一致,主框架窗口就是文檔窗口;對于MDI程序,文檔窗口是主框架窗口子窗口,如圖。文檔窗口一般都有對應(yīng)可見邊框,它客戶區(qū)(除了窗口標(biāo)題欄、邊框外區(qū)域)是由對應(yīng)視圖來組成,因此能夠說視圖是文檔窗口內(nèi)子窗口。文檔窗口時刻跟蹤目前處于活動狀態(tài)視圖變化,并將顧客或系統(tǒng)產(chǎn)生消息傳遞給目前活動視圖。

第5頁6.1框架窗口6.1.2窗口狀態(tài)變化

MFCAppWizard為每個窗口設(shè)置了對應(yīng)大小和位置。 運(yùn)行程序時,會自動調(diào)用框架內(nèi)部WinMain函數(shù),并自動查找該應(yīng)用程序類全局變量theApp,然后自動調(diào)用顧客應(yīng)用程序類虛函數(shù)InitInstance,該函數(shù)會深入調(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頁6.1框架窗口

通過指定ShowWindow函數(shù)參數(shù)值能夠變化變化窗口顯示狀態(tài)。例如下面代碼是將窗口初始狀態(tài)設(shè)置為“最小化”:

BOOLCEx_SDIApp::InitInstance() { ... m_pMainWnd->ShowWindow(SW_SHOWMINIMIZED); m_pMainWnd->UpdateWindow(); returnTRUE; }第7頁6.1框架窗口6.1.3窗口格調(diào)設(shè)置

窗口格調(diào)

一般有一般和擴(kuò)展兩種形式。可在函數(shù)CWnd::Create或CWnd::CreateEx參數(shù)中指定,CreateEx函數(shù)可同步支持以上兩種格調(diào),CWnd::Create只能指定窗口一般格調(diào)。控件和對話框窗口格調(diào)可直接通過其屬性對話框來設(shè)置。

除了上述格調(diào)外,框架窗口尚有下列三個自己格調(diào)。它們都能夠在PreCreateWindow重載函數(shù)CREATESTRUCT構(gòu)造中指定。

FWS_ADDTOTITLE

該格調(diào)指定有關(guān)信息如文檔名添加到框架窗口標(biāo)題背面。

FWS_PREFIXTITLE

該格調(diào)使得框架窗口標(biāo)題中文檔名顯示在應(yīng)用程序名之前。

FWS_SNAPTOBARS

該格調(diào)用來調(diào)整窗口大小,使它剛好包括了框架窗口中控制欄。

第8頁6.1框架窗口在MFCAppWizard中進(jìn)行修改

[例Ex_SDI]在向?qū)е行薷拇翱诟裾{(diào)。

(1)選擇“文獻(xiàn)”

“新建”,選擇“工程”,選擇MFCAppWizard(exe)項目類型,指定項目工作文獻(xiàn)夾位置,輸入項目名Ex_SDI,單擊[確定]按鈕。(2)

在向?qū)У谝徊街校瑢?yīng)用程序類型選為“單個文檔”(SDI)。(3)單擊[下一種],如圖,能夠選擇程序中是否加入數(shù)據(jù)庫支持。(4)單擊[下一種],出現(xiàn)向?qū)У谌綄υ捒颍鐖D,允許在程序中加入復(fù)合文檔、自動化、ActiveX控件支持。

第9頁6.1框架窗口

(5)單擊[下一種],如圖,對話框前幾項依次確定對浮開工具條、打印與預(yù)覽以及通信網(wǎng)絡(luò)等特性支持。對話框最后兩項是近來文獻(xiàn)列表數(shù)目標(biāo)設(shè)置(默認(rèn)時為4)和一種[高級]按鈕

。第10頁6.1框架窗口

(6)在第四步對話框中,單擊[高級],如圖,分別用于文檔模板字串資源內(nèi)容和窗口格調(diào)修改。

第11頁6.1框架窗口 (7)單擊[關(guān)閉],單擊[下一種],如圖??蛇x擇:應(yīng)用程序主窗口是MFC標(biāo)準(zhǔn)格調(diào)還是窗口左邊有切分窗口瀏覽器格調(diào),在源文獻(xiàn)中是否加入注釋用來引導(dǎo)顧客編寫程序代碼,是使用動態(tài)鏈接庫(DLL)還是靜態(tài)鏈接庫。

(8)單擊[下一種]按鈕,出現(xiàn)如圖6.9所示對話框。在這里,顧客能夠?qū)FCAppWizard提供默認(rèn)類名、基類名、各個源文獻(xiàn)名進(jìn)行修改。

第12頁6.1框架窗口(9)

單擊[完成],單擊[確定],回到主界面。在向?qū)е凶鞒鲞x擇,有部分內(nèi)容反應(yīng)在CEx_SDIApp::InitInstance函數(shù)中,代碼:BOOLCEx_SDIApp::InitInstance(){//若顧客在MFCAppWizard第三步中,選中了“ActiveXControls”,

//則表達(dá)所創(chuàng)建應(yīng)用程序支持ActiveX控件

AfxEnableControlContainer();

//若顧客在MFCAppWizard第四步中,選中了“3Dcontrols” //則表達(dá)所創(chuàng)建應(yīng)用程序支持3D控件格調(diào)

#ifdef_AFXDLL Enable3dControls(); //使用MFC動態(tài)鏈接庫3D控件

#else Enable3dControlsStatic(); //使用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ù)值,其中包括近來文獻(xiàn)列表文獻(xiàn)名

LoadStdProfileSettings();… returnTRUE; }第13頁6.1框架窗口修改CREATESTRUCT構(gòu)造

窗口創(chuàng)建前,自動調(diào)用PreCreateWindow虛函數(shù)。用MFCAppWizard創(chuàng)建文檔應(yīng)用程序構(gòu)造時,MFC已為主窗口或文檔窗口類自動重載了該虛函數(shù)。能夠在此函數(shù)中通過修改CREATESTRUCT構(gòu)造來設(shè)置窗口絕大多數(shù)格調(diào)。 對于多文檔應(yīng)用程序,文檔窗口格調(diào)可用下列代碼更改:

BOOLCChildFrame::PreCreateWindow(CREATESTRUCT&cs) { //創(chuàng)建不具有[最大化]按鈕子窗口

cs.style&=~WS_MAXIMIZEBOX; //調(diào)用基類PreCreateWindow函數(shù)

returnCMDIChildWnd::PreCreateWindow(cs); }第14頁6.1框架窗口使用ModifyStyle和ModifyStyleEx

ModifyStyleEx可更改窗口擴(kuò)展格調(diào)。兩個函數(shù)具有相同參數(shù),含義。

BOOLModifyXXXX(DWORDdwRemove,DWORDdwAdd,UINTnFlags=0);

參數(shù)dwRemove 指定需要刪除格調(diào),dwAdd指定需要增加格調(diào),nFlags表達(dá)SetWindowPos標(biāo)志??蚣艽翱谠O(shè)定擴(kuò)展格調(diào)只能通過調(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); }第15頁6.1框架窗口6.1.4變化窗口大小和位置

CWnd類組員函數(shù)SetWindowPos或MoveWindow能夠變化窗口大小和位置。SetWindowPos能夠變化窗口大小、位置,還能夠變化所有窗口在堆棧排列次序(Z次序),這個次序是根據(jù)它們在屏幕出現(xiàn)先后來確定。

BOOLSetWindowPos(constCWnd*pWndInsertAfter,intx,inty,int

cx,int

cy,UINT

nFlags);

參數(shù)pWndInsertAfter 表達(dá)窗口對象指針,下列預(yù)定義窗口對象地址:

wndBottom 將窗口放置在Z次序中底層

wndTop 將窗口放置在Z次序中頂層

wndTopMost 設(shè)置最頂窗口

wndNoTopMost 將窗口放置在所有最頂層背面,若此窗口不是最頂窗口,則此標(biāo)志無效。

x和y表達(dá)窗口新左上角坐標(biāo),cx和cy分別表達(dá)表達(dá)窗口新寬度和高度,nFlags表達(dá)窗口新大小和位置方式。

第16頁6.1框架窗口

函數(shù)CWnd::MoveWindow也可用來變化窗口大小和位置,必須在MoveWindow函數(shù)中指定窗口大小。

voidMoveWindow(intx,int

y,int

nWidth,intnHeight,BOOL

bRepaint=TRUE); voidMoveWindow(LPCRECT

lpRect,BOOLbRepaint

=TRUE);

參數(shù)x和y表達(dá)

窗口新左上角坐標(biāo),nWidth和nHeight表達(dá)窗口新寬度和高度,bRepaint用于指定窗口是否重繪,lpRect表達(dá)窗口新大小和位置。例如,在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ù),用來獲取窗口在屏幕位置和大小。

第17頁6.2菜單

許多程序員對于菜單設(shè)計都遵循下列某些規(guī)則:l

若選擇某菜單項會彈出一對話框,那么在該菜單項文本后有“…”。l

若某項菜單有子菜單,那么在該菜單項文本后有“

”。l

若菜單項需要助記符,用括號將帶下劃線字母括起來。助記符與Alt組成一種組合鍵,當(dāng)按住“Alt”鍵不放,敲擊該字母時,對應(yīng)菜單項就會被選中。l若某項菜單需要快捷鍵支持,則一般將其列在對應(yīng)菜單項文本之后。所謂“快捷鍵”是一種組合鍵,如Ctrl+N,使用時是先按下“Ctrl”健不放,然后再按“N”鍵。任何時候按下快捷鍵,對應(yīng)菜單命令都會被執(zhí)行。

圖6.11菜單樣例子第18頁6.2菜單6.2.1更改應(yīng)用程序菜單

菜單“文獻(xiàn)”

“打開工作區(qū)”。在工作區(qū)中選擇ResourceView頁面,雙擊資源“Menu”中IDR_MAINFRAME,通過菜單編輯器修改菜單資源IDR_MAINFRAME,能夠為程序重新指定一種菜單,下面示例過程:(1)

打開前面單文檔應(yīng)用程序Ex_SDI。(2)按快捷鍵Ctrl+R,在資源類型中選定“Menu”,如圖。

(3)單擊[新建],如圖。

第19頁6.2菜單 (4)在MenuID_MENU1上右擊鼠標(biāo),選擇“Properties”命令,如圖,能夠重新指定菜單資源ID,設(shè)置菜單資源語言和條件,這個條件用來決定菜單資源包括到哪個環(huán)境中,例如當(dāng)指定條件為_DEBUG,則菜單資源只存在于Debug編譯環(huán)境中。

(5)菜單ID_MENU1添加一種頂層彈出菜單項“測試(&T)”,并在該菜單下添加一種子菜單項“返回(&R)”,ID設(shè)為ID_TEST_RETURN,如圖。

(6)打開Ex_SDI程序菜單資源IDR_MAINFRAME,在“查看”菜單最后添加一種子菜單項“顯示測試菜單(&M)”,ID設(shè)為ID_VIEW_TEST。

(7)為CMainFrame類添加一種CMenu類型組員變量m_NewMenu,CMenu類是用來處理菜單一種MFC類。

第20頁6.2菜單(8)按快捷鍵Ctrl+W,切換到MessageMaps頁面,從“Classname”列表中選擇CMainFrame,分別為菜單項ID_VIEW_TEST和ID_TEST_RETURN添加COMMAND消息映射,使用默認(rèn)消息映射函數(shù)名,并添中下列代碼:

voidCMainFrame::OnViewTest() { m_NewMenu.Detach(); //使菜單對象和菜單句柄分離

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使菜單對象與菜單句柄分離。調(diào)用LoadMenu后,菜單對象m_NewMenu就擁有一種菜單句柄,再次調(diào)用LoadMenu時,發(fā)生運(yùn)行時錯誤,當(dāng)菜單對象與菜單句柄分離后,就能夠再創(chuàng)建菜單。SetMenu是CWnd類一種組員函數(shù),用來設(shè)置應(yīng)用程序菜單。(9)編譯運(yùn)行并測試。

第21頁6.2菜單6.2.2使用鍵盤快捷鍵

通過上述菜單系統(tǒng),能夠選擇幾乎所有可用命令和選項,確保了菜單命令系統(tǒng)完整性,菜單系統(tǒng)操作效率不高。對于那些反復(fù)使用命令,有必要深入提升效率,于是加速鍵應(yīng)運(yùn)而生。一種加速鍵就是一種按鍵或幾個按鍵組合,用于激活特定命令。加速鍵也是一種資源。

例如:為前面兩個菜單ID_VIEW_TEST和ID_TEST_RETURN定義鍵盤快捷鍵:

(1)打開上例工作區(qū)窗口中Accelerator資源項,雙擊IDR_MAINFRAME,如圖。

第22頁6.2菜單 (2)建立一新加速鍵,雙擊加速鍵列表最下端空行,彈出如圖“AccelProperities”(加速鍵屬性)對話框,可設(shè)置屬性如表。

第23頁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)題改成“顯示測試菜單(&M)\tCtrl+1”,其中“\t”是將背面“Ctrl+1”定位到一種水平制表位。(5)編譯運(yùn)行并測試。當(dāng)程序運(yùn)行后,按“Ctrl+1”和“Ctrl+2”將執(zhí)行對應(yīng)菜單命令。

第24頁6.2菜單6.2.3菜單編程控制

創(chuàng)建菜單

CreateMenu和CreatePopupMenu用來創(chuàng)建一種菜單或子菜單框架,原型:

BOOLCreateMenu();

//

產(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表達(dá)新菜單項ID號,lpszNewItem表達(dá)新菜單項內(nèi)容,pBmp用于菜單項位圖指針,nPosition表達(dá)新菜單項要插入菜單項位置。nFlags表達(dá)要增加新菜單項狀態(tài)信息。

第25頁6.2菜單

注意:l

當(dāng)nFlags為MF_BYPOSITION時,nPosition表達(dá)新菜單項要插入詳細(xì)位置,為0時表達(dá)第一種菜單項,為

-1時,將菜單項添加菜單末尾處。l

nFlags標(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來更新菜單。

第26頁6.2菜單刪除菜單項

DeleteMenu函數(shù)可將菜單項刪除,注意:調(diào)用該函數(shù)后,不論菜單依附窗口是否變化,都應(yīng)調(diào)用CWnd::DrawMenuBar使菜單更新。函數(shù)原型:

BOOLDeleteMenu(UINTnPosition,UINTnFlags);

nPosition表達(dá)要刪除菜單項位置,由nFlags進(jìn)行說明。nFlags為MF_BYCOMMAND時,nPosition表達(dá)菜單項ID號,nFlags為MF_BYPOSITION時,nPosition表達(dá)菜單項位置。

獲取菜單項

下面四個CMenu組員函數(shù)分別取得菜單項數(shù)、菜單項ID號、菜單項文本內(nèi)容以及彈出式子菜單句柄。

UINTGetMenuItemCount()const;//用來取得菜單菜單項數(shù)。

UINTGetMenuItemID(intnPos)const;//用來取得由nPos指定菜單項位置菜單項標(biāo)識號。

intGetMenuString(UINTnIDItem,CString&rString,UINTnFlags)const; //取得由nIDItem指定菜單項位置菜單項文本內(nèi)容,由rString參數(shù)返回,nFlags為MF_BYPOSITION時,nPosition表達(dá)菜單項位置。

CMenu*GetSubMenu(intnPos)const; //用來取得指定菜單彈出式菜單菜單句柄。

第27頁6.2菜單示例

示例過程利用CMenu組員函數(shù)向應(yīng)用程序菜單中添加并處理一種菜單項:(1)

打開前面單文檔應(yīng)用程序Ex_SDI或重新創(chuàng)建。(2)“查看”菜單

“ResourceSymbols…”,如圖。(3)單擊[新建],如圖。在名字框中輸入標(biāo)識符ID_NEW_MENUITEM。在值框中輸入ID值,單擊[確定]。

第28頁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; }第29頁6.2菜單(5)

用MFCClassWizard處理OnCommand消息并檢測顧客菜單nID參數(shù)。

BOOLCMainFrame::OnCommand(WPARAMwParam,LPARAMlParam) { //wParam低字節(jié)表達(dá)菜單、控件、加速鍵命令I(lǐng)D if(LOWORD(wParam)==ID_NEW_MENUITEM) MessageBox("你選中了新菜單項"); returnCFrameWnd::OnCommand(wParam,lParam); }(6)編譯運(yùn)行并測試。這樣當(dāng)選擇菜單“編輯”

“新菜單項”命令后,就會彈一種對話框,顯示“你選中了新菜單項”消息。

第30頁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表達(dá)菜單在屏幕顯示位置以及鼠標(biāo)按鈕標(biāo)志,如表。x和y表達(dá)菜單水平坐標(biāo)和菜單頂端垂直坐標(biāo)。pWnd表達(dá)彈出菜單窗口,此窗口將收到菜單所有WM_COMMAND消息。lpRect是一種RECT構(gòu)造或CRect對象指針,表達(dá)一種矩形區(qū)域,單擊這個區(qū)域時,彈出菜單不消失。lpRect為NULL時,在菜單外面單擊鼠標(biāo),菜單立即消失。

第31頁6.2菜單示例

顯示主菜單IDR_MAINFRAME時,右擊鼠標(biāo)彈出“查看”菜單子菜單,顯示菜單IDR_MENU1時,右擊鼠標(biāo)彈出“測試”菜單子菜單。詳細(xì)步驟:(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;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)行并測試。

第32頁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)接觸到前一種相鄰按鈕時,則此按鈕前面空格消失,背面空格保存。

第33頁6.3工具欄工具欄按鈕屬性設(shè)置

第34頁6.3工具欄6.3.2工具按鈕和菜單項相結(jié)合

指選擇工具按鈕或菜單命令時,操作成果是同樣。使它們結(jié)合詳細(xì)辦法是在工具按鈕屬性對話框中將按鈕ID號設(shè)置為有關(guān)聯(lián)菜單項ID。

例如:示例是在前面Ex_SDI上進(jìn)行,通過兩個工具按鈕分別顯示主菜單IDR_MAINFRAME和菜單IDR_MENU1。詳細(xì)步驟:(1)

打開前面單文檔應(yīng)用程序Ex_SDI。(2)利用工具欄編輯器設(shè)計兩個工具按鈕,如圖。

第35頁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)編譯運(yùn)行并測試。將鼠標(biāo)移至設(shè)計第一種工具按鈕處,這時在狀態(tài)欄上顯示出“返回應(yīng)用程序主菜單”信息,若稍等半晌后,還會彈出提醒小窗口,顯示出“返回主菜單”字樣,如圖。單擊新添加這兩個按鈕,會執(zhí)行對應(yīng)菜單命令。

第36頁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類封裝了工具欄操作。

第37頁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(&m_wndToolBar); DockControlBar(&m_wndTestBar);

… return0;}第38頁6.3工具欄 (7)編譯運(yùn)行,如圖。

(8)

需要調(diào)用CFrameWnd類組員函數(shù)ShowControlBar來使程序一開始運(yùn)行時隱藏工具欄IDR_TOOLBAR1。在CMainFrame::OnCreate中添加代碼:

intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) { … ShowControlBar(&m_wndTestBar,FALSE,FALSE); //關(guān)閉測試工 具欄

return0; }第39頁6.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)行成果,右邊是單擊按鈕運(yùn)行成果。

第40頁6.4狀態(tài)欄

6.4.1狀態(tài)欄定義

AppWizard創(chuàng)建SDI或MDI應(yīng)用程序框架中,有一種靜態(tài)indicator數(shù)組,是在MainFrm.cpp文獻(xiàn)中定義,被MFC用作狀態(tài)欄定義。

數(shù)組中元素是某些標(biāo)識常量或是字串資源ID號。圖列出了indicators數(shù)組元素與標(biāo)準(zhǔn)狀態(tài)欄窗格關(guān)系。

StaticUINTindicators[]={ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,}圖6.28indicators數(shù)組定義第41頁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, };第42頁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=&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); }第43頁6.4狀態(tài)欄(5)

將MainFrm.h文獻(xiàn)中受保護(hù)變量m_wndStatusBar變成公共變量。(6)

在Ex_SDIMouseView.cpp文獻(xiàn)開始處增加下列語句:

#include"Ex_SDIMouseView.h" #include"MainFrm.h“(7)編譯并運(yùn)行,如圖。

第44頁6.4狀態(tài)欄6.4.3變化狀態(tài)欄格調(diào)

在MFCCStatusBar類中,有兩個組員函數(shù)能夠變化狀態(tài)欄格調(diào),它們是:

voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth); voidSetPaneStyle(intnIndex,UINTnStyle);

參數(shù)nIndex表達(dá)要設(shè)置狀態(tài)欄窗格索引,nID為狀態(tài)欄窗格指定新ID,cxWidth表達(dá)窗格像素寬度,nStyle表達(dá)窗格格調(diào)類型,指定窗格外觀,例如SBPS_POPOUT表達(dá)窗格是凸起來,見表。

第45頁6.5交互對象動態(tài)更新

在前面Ex_SDI基礎(chǔ)上,單擊工具按鈕,該按鈕被按下,按鈕彈起,單擊工具按鈕時,該按鈕被按下,按鈕彈起,如此反復(fù)。詳細(xì)步驟:

(1)

打開上例單文檔應(yīng)用程序項目Ex_SDI。(2)

為CMainFrame添加一種BOOL型組員變量m_bMainWork,將m_bMainWork初值設(shè)為TRUE。(3)

在CMainFrame類中添加工具按鈕ID_VIEW_TEST和ID_TEST_RETURNUPDATE_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); }第46頁6.5交互對象動態(tài)更新(4)在CMainFrame::OnViewTest和CMainFrame::OnTestReturn添加代碼:

voidCMainFrame::OnViewTest() { … m_bMainWork=FALSE; } voidCMainFrame::OnTestReturn() { … m_bMainWork=TRUE; }(5)編譯運(yùn)行并測試,如圖。

第47頁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è)備按鈕第48頁6.6圖標(biāo)和光標(biāo)選用和定制顯示設(shè)備

圖形編輯器上,有一種NewDeviceImage按鈕,單擊,如圖。

單擊[定制],如圖。設(shè)置光標(biāo)熱點

借助光標(biāo)“熱點”確定光標(biāo)實際位置。如圖。

設(shè)置熱點按鈕第49頁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);

第50頁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構(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。

第51頁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(); //重繪窗口

}

}第52頁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); }第53頁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)編譯并運(yùn)行。能夠看到任務(wù)欄上按鈕以及應(yīng)用程序標(biāo)題欄上四個圖標(biāo)循環(huán)顯示動態(tài)效果,顯示速度為每秒兩幀。

第54頁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;

第55頁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表達(dá)擁有光標(biāo)窗口指針,nHitTest用來表達(dá)光標(biāo)所處位置。message用來表達(dá)鼠標(biāo)消息。 在OnSetCursor函數(shù)調(diào)用SetCursor來設(shè)置對應(yīng)光標(biāo),并將OnSetCursor函數(shù)返回TRUE,就可變化目前光標(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]”類型。第56頁6.6圖標(biāo)和光標(biāo)

(7)用圖形編輯器繪制光標(biāo)圖形,指定光標(biāo)熱點位置為(15,15),如圖。

第57頁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)

編譯運(yùn)行并測試。當(dāng)鼠標(biāo)移動到標(biāo)題欄時,光標(biāo)變成了globe.ani動畫光標(biāo),而當(dāng)移動到客戶區(qū)時,光標(biāo)變成了IDC_CURSOR1定義形狀。第58頁第6章框架窗口界面設(shè)計

6.1框架窗口

6.2菜單

6.3工具欄

6.4狀態(tài)欄

6.5交互對象動態(tài)更新

6.6圖標(biāo)和光標(biāo)

第59頁6.1框架窗口

6.1.1單文檔和多文檔程序框架窗口

文檔應(yīng)用程序MFC類構(gòu)造

如圖是單文檔應(yīng)用程序Ex_SDI和多文檔應(yīng)用程序Ex_MDIMFC類構(gòu)造。

CAboutDlg是每一種應(yīng)用程序框架都有,用來顯示本程序有關(guān)信息。

CEx_SDIApp和CEx_MDIApp是應(yīng)用程序類,是從CWinApp類派生而來,負(fù)責(zé)應(yīng)用程序創(chuàng)建、運(yùn)行和終止,每一種應(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派生。

第60頁6.1框架窗口 CChildFrame類是從CMDIChildWnd派生而來,專門用來管理多文檔應(yīng)用程序中文檔窗口。無論是CMDIChildWnd還是CMDIFrameWnd類,它們都是從CFrameWnd派生而來。 對于基于對話框應(yīng)用程序,一般有CAboutDlg類、應(yīng)用程序類和對話框類。 上述MFC類之間繼承和派生關(guān)系如圖6.2所示。

圖6.2MFC類基本層次構(gòu)造CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd第61頁6.1框架窗口項目標(biāo)文獻(xiàn)組織

項目中源文獻(xiàn)都是采取文獻(xiàn)夾方式進(jìn)行管理,將項目名作為文獻(xiàn)夾名,此文獻(xiàn)夾下包括源程序代碼文獻(xiàn)、項目文獻(xiàn)以及項目工作區(qū)文獻(xiàn)等。每一種類源代碼均保存同名h和cpp文獻(xiàn)。其他某些文獻(xiàn)類型含義:

.opt 有關(guān)開發(fā)環(huán)境參數(shù)文獻(xiàn),如工具條位置等信息

.aps(AppStudioFile) 資源輔助文獻(xiàn),二進(jìn)制格式

.clw ClassWizard信息文獻(xiàn)

.dsp(DeveloperStudioProject) 項目文獻(xiàn)

.plg 編譯信息文獻(xiàn)

.mdp(MicrosoftDevStudioProject) 舊版本項目文獻(xiàn)

.bsc 用于瀏覽項目信息

.map 執(zhí)行文獻(xiàn)映像信息紀(jì)錄文獻(xiàn)

.pch(Pre-CompiledFile) 預(yù)編譯文獻(xiàn),能夠加快編譯速度,不過文獻(xiàn)非常大

.pdb(ProgramDatabase) 統(tǒng)計程序有關(guān)某些數(shù)據(jù)和調(diào)試信息

.ncb 無編譯瀏覽文獻(xiàn)(nocompilebrowser)

尚有對應(yīng)Debug(調(diào)試)、Res(資源)等子文獻(xiàn)夾。用應(yīng)用程序向?qū)?chuàng)建項目時,系統(tǒng)自動為項目創(chuàng)建Win32Debug版本運(yùn)行程序,并使用對應(yīng)默認(rèn)配備。程序編連后,用于該項目標(biāo)可執(zhí)行文獻(xiàn)以及其他調(diào)試信息文獻(xiàn)都安放在Debug文獻(xiàn)夾中。程序項目有一種Win32Release版本,與Release區(qū)分在于:Debug版本運(yùn)行程序有對應(yīng)調(diào)試信息碼,Release版本運(yùn)行程序沒有,但Release版本運(yùn)行程序通過代碼優(yōu)化,其程序運(yùn)行效率被最大提升。選擇“編譯”

“配備”菜單命令,在“配備”對話框?qū)㈨椖吭O(shè)置成Win32Release版本。

第62頁6.1框架窗口主框架窗口和文檔窗口

主框架窗口是直接放置在桌面(DeskTop)上那個窗口,每個應(yīng)用程序只能有一種主框架窗口。主框架窗口負(fù)責(zé)管理各個顧客交互對象并根據(jù)顧客操作對應(yīng)地創(chuàng)建或更新文檔窗口及其視圖。文檔窗口對SDI程序來說,和主框架窗口是一致,主框架窗口就是文檔窗口;對于MDI程序,文檔窗口是主框架窗口子窗口,如圖。文檔窗口一般都有對應(yīng)可見邊框,它客戶區(qū)(除了窗口標(biāo)題欄、邊框外區(qū)域)是由對應(yīng)視圖來組成,因此能夠說視圖是文檔窗口內(nèi)子窗口。文檔窗口時刻跟蹤目前處于活動狀態(tài)視圖變化,并將顧客或系統(tǒng)產(chǎn)生消息傳遞給目前活動視圖。

第63頁6.1框架窗口6.1.2窗口狀態(tài)變化

MFCAppWizard為每個窗口設(shè)置了對應(yīng)大小和位置。 運(yùn)行程序時,會自動調(diào)用框架內(nèi)部WinMain函數(shù),并自動查找該應(yīng)用程序類全局變量theApp,然后自動調(diào)用顧客應(yīng)用程序類虛函數(shù)InitInstance,該函數(shù)會深入調(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ù)顯示窗口。

第64頁6.1框架窗口

通過指定ShowWindow函數(shù)參數(shù)值能夠變化變化窗口顯示狀態(tài)。例如下面代碼是將窗口初始狀態(tài)設(shè)置為“最小化”:

BOOLCEx_SDIApp::InitInstance() { ... m_pMainWnd->ShowWindow(SW_SHOWMINIMIZED); m_pMainWnd->UpdateWindow(); returnTRUE; }第65頁6.1框架窗口6.1.3窗口格調(diào)設(shè)置

窗口格調(diào)

一般有一般和擴(kuò)展兩種形式??稍诤瘮?shù)CWnd::Create或CWnd::CreateEx參數(shù)中指定,CreateEx函數(shù)可同步支持以上兩種格調(diào),CWnd::Create只能指定窗口一般格調(diào)??丶蛯υ捒虼翱诟裾{(diào)可直接通過其屬性對話框來設(shè)置。

除了上述格調(diào)外,框架窗口尚有下列三個自己格調(diào)。它們都能夠在PreCreateWindow重載函數(shù)CREATESTRUCT構(gòu)造中指定。

FWS_ADDTOTITLE

該格調(diào)指定有關(guān)信息如文檔名添加到框架窗口標(biāo)題背面。

FWS_PREFIXTITLE

該格調(diào)使得框架窗口標(biāo)題中文檔名顯示在應(yīng)用程序名之前。

FWS_SNAPTOBARS

該格調(diào)用來調(diào)整窗口大小,使它剛好包括了框架窗口中控制欄。

第66頁6.1框架窗口在MFCAppWizard中進(jìn)行修改

[例Ex_SDI]在向?qū)е行薷拇翱诟裾{(diào)。

(1)選擇“文獻(xiàn)”

“新建”,選擇“工程”,選擇MFCAppWizard(exe)項目類型,指定項目工作文獻(xiàn)夾位置,輸入項目名Ex_SDI,單擊[確定]按鈕。(2)

在向?qū)У谝徊街校瑢?yīng)用程序類型選為“單個文檔”(SDI)。(3)單擊[下一種],如圖,能夠選擇程序中是否加入數(shù)據(jù)庫支持。(4)單擊[下一種],出現(xiàn)向?qū)У谌綄υ捒颍鐖D,允許在程序中加入復(fù)合文檔、自動化、ActiveX控件支持。

第67頁6.1框架窗口

(5)單擊[下一種],如圖,對話框前幾項依次確定對浮開工具條、打印與預(yù)覽以及通信網(wǎng)絡(luò)等特性支持。對話框最后兩項是近來文獻(xiàn)列表數(shù)目標(biāo)設(shè)置(默認(rèn)時為4)和一種[高級]按鈕

。第68頁6.1框架窗口

(6)在第四步

溫馨提示

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

最新文檔

評論

0/150

提交評論