專業(yè)課面向?qū)ο蟪绦蛟O(shè)計(jì)第10章_第1頁(yè)
專業(yè)課面向?qū)ο蟪绦蛟O(shè)計(jì)第10章_第2頁(yè)
專業(yè)課面向?qū)ο蟪绦蛟O(shè)計(jì)第10章_第3頁(yè)
專業(yè)課面向?qū)ο蟪绦蛟O(shè)計(jì)第10章_第4頁(yè)
專業(yè)課面向?qū)ο蟪绦蛟O(shè)計(jì)第10章_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1第10章資源2

應(yīng)用程序可以使用幾種不同類型的資源,如菜單、加速鍵、工具欄、狀態(tài)條、圖標(biāo)、位圖、對(duì)話框和字符串等。在MFC中創(chuàng)建應(yīng)用程序的資源,可以使用可視化的資源編輯器(ResourceEditor),在資源編輯器中,程序員可以通過(guò)鼠標(biāo)的拖動(dòng)來(lái)編輯可視化資源,十分方便。 在Windows的可執(zhí)行文件中,資源是獨(dú)立于代碼的,使用單獨(dú)的資源編譯器進(jìn)行編譯,并嵌入到可執(zhí)行文件中。在編程過(guò)程中,代碼是可復(fù)用的,資源也是可復(fù)用的,通過(guò)資源的“導(dǎo)入”和“導(dǎo)出”功能來(lái)實(shí)現(xiàn)資源的復(fù)用。310.1菜單在標(biāo)準(zhǔn)的Windows應(yīng)用程序中,菜單通常有三類:系統(tǒng)菜單、程序主菜單和快捷菜單。系統(tǒng)菜單提供系統(tǒng)對(duì)程序主窗口的管理功能,通常在程序中既不需要控制也不需要改動(dòng)這種菜單,因此在此不作介紹。程序主菜單通常位于應(yīng)用程序的最頂端,大家所熟悉的文件、編輯、查看等菜單就是屬于程序的主菜單,其菜單項(xiàng)包含了程序的大部分功能??旖莶藛卧诖蟛糠值腤indows應(yīng)用程序中是很常見(jiàn)的。菜單從形式上分為下拉式和彈出式兩種。系統(tǒng)菜單、程序主菜單都是下拉式菜單,下拉式菜單由上層水平列表項(xiàng)以及與其相連的彈出式菜單組成,當(dāng)用戶選擇了上層某個(gè)列表項(xiàng)時(shí),與之關(guān)聯(lián)的彈出式菜單就會(huì)出現(xiàn),而且可以形成級(jí)聯(lián)菜單??旖莶藛螌儆趶棾鍪讲藛?,可以出現(xiàn)在屏幕的任何位置。

MFC類庫(kù)將菜單操作封裝在CMenu類中,所有關(guān)于菜單的操作都可以通過(guò)CMenu類的成員函數(shù)實(shí)現(xiàn)。菜單的基本屬性主要包括標(biāo)識(shí)符(ID)、標(biāo)題(Caption)和提示(Prompt)。410.1.1創(chuàng)建和編輯菜單

菜單可用于單文檔(SDI)、多文檔(MDI)以及基于對(duì)話框的應(yīng)用程序。在單文檔和多文檔應(yīng)用程序中編輯菜單資源的步驟如下:

(1)新建立一個(gè)單文檔或多文檔的應(yīng)用程序。

(2)在項(xiàng)目工作區(qū)中單擊資源視圖標(biāo)簽ResourceView,切換到資源視圖。

(3)展開(kāi)Menu節(jié)點(diǎn),雙擊菜單資源標(biāo)識(shí)符IDR_MAINFRAME,或右擊該標(biāo)識(shí)符,在彈出的快捷菜單中選擇“打開(kāi)”命令。在編輯區(qū)中彈出菜單編輯窗口,顯示IDR_MAINFRAME標(biāo)識(shí)的菜單資源。

(4)雙擊對(duì)應(yīng)菜單的空白菜單項(xiàng),添加所需菜單。例如要為“文件”添加“保存”菜單項(xiàng),選擇菜單欄中的“文件”命令顯示下拉菜單,雙擊菜單底部的空白處(若添加主菜單,則雙擊“幫助”后的空白處),打開(kāi)菜單項(xiàng)目屬性對(duì)話框

5在其中的“ID”和“標(biāo)明”里面分別輸入菜單命令的ID號(hào)和標(biāo)識(shí)符。例如:ID號(hào)為“ID_FILE_SAVE”,標(biāo)識(shí)符為“保存([&S])\tCtrl+S”,含義是設(shè)置熱鍵為Alt+S,加速鍵為Ctrl+S。

如果調(diào)整菜單位置,選中要調(diào)整位置的菜單項(xiàng),按住鼠標(biāo)左鍵拖動(dòng)到合適的位置放手即可。如果刪除菜單項(xiàng),首先選中菜單項(xiàng),按Delete鍵刪除即可。修改菜單項(xiàng)的方法與創(chuàng)建菜單項(xiàng)相似,雙擊想要修改的菜單項(xiàng),修改其屬性即可。6在基于對(duì)話框的應(yīng)用程序中,首先插入一個(gè)新的菜單資源,具體做法是單擊資源視圖標(biāo)簽ResourceView,切換到資源視圖,然后右擊Resource標(biāo)識(shí)符,在快捷菜單中選擇“插入”命令,在彈出的資源類型對(duì)話框中選擇Menu,擊新建就會(huì)進(jìn)入菜單編輯器,在設(shè)計(jì)并編輯菜單后,在該對(duì)話框的“屬性”選項(xiàng)卡中,將菜單屬性設(shè)置為該菜單的ID即可。710.1.2菜單消息常用的菜單消息有4種:1.ON_COMMAND消息ON_COMMAND消息是為了響應(yīng)用戶點(diǎn)擊普通菜單項(xiàng)的消息,需要添加對(duì)該消息進(jìn)行響應(yīng)的消息處理函數(shù)。2.ON_UPDATE_COMMAND_UI消息ON_UPDATE_COMMAND_UI消息也是在用戶點(diǎn)擊普通菜單項(xiàng)的時(shí)候產(chǎn)生的,在ON_COMMAND消息之前響應(yīng),用于在普通菜單項(xiàng)的前面加上“√”或去掉“√”。使用戶可以看出菜單項(xiàng)的當(dāng)前狀態(tài)。3.ON_COMMAND_RANGE消息ON_COMMAND_RANGE是為了響應(yīng)ID值連續(xù)的若干個(gè)ON_COMMAND消息而提供的,用于成組的菜單項(xiàng)的消息響應(yīng)。ON_COMMAND_RANGE消息為處理具有連續(xù)ID的菜單項(xiàng)提供了方便的途徑。當(dāng)我們對(duì)成組的菜單項(xiàng)操作時(shí),不論選中了這一組菜單項(xiàng)中的哪一個(gè),MFC都發(fā)來(lái)一個(gè)ON_COMMAND_RANGE消息,我們只需要對(duì)該消息編寫(xiě)一個(gè)消息處理函數(shù)。(只能手工添加消息響應(yīng)函數(shù))84.ON_UPDATE_COMMAND_UI_RANGE消息ON_UPDATE_COMMAND_UI_RANGE與ON_COMMAND_RANGE的關(guān)系和ON_UPDATE_COMMAND_UI與ON_COMMAND的關(guān)系類似,實(shí)現(xiàn)若干連續(xù)菜單項(xiàng)的狀態(tài)更新。用于在成組的菜單項(xiàng)的某一項(xiàng)前面加上“?”或去掉“?”,使成組的菜單項(xiàng)看起來(lái)會(huì)更人性化一些。對(duì)于后兩種消息只能手工添加消息響應(yīng)函數(shù)10.1.3菜單應(yīng)用實(shí)例【例10-1】創(chuàng)建一個(gè)基于單文檔結(jié)構(gòu)的應(yīng)用程序,在程序主菜單的“操作”菜單中增加三個(gè)菜單項(xiàng),“顯示”、“圖形”和“線形”?!皥D形”為級(jí)聯(lián)菜單,包括“直線”、“矩形”和“橢圓”三個(gè)命令選項(xiàng),“線形”也是一個(gè)級(jí)聯(lián)菜單,包括“虛線”、“點(diǎn)線”、“點(diǎn)劃線”三個(gè)菜單項(xiàng)。對(duì)各菜單操作時(shí)能執(zhí)行相應(yīng)的命令。用MFC進(jìn)行編程的具體步驟如下:(1)建立一個(gè)基于單文檔的工程ex10_1。(2)在菜單上添加各菜單項(xiàng)并設(shè)置好屬性,如表10-1所示。ID標(biāo)明分隔符彈出ID_OPER_SHOW

顯示\tCtrl+W

√圖形√ID_LINE直線ID_RECTANGLE矩形ID_ELLIPSE橢圓線形

√ID_STYLE1虛線ID_STYLE2點(diǎn)線ID_STYLE3點(diǎn)劃線(3)添加新的數(shù)據(jù)成員 菜單消息屬于命令消息,命令消息的消息響應(yīng)函數(shù)可以放到四個(gè)類中,本例中,菜單操作僅僅修改了用戶區(qū)的內(nèi)容,所以只對(duì)視圖類進(jìn)行修改。在項(xiàng)目的視圖類的頭文件中定義視圖類的成員變量。根據(jù)要顯示的內(nèi)容,考慮設(shè)置如下幾個(gè)變量:①整型變量m_Shape為1時(shí)畫(huà)直線,為2時(shí)畫(huà)矩形,為3時(shí)畫(huà)橢圓。②整型變量m_Style為1、2、3時(shí),線形分別為虛線、點(diǎn)線和點(diǎn)劃線。③整型變量m_MouseDown為1時(shí)說(shuō)明鼠標(biāo)已經(jīng)按下,鼠標(biāo)移動(dòng)時(shí)可以畫(huà)出圖形,否則不畫(huà)任何圖形。④COLORREF型變量m_pencolor存放當(dāng)前畫(huà)筆的顏色。⑤CPoint型變量m_LineOrg和m_LineEnd分別為直線、矩形和橢圓的起始點(diǎn)和終止點(diǎn)。12在ex10_1View.h中的classCEx10_1View::publicCview中的public處加入如下聲明:intm_Shape;//用戶可選圖形intm_Style;//用戶可選線形intm_MouseDown;//鼠標(biāo)按下?tīng)顟B(tài)COLORREFm_pencolor;//畫(huà)筆顏色CPointm_LineOrg;//直線、矩形和橢圓的起始點(diǎn)CPointm_LineEnd;//直線、矩形和橢圓的終止點(diǎn)13(4)在視圖類的構(gòu)造函數(shù)中給變量賦初值當(dāng)用戶建立一個(gè)基于單文檔的工程就創(chuàng)建了一個(gè)視圖類,就是窗口框架上的用戶區(qū),程序執(zhí)行時(shí),就建立了一個(gè)文檔類對(duì)象,同時(shí)建立了一個(gè)視圖對(duì)象,此時(shí)自動(dòng)執(zhí)行視圖類的構(gòu)造函數(shù)。在視圖類構(gòu)造函數(shù)初始化變量,代碼如下:CEx10_1View::CEx10_1View(){ //TODO:addconstructioncodeherem_pencolor=RGB(0,0,0);m_MouseDown=0;m_Shape=1;m_Style=1;} 14(5)對(duì)4種菜單消息進(jìn)行響應(yīng)①首先添加“直線”、“矩形”和“橢圓”消息處理函數(shù)。添加消息響應(yīng)函數(shù)可以使用類向?qū)?,也可以手工添加,使用類向?qū)нM(jìn)行消息映射已經(jīng)在前面介紹過(guò)了,下面介紹手工添加方法:在ex10_1View.h中添加語(yǔ)句如下:protected: //{{AFX_MSG(CMyResoruceView)afx_msgvoidOnLine();afx_msgvoidOnRectangle();afx_msgvoidOnEllipse(); //}}AFX_MSG15在ex10_1View.cpp文件中,添加代碼如下:BEGIN_MESSAGE_MAP(CEx10_1View,CView) //{{AFX_MSG_MAP(CMyResoruceView)ON_COMMAND(ID_LINE,OnLine)ON_COMMAND(ID_RECTANGLE,OnRectangle)ON_COMMAND(ID_ELLIPSE,OnEllipse) //}}AFX_MSG_MAP ...END_MESSAGE_MAP()16不論用哪種消息映射方法,都要編寫(xiě)消息處理函數(shù),如果是手工添加的消息映射,那么在ex10_1View.cpp文件中添加函數(shù)及代碼,如果是使用類向?qū)砑酉㈨憫?yīng)函數(shù)的話,此處只添加代碼,三個(gè)菜單項(xiàng)消息處理函數(shù)及代碼如下:voidCEx10_1View::OnLine()//直線菜單消息處理函數(shù){ //TODO:Addyourcommandhandlercodeherem_Shape=1;}voidCEx10_1View::OnRectangle()//矩形菜單消息處理函數(shù){ //TODO:Addyourcommandhandlercodeherem_Shape=2;}voidCEx10_1View::OnEllipse()//橢圓菜單消息處理函數(shù){ //TODO:Addyourcommandhandlercodeherem_Shape=3;}

17②單擊某個(gè)線形菜單項(xiàng)時(shí),要使線形發(fā)生改變,可以對(duì)ON_COMMAND_RANGE消息進(jìn)行響應(yīng)。由于ClassWizard不支持ON_COMMAND_RANGE消息的自動(dòng)映射,只能手工添加消息響應(yīng)函數(shù)。在ex10_1View.h中聲明消息響應(yīng)函數(shù),添加語(yǔ)句如下:protected: //{{AFX_MSG(CMyResoruceView)afx_msgvoidOnLine();afx_msgvoidOnRectangle();afx_msgvoidOnEllipse();afx_msgvoidOnStyleChange(WORDnID); //}}AFX_MSGON_COMMAND_RANGE消息的處理函數(shù)OnStyleChange()帶一個(gè)參數(shù)nID,就是當(dāng)前選中的菜單項(xiàng)的ID。18在ex10_1View.cpp文件中,添加代碼如下:BEGIN_MESSAGE_MAP(CEx10_1View,CView) //{{AFX_MSG_MAP(CMyResoruceView)ON_COMMAND(ID_LINE,OnLine)ON_COMMAND(ID_RECTANGLE,OnRectangle)ON_COMMAND(ID_ELLIPSE,OnEllipse)ON_COMMAND_RANGE(ID_STYLE1,ID_STYLE3,OnStyleChange)

//ID范圍的最小值,ID范圍的最大值,消息處理函數(shù)

//}}AFX_MSG_MAP ...END_MESSAGE_MAP()在ex10_1View.cpp的最后加入消息處理函數(shù)及代碼:voidCEx10_1View::OnStyleChange(WORDnID){m_Style=nID-ID_STYLE1+1;}19③為使被選中的菜單項(xiàng)前面標(biāo)記選中狀態(tài)“√”,需要給“直線”、“矩形”和“橢圓”菜單項(xiàng)添加UPDATE_COMMAND_Ul消息響應(yīng)函數(shù),使用類向?qū)нM(jìn)行消息映射,接受默認(rèn)的消息處理函數(shù)名OnUpdateLine、OnUpateRectangle和OnUpateEllipse。添加代碼如下:voidCEx10_1View::OnUpateLine(CCmdUI*pCmdUI){ //TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->SetCheck(m_Shape==1?1:0);}voidCEx10_1View::OnUpateRectangle(CCmdUI*pCmdUI){ //TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->SetCheck(m_Shape==2?1:0);}voidCEx10_1View::OnUpateEllipse(CCmdUI*pCmdUI){ //TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->SetCheck(m_Shape==3?1:0);}

20只要是UI消息,都會(huì)自動(dòng)帶一個(gè)指針參數(shù),通過(guò)它可以調(diào)用CCmdUI類的方法。常用的CCmdUI類方法及說(shuō)明如表10-2所示。方法功能voidEnable(BOOLbOn=TRUE)禁止或允許該菜單項(xiàng),TRUE允許該菜單項(xiàng);FALSE禁止該菜單項(xiàng)voidSetCheck(intnCheck=1)設(shè)置菜單項(xiàng)或工具欄按鈕的check狀態(tài),顯示標(biāo)志為“√”,0表示無(wú)check狀態(tài);1表示check狀態(tài);voidSetRadio(BOOLbOn=TRUE)與SetCheck功能類似,顯示標(biāo)志為“·”voidSetText(LPCTSTRlpszText)設(shè)置菜單項(xiàng)的標(biāo)明屬性21④單擊某個(gè)線形菜單項(xiàng)時(shí),要使線形發(fā)生改變的同時(shí),所選線形菜單項(xiàng)的前面加點(diǎn)。當(dāng)我們對(duì)具有連續(xù)ID值的菜單項(xiàng)操作時(shí),不論選中了這三個(gè)中的哪一個(gè),MFC都發(fā)來(lái)一個(gè)ON_COMMAND_RANGE消息(后發(fā))和ON_UPDATE_COMMAND_UI_RANGE(先發(fā))消息。對(duì)ON_UPDATE_COMMAND_UI_RANGE消息只能手工添加消息響應(yīng)函數(shù)。在ex10_1View.h中加入如下代碼:afx_msgvoidOnUpdateStyleChange(CCmdUI*pCmdUI);在ex10_1View.cpp中加入如下代碼:ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE1,ID_STYLE3,OnUpdateStyleChange)22在ex10_1View.cpp中加入如下代碼:voidCEx10_1View::OnUpdateStyleChange(CCmdUI*pCmdUI){pCmdUI->SetRadio(m_Style==(pCmdUI->m_nID-ID_STYLE1+1));}pCmdUI->m_nID是當(dāng)前的菜單項(xiàng)IDpCmdUI->m_nID-ID_Style1是當(dāng)前的菜單項(xiàng)的下標(biāo)23(6)在CEx10_1View類中添加鼠標(biāo)消息處理函數(shù)OnLButtonDown(),并添加代碼如下:voidCEx10_1View::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultm_LineEnd=m_LineOrg=point;m_MouseDown=1; CView::OnLButtonDown(nFlags,point);}24(7)在CEx10_1View類中添加鼠標(biāo)消息處理函數(shù)OnButtonMove(),并添加代碼如下:voidCEx10_1View::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultif(m_MouseDown){ CClientDCDC(this); CPenPen1; if(m_Style==1) { Pen1.CreatePen(PS_DASH,1,m_pencolor); } else if(m_Style==2){Pen1.CreatePen(PS_DOT,1,m_pencolor); } else{Pen1.CreatePen(PS_DASHDOT,1,m_pencolor); } DC.SelectObject(&Pen1); DC.SetROP2(R2_WHITE); 25 switch(m_Shape) { case1://繪直線

DC.MoveTo(m_LineOrg); DC.LineTo(m_LineEnd); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.MoveTo(m_LineOrg); DC.LineTo(m_LineEnd); break;

26 case2://繪矩形

DC.SelectStockObject(NULL_BRUSH); DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); DC.MoveTo(m_LineOrg); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); break;

27 case3://繪橢圓

DC.SelectStockObject(NULL_BRUSH); DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); DC.MoveTo(m_LineOrg); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); break; }} CView::OnMouseMove(nFlags,point);}28(8)在CEx10_1View類中添加鼠標(biāo)消息處理函數(shù)OnLButtonUp(),并添加代碼如下:voidCEx10_1View::OnLButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultm_MouseDown=0;CClientDCDC(this);CPenPen2;if(m_Style==1){ Pen2.CreatePen(PS_DASH,1,m_pencolor);}else if(m_Style==2){ Pen2.CreatePen(PS_DOT,1,m_pencolor);}else{ Pen2.CreatePen(PS_DASHDOT,1,m_pencolor);}DC.SelectObject(&Pen2);DC.SetROP2(R2_WHITE);29switch(m_Shape){ case1://繪直線

DC.MoveTo(m_LineOrg); DC.LineTo(m_LineEnd); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.MoveTo(m_LineOrg); DC.LineTo(m_LineEnd); break;

30 case2://繪矩形

DC.SelectStockObject(NULL_BRUSH); DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); DC.MoveTo(m_LineOrg); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); break;

31 case3://繪橢圓

DC.SelectStockObject(NULL_BRUSH); DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); DC.MoveTo(m_LineOrg); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); break; }} CView::OnLButtonUp(nFlags,point);}3210.2加速鍵【例10-2】在例10-1的基礎(chǔ)上添加Ctrl+L來(lái)觸發(fā)“直線”菜單項(xiàng)加速鍵的功能。首先在項(xiàng)目工作區(qū)選擇ResourceView選項(xiàng)卡,單擊Accelerator項(xiàng)前的“+”號(hào)(或雙擊Accelerator),展開(kāi)目錄后雙擊IDR_MAINFRAME,打開(kāi)加速鍵編輯器,會(huì)看到一張加速鍵列表,所顯示的是系統(tǒng)已定義的加速鍵,在列表的最后高亮區(qū)域雙擊,會(huì)彈出Accel屬性對(duì)話框。在ID文本框中輸入ID_LINE("=32771”由系統(tǒng)自動(dòng)顯示),即輸入了“直線”菜單項(xiàng)標(biāo)識(shí)符,然后單擊“下一個(gè)按下的鍵”按鈕,按下對(duì)應(yīng)的加速鍵,這里按下Ctrl+L,則VC++自動(dòng)設(shè)置好鍵、輔助鍵和類型三個(gè)屬性。按Enter鍵則完成加速鍵定義。

3310.3工具欄標(biāo)準(zhǔn)的Windows應(yīng)用程序,工具欄一般位于主菜單的下一行,通常工具欄上的一個(gè)按鈕就對(duì)應(yīng)某一個(gè)菜單項(xiàng),且功能一致。10.3.1增加工具欄按鈕創(chuàng)建MFC應(yīng)用程序框架中,在MFC應(yīng)用向?qū)У谒牟綄?duì)話框中選中“??抗ぞ邫凇本蜑閼?yīng)用程序添加了默認(rèn)工具欄。在默認(rèn)工具欄上添加工具欄按鈕的步驟如下:(1)打開(kāi)工作區(qū)的資源視圖,找到ToolBar節(jié)點(diǎn)展開(kāi),雙擊IDR_MAINFRAME標(biāo)識(shí)符,打開(kāi)工具欄資源編輯器對(duì)話框(2)添加工具:選中工具欄預(yù)覽區(qū)最后的空白按鈕,然后在該按鈕的放大位圖上利用繪圖工具繪制所需圖形。34(3)為使工具按鈕和菜單命令的功能相同,在相應(yīng)的工具欄按鈕上雙擊,打開(kāi)工具欄按鈕屬性對(duì)話框,修改ID的內(nèi)容,使其與相應(yīng)的菜單命令的ID一樣,在提示欄中設(shè)置相關(guān)的內(nèi)容,例如“打開(kāi)一個(gè)現(xiàn)有文檔\n打開(kāi)”,其中“\n”前面的內(nèi)容是在狀態(tài)欄上顯示出來(lái)的,“\n”后面的內(nèi)容將是鼠標(biāo)停留在該按鈕上時(shí)顯示的內(nèi)容,通常設(shè)為該按鈕的功能提示。然后關(guān)閉即可。

3510.3.2工具欄應(yīng)用實(shí)例【例10-2】在例10-1中添加工具欄,工具欄中包含4個(gè)按鈕,分別對(duì)應(yīng)菜單的“顯示”、“直線”、“矩形”和“橢圓”菜單項(xiàng)。該工具欄可以在窗口中任意位置??浚耶?dāng)鼠標(biāo)停留在工具欄按鈕上時(shí),將顯示該按鈕的功能。實(shí)現(xiàn)步驟如下:(1)增加工具欄資源單擊插入菜單中的資源菜單項(xiàng),在彈出的對(duì)話框中選擇Toolbar,單擊新建按鈕插入新的工具欄資源。這時(shí)在資源編輯器中可以看到一個(gè)新的工具欄資源。將新加入的工具欄資源的ID重新命名為IDR_TOOLBAR_NEW。繪制4個(gè)按鈕,并設(shè)置相應(yīng)的ID。用戶根據(jù)需要設(shè)計(jì)好自己的工具欄后,MFC會(huì)自動(dòng)在資源文件(.rc)和頭文件中加入相應(yīng)的工具欄代碼。36(2)將工具欄添加到窗口中 添加了資源后,需要把工具欄的對(duì)象加入到應(yīng)用程序框架窗口中(CMainFrame)。首先需要在應(yīng)用程序的CMainFrame類中加入工具欄對(duì)象m_wndToolBar。在MainFrm.h中聲明一個(gè)CToolBar變量,添加如下代碼:CToolBarm_wndToolBarNew;(3)在框架窗口類的OnCreate()函數(shù)中調(diào)用工具欄類的Create()或CreateEx()成員函數(shù)創(chuàng)建該工具欄,并調(diào)用LoadToolBar()成員函數(shù)將工具欄對(duì)象和前面創(chuàng)建的工具欄資源綁定在一起。37在MainFrm.cpp文件的OnCreate()函數(shù)中添加如下代碼:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(!m_wndToolBarNew.CreateEx(this,TBSTYLE_FLAT,WS_CHILD |WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBarNew.LoadToolBar(IDR_TOOLBAR_NEW)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate }}這段代碼首先通過(guò)CreateEx()函數(shù)創(chuàng)建一個(gè)工具欄,然后通過(guò)LoadToolBar函數(shù)將創(chuàng)建的工具欄與指定的資源(也就是剛才新建的工具欄資源)綁定。38CreateEx()函數(shù)的參數(shù)比較多,第一個(gè)參數(shù)是父窗口的指針,this表示當(dāng)前的CmainFrame類窗口指針;第二個(gè)參數(shù)是按鈕樣式,TBSTYLE_FLAT表示扁平樣式;第三個(gè)參數(shù)是工具欄風(fēng)格,這里可以指定基本的窗口風(fēng)格和基本的工具欄風(fēng)格,WS_CHILD表示該工具欄是子窗口,WS_VISIBLE表示該工具欄是可見(jiàn)的,通常這兩個(gè)風(fēng)格是必須設(shè)置的,基本的工具欄風(fēng)格如表10-3所示。39標(biāo)志簡(jiǎn)單描述CBRS_TOP將工具欄放在窗口頂部CBRS_BOTTOM將工具欄放在窗口底部CBRS_ALIGN_ANY工具欄放在窗口的任意位置CBRS_NOALIGN防止控制條在其父窗口改變大小時(shí)被復(fù)位CBRS_FLOAT_FLOAT工具欄在主窗口中可以浮動(dòng)CBRS_TOOLTIPS鼠標(biāo)光標(biāo)在按鈕上暫停時(shí),顯示工具提示CBRS_FLYBY鼠標(biāo)光標(biāo)在按鈕上暫停時(shí),顯示命令描述CBRS_SIZE_DYNAMIC工具欄的大小可變CBRS_SIZE_FIXED工具欄的大小不可變CBRS_GRIPPER在工具條的左邊加一個(gè)夾條CBRS_HIDE_INPLACE隱藏工具欄40為了使新增的工具欄可以在窗口中自由??浚贛ainFrm.cpp文件的OnCreate()函數(shù)中,還要增加如下代碼:m_wndToolBarNew.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBarNew);

應(yīng)用程序中的工具欄一般具有??炕蚋?dòng)特性,上面第一條語(yǔ)句調(diào)用CmainFrame類的成員函數(shù)EnableDocking(),使得m_wndToolBarNew對(duì)象可以停靠在父窗口任何一邊;第二條語(yǔ)句允許工具欄在主框架窗口內(nèi)任何一邊??浚坏谌龡l語(yǔ)句中DockControlBar()也是CmainFrame類的成員函數(shù),說(shuō)明工具欄在父窗口內(nèi)按照前面指定的風(fēng)格???。4110.4.2狀態(tài)欄應(yīng)用實(shí)例【例10-3】在應(yīng)用程序例10-2的基礎(chǔ)上,在狀態(tài)欄中添加兩個(gè)新的指示器用于顯示鼠標(biāo)在窗口中的坐標(biāo)。實(shí)現(xiàn)步驟如下:(1)為新建窗格創(chuàng)建一個(gè)做為指示器標(biāo)識(shí)符的命令I(lǐng)D。命令I(lǐng)D可以設(shè)置成串表也可以設(shè)置成菜單項(xiàng),本例中把命令I(lǐng)D設(shè)置成串表。①在工程工作區(qū)中單擊ResourceView,打開(kāi)資源視圖,在根文件夾上單擊鼠標(biāo)右鍵,在彈出的菜單中選擇資源符號(hào)菜單項(xiàng),彈出如圖10-11所示的資源符號(hào)對(duì)話框。單擊新建按鈕,彈出如圖10-12所示的新建符號(hào)對(duì)話框,在該對(duì)話框中,名稱文本框用于指定標(biāo)識(shí)符,值文本框用于指定標(biāo)識(shí)符的數(shù)值。在名稱文本框中輸入ID_X,接受默認(rèn)的標(biāo)識(shí)符數(shù)值,單擊確定按鈕,完成X坐標(biāo)指示器標(biāo)識(shí)符的定義。按同樣的方法建立Y坐標(biāo)指示器標(biāo)識(shí)符ID_Y,接受默認(rèn)的標(biāo)識(shí)符數(shù)值。在定義標(biāo)識(shí)符時(shí),用戶完全可以自主指定標(biāo)識(shí)符的數(shù)值,但要注意標(biāo)識(shí)符的數(shù)值一定不能重復(fù)。42②在項(xiàng)目工作區(qū)選擇ResourceView選項(xiàng)卡,單擊項(xiàng)目名ex10_1resources前的“+”號(hào),選擇StringTable,打開(kāi)字符串資源編輯器。雙擊字符串資源編輯器中最后的空白行,打開(kāi)String屬性對(duì)話框,在ID框中選擇ID_X,在標(biāo)題列表框中輸入“橫坐標(biāo)X”。同樣,給標(biāo)識(shí)符ID_Y指定標(biāo)題為“縱坐標(biāo)Y”。43(2)在狀態(tài)欄描述數(shù)組中添加新的命令I(lǐng)D。將新建的命令I(lǐng)D添加到狀態(tài)欄描述數(shù)組中,該數(shù)組位于MainFrm.cpp文件的開(kāi)始部分。對(duì)數(shù)組indicator的數(shù)組元素進(jìn)行如下修改:staticUINTindicators[]={ ID_SEPARATOR,//狀態(tài)欄指示符

ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,

ID_X, ID_Y,};新的命令I(lǐng)D在數(shù)組indicators中的位置決定新字符串在狀態(tài)欄中的位置。數(shù)組中下標(biāo)為0的元素在狀態(tài)欄的最左端,依次從左向右排列。44(3)為該窗格創(chuàng)建一個(gè)命令更新處理程序。使用類向?qū)г贑Ex10_1View類中為ID_X的0N_UPDATE_COMMAND_UI消息進(jìn)行消息映射,接受默認(rèn)的函數(shù)名OnUpdateX(),為ID_Y的0N_UPDATE_COMMAND_UI消息進(jìn)行消息映射,接受默認(rèn)的函數(shù)名OnUpdateY()。(有時(shí)候只能手工添加)在文件ex10_1View.cpp中手工添加消息映射宏,代碼如下:ON_UPDATE_COMMAND_UI(ID_X,OnUpdateX)ON_UPDATE_COMMAND_UI(ID_Y,OnUpdateY)同時(shí)在ex10_1View.h中手工添加如下函數(shù)聲明:afx_msgvoidOnUpdateX(CCmdUI*pCmdUI);afx_msgvoidOnUpdateY(CCmdUI*pCmdUI);可以理解為在視圖類的所有0N_UPDATE_COMMAND_UI消息,都調(diào)用OnUpdateX()對(duì)狀態(tài)欄ID_X操作,調(diào)用OnUpdateY()對(duì)狀態(tài)欄ID_Y操作。45(4)添加消息響應(yīng)函數(shù)的代碼①在ex10_1View.h中添加整型數(shù)據(jù)成員m_MouseX和m_MouseY,用于保存鼠標(biāo)的x和y坐標(biāo)值,添加代碼如下:intm_MouseX;//鼠標(biāo)x坐標(biāo)intm_MouseY;//鼠標(biāo)y坐標(biāo)②在視圖類構(gòu)造函數(shù)中對(duì)新添加的數(shù)據(jù)成員初始化,代碼如下:CEx10_1View::CEx10_1View(){ //TODO:addconstructioncodeherem_MouseDown=0;m_Shape=1;m_MouseX=0;m_MouseY=0;}46③在鼠標(biāo)移動(dòng)消息處理函數(shù)中給表示鼠標(biāo)位置坐標(biāo)的數(shù)據(jù)成員賦值,代碼如下:voidCEx10_1View::OnMouseMove(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultm_MouseX=point.x;m_MouseY=point.y; CView::OnMouseMove(nFlags,point);}④為函數(shù)OnUpdateX()添加代碼如下:voidCEx10_1View::OnUpdateX(CCmdUI*pCmdUI){ CStringprompt; pCmdUI->Enable(); prompt.Format("X:%d",m_MouseX);//顯示鼠標(biāo)x坐標(biāo)

pCmdUI->SetText(prompt);}47⑤為函數(shù)OnUpdateY()添加代碼如下:voidCEx10_1View::OnUpdateY(CCmdUI*pCmdUI){ CStringprompt; pCmdUI->Enable(); prompt.Format("Y:%d",m_MouseY);//顯示鼠標(biāo)y坐標(biāo)

pCmdUI->SetText(prompt);}4810.5圖標(biāo)資源 每個(gè)Windows應(yīng)用程序在資源管理器中都有自己的圖標(biāo),這個(gè)圖標(biāo)就是ICON資源。很多時(shí)候我們對(duì)于MFC框架應(yīng)用程序的默認(rèn)圖標(biāo)不滿意,所以要把它換掉。 一種簡(jiǎn)單的方法是在工作區(qū)中選擇ResourceView頁(yè),把Icon下ID為IDR_MAINFRAME的圖標(biāo)資源刪除,再導(dǎo)入自己制作的圖標(biāo)資源,把資源ID改為IDR_MAINFRAME就可以了。 如果要在程序中寫(xiě)代碼改變我們應(yīng)用程序的圖標(biāo),比如有時(shí)候我們要在程序中動(dòng)態(tài)改變程序的標(biāo)題欄或任務(wù)欄圖標(biāo),那就要使用MFC的LoadIcon()函數(shù)?!纠?0-4】在例10-3的基礎(chǔ)上通過(guò)修改光標(biāo)資源,使得執(zhí)行程序的圖標(biāo)變?yōu)榧t色圓形的樣子。(1)在工程工作區(qū)中單擊ResourceView,打開(kāi)資源視圖,在Icon文件夾上單擊鼠標(biāo)右鍵,在快捷菜單中選擇插入,資源類型選Icon,進(jìn)入圖標(biāo)編輯器新建一個(gè)圖標(biāo)資源,ID號(hào)使用默認(rèn)的IDI_ICON1。也可以導(dǎo)入一個(gè)圖標(biāo)資源。

49(2)在CMainFrame::OnCreat()函數(shù)中加入代碼如下:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){

HICONico; ico=AfxGetApp()->LoadIcon(IDI_ICON1); SetIcon(ico,true);

SetIcon(ico,false);//效果一樣

return0;}LoadIcon()函數(shù)用來(lái)裝載圖標(biāo):

SetIcon(ico,true);設(shè)置大圖標(biāo),指明使用大圖標(biāo)(32*32相素),在用戶按ALT+TAB鍵切換窗口時(shí),顯示的就是大圖標(biāo)。SetIcon(ico,false);設(shè)置小圖標(biāo)。指明使用小圖標(biāo)(16*16像素),小圖標(biāo)就是對(duì)話框窗口標(biāo)題欄上的那個(gè)圖標(biāo)。這兩行代碼就將應(yīng)用程序的圖標(biāo)設(shè)置好了。5010.6位圖資源如果需要一些精美的圖片來(lái)點(diǎn)綴界面,可以選擇位圖資源來(lái)實(shí)現(xiàn)。位圖是一種數(shù)字化的圖形表示形式,基本數(shù)據(jù)結(jié)構(gòu)是像素,一個(gè)像素表示一個(gè)離散點(diǎn)的顏色值。VC++6.0的資源編輯器只支持256色及以下的位圖的編輯,而最新的VC++7.0已經(jīng)支持24位真彩位圖的編輯了。保存在文件中的位圖可以看作是設(shè)備無(wú)關(guān)的,文件本身的數(shù)據(jù)用來(lái)描述位圖的內(nèi)容?!纠?0-5】在例10-4的基礎(chǔ)上顯示一幅256色的圖片。(1)首先通過(guò)其它繪圖軟件將一幅圖片保存為256色位圖,在工作區(qū)中選擇ResourceView的根目錄,單擊鼠標(biāo)右鍵,在快捷菜單中選擇引入,在彈出的對(duì)話框中的“打開(kāi)為”選擇自動(dòng),“文件類型”選擇所有文件,選擇一個(gè)256色的位圖文件,擊“引入”按鈕后進(jìn)入位圖編輯器??梢孕薷钠銲D為IDB_BITMAP_256。51(2)在ex10_1View.cpp的OnDraw()函數(shù)中加入如下代碼:voidCEx10_1View::OnDraw(CDC*pDC){ CBbDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahereCDCdcMemory;//定義并創(chuàng)建一個(gè)內(nèi)存設(shè)備環(huán)境dcMemory.CreateCompatibleDC(pDC);CBitmapbmp1;//定義位圖對(duì)象bmp1.LoadBitmap(IDB_BITMAP_256);//加載256位圖BITMAPbmpInfol;//定義一個(gè)BITMAP結(jié)構(gòu)的變量,存放位圖尺寸bmp1.GetBitmap(&bmpInfol);//獲得位圖bmp1的尺寸CBitmap*pOldBitmap=dcMemory.SelectObject(&bmp1);//選擇位圖到內(nèi)存緩沖設(shè)備中pDC->BitBlt(200,10,bmpInfol.bmWidth,bmpInfol.bmHeight,&dcMemory,0,0,SRCCOPY);//繪制到屏幕}

52對(duì)于繪圖或照片一類的位圖數(shù)據(jù)量一般較大,為了提高顯示刷新速度,位圖操作必須在內(nèi)存中進(jìn)行。對(duì)于位圖操作的系統(tǒng)設(shè)備環(huán)境為內(nèi)存設(shè)備環(huán)境。應(yīng)用程序首先要調(diào)用函數(shù)CreateCompatibleDC()向系統(tǒng)申請(qǐng)獲取內(nèi)存設(shè)備環(huán)境。語(yǔ)句dcMemory.CreateCompatibleDC(pDC);創(chuàng)建與pDC格式相兼容的DC。數(shù)據(jù)結(jié)構(gòu)BITMAP在位圖操作中經(jīng)常使用,其定義中的bmWidth和bmHeight分別是位圖的寬和高。位圖的最終顯示是通過(guò)調(diào)用DC類的BitBlt()函數(shù)來(lái)完成的,函數(shù)原型如下:BOOLBitBlt(intXDest,intYDest,//目的設(shè)備環(huán)境(顯示器設(shè)備環(huán)境)中位圖基點(diǎn)intnWidth,intnHeitght,//目的設(shè)備環(huán)境中位圖寬度和高寬HDChdcSrc,//源設(shè)備環(huán)境句柄(內(nèi)存設(shè)備環(huán)境句柄)intnXSrc,intnYsrc,//源設(shè)備環(huán)境中位圖基點(diǎn),一般為0,0DWORDdwRop//標(biāo)識(shí)位圖顯示方式,常用SRCCOPY,用來(lái)直接將位圖復(fù)制到目的設(shè)備環(huán)境。)5310.7對(duì)話框資源對(duì)話框分為模態(tài)對(duì)話框與非模態(tài)對(duì)話框兩種。模態(tài)對(duì)話框顯示的時(shí)候,整個(gè)程序只有模態(tài)對(duì)話框窗口獲得焦點(diǎn),可以和用戶交互。非模態(tài)對(duì)話框顯示的時(shí)候,程序主體部分仍然可以和用戶進(jìn)行交互。在使用的時(shí)候是選擇模態(tài)對(duì)話框還是非模態(tài)對(duì)話框要取決于程序的具體情況。10.7.1模態(tài)對(duì)話框應(yīng)用程序的大部分對(duì)話框都是模態(tài)對(duì)話框。對(duì)話框的建立可分為如下幾步:(1)利用對(duì)話框資源編輯器創(chuàng)建對(duì)話框資源。(2)把對(duì)話框資源生成對(duì)話框類。(3)給控件連接變量。(4)消息映射。(5)對(duì)話框的顯示。54【例10-6】在例10-5的基礎(chǔ)上創(chuàng)建一個(gè)對(duì)話框資源,對(duì)話框中設(shè)置一個(gè)顏色下拉列表框,在程序主菜單的“操作”菜單中增加一個(gè)菜單項(xiàng)“顏色”,當(dāng)用戶在菜單中選擇顏色菜單項(xiàng)的時(shí)候,就彈出該對(duì)話框,讓用戶選擇顏色,然后使用剛設(shè)置的顏色來(lái)畫(huà)直線、橢圓或矩形。顏色選擇對(duì)話框如圖所示。55實(shí)現(xiàn)步驟如下:(1)對(duì)話框資源的創(chuàng)建首先要?jiǎng)?chuàng)建資源,在工程工作區(qū)中單擊ResourceView,打開(kāi)資源視圖,在根文件夾上單擊鼠標(biāo)右鍵,在彈出的菜單中選擇插入(也可以在插入菜單中選擇資源菜單項(xiàng)),然后在資源類型對(duì)話框中選擇Dialog,擊新建按鈕。右側(cè)的對(duì)話框資源編輯器中便出現(xiàn)新創(chuàng)建的對(duì)話框資源。根據(jù)要求設(shè)計(jì)界面,增加一個(gè)靜態(tài)文本和一個(gè)下拉列表框控件。設(shè)置好各控件的屬性,把對(duì)話框的ID設(shè)置為IDD_DIALOG_NEW。添加控件的方法以及設(shè)置控件屬性、調(diào)整控件的尺寸和位置的方法同第九章,給下拉列表框裝載選項(xiàng)的方法同第九章。(2)生成對(duì)話框類在創(chuàng)建完對(duì)話框資源之后,需要生成一個(gè)相關(guān)的對(duì)話框類。確保當(dāng)前VC++處于對(duì)話框編輯器狀態(tài),進(jìn)入類向?qū)В缓筮x擇CreateaNewClass,單擊OK按鈕,彈出NewClass對(duì)話框,在Name框中輸入“CInputDlg”即可。56(3)給控件連接變量給對(duì)話框中的下拉列表框控件IDC_CO

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論