版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1第10章資源2
應(yīng)用程序可以使用幾種不同類型的資源,如菜單、加速鍵、工具欄、狀態(tài)條、圖標、位圖、對話框和字符串等。在MFC中創(chuàng)建應(yīng)用程序的資源,可以使用可視化的資源編輯器(ResourceEditor),在資源編輯器中,程序員可以通過鼠標的拖動來編輯可視化資源,十分方便。 在Windows的可執(zhí)行文件中,資源是獨立于代碼的,使用單獨的資源編譯器進行編譯,并嵌入到可執(zhí)行文件中。在編程過程中,代碼是可復(fù)用的,資源也是可復(fù)用的,通過資源的“導(dǎo)入”和“導(dǎo)出”功能來實現(xiàn)資源的復(fù)用。310.1菜單在標準的Windows應(yīng)用程序中,菜單通常有三類:系統(tǒng)菜單、程序主菜單和快捷菜單。系統(tǒng)菜單提供系統(tǒng)對程序主窗口的管理功能,通常在程序中既不需要控制也不需要改動這種菜單,因此在此不作介紹。程序主菜單通常位于應(yīng)用程序的最頂端,大家所熟悉的文件、編輯、查看等菜單就是屬于程序的主菜單,其菜單項包含了程序的大部分功能??旖莶藛卧诖蟛糠值腤indows應(yīng)用程序中是很常見的。菜單從形式上分為下拉式和彈出式兩種。系統(tǒng)菜單、程序主菜單都是下拉式菜單,下拉式菜單由上層水平列表項以及與其相連的彈出式菜單組成,當(dāng)用戶選擇了上層某個列表項時,與之關(guān)聯(lián)的彈出式菜單就會出現(xiàn),而且可以形成級聯(lián)菜單??旖莶藛螌儆趶棾鍪讲藛?,可以出現(xiàn)在屏幕的任何位置。
MFC類庫將菜單操作封裝在CMenu類中,所有關(guān)于菜單的操作都可以通過CMenu類的成員函數(shù)實現(xiàn)。菜單的基本屬性主要包括標識符(ID)、標題(Caption)和提示(Prompt)。410.1.1創(chuàng)建和編輯菜單
菜單可用于單文檔(SDI)、多文檔(MDI)以及基于對話框的應(yīng)用程序。在單文檔和多文檔應(yīng)用程序中編輯菜單資源的步驟如下:
(1)新建立一個單文檔或多文檔的應(yīng)用程序。
(2)在項目工作區(qū)中單擊資源視圖標簽ResourceView,切換到資源視圖。
(3)展開Menu節(jié)點,雙擊菜單資源標識符IDR_MAINFRAME,或右擊該標識符,在彈出的快捷菜單中選擇“打開”命令。在編輯區(qū)中彈出菜單編輯窗口,顯示IDR_MAINFRAME標識的菜單資源。
(4)雙擊對應(yīng)菜單的空白菜單項,添加所需菜單。例如要為“文件”添加“保存”菜單項,選擇菜單欄中的“文件”命令顯示下拉菜單,雙擊菜單底部的空白處(若添加主菜單,則雙擊“幫助”后的空白處),打開菜單項目屬性對話框
5在其中的“ID”和“標明”里面分別輸入菜單命令的ID號和標識符。例如:ID號為“ID_FILE_SAVE”,標識符為“保存([&S])\tCtrl+S”,含義是設(shè)置熱鍵為Alt+S,加速鍵為Ctrl+S。
如果調(diào)整菜單位置,選中要調(diào)整位置的菜單項,按住鼠標左鍵拖動到合適的位置放手即可。如果刪除菜單項,首先選中菜單項,按Delete鍵刪除即可。修改菜單項的方法與創(chuàng)建菜單項相似,雙擊想要修改的菜單項,修改其屬性即可。6在基于對話框的應(yīng)用程序中,首先插入一個新的菜單資源,具體做法是單擊資源視圖標簽ResourceView,切換到資源視圖,然后右擊Resource標識符,在快捷菜單中選擇“插入”命令,在彈出的資源類型對話框中選擇Menu,擊新建就會進入菜單編輯器,在設(shè)計并編輯菜單后,在該對話框的“屬性”選項卡中,將菜單屬性設(shè)置為該菜單的ID即可。710.1.2菜單消息常用的菜單消息有4種:1.ON_COMMAND消息ON_COMMAND消息是為了響應(yīng)用戶點擊普通菜單項的消息,需要添加對該消息進行響應(yīng)的消息處理函數(shù)。2.ON_UPDATE_COMMAND_UI消息ON_UPDATE_COMMAND_UI消息也是在用戶點擊普通菜單項的時候產(chǎn)生的,在ON_COMMAND消息之前響應(yīng),用于在普通菜單項的前面加上“√”或去掉“√”。使用戶可以看出菜單項的當(dāng)前狀態(tài)。3.ON_COMMAND_RANGE消息ON_COMMAND_RANGE是為了響應(yīng)ID值連續(xù)的若干個ON_COMMAND消息而提供的,用于成組的菜單項的消息響應(yīng)。ON_COMMAND_RANGE消息為處理具有連續(xù)ID的菜單項提供了方便的途徑。當(dāng)我們對成組的菜單項操作時,不論選中了這一組菜單項中的哪一個,MFC都發(fā)來一個ON_COMMAND_RANGE消息,我們只需要對該消息編寫一個消息處理函數(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)系類似,實現(xiàn)若干連續(xù)菜單項的狀態(tài)更新。用于在成組的菜單項的某一項前面加上“?”或去掉“?”,使成組的菜單項看起來會更人性化一些。對于后兩種消息只能手工添加消息響應(yīng)函數(shù)10.1.3菜單應(yīng)用實例【例10-1】創(chuàng)建一個基于單文檔結(jié)構(gòu)的應(yīng)用程序,在程序主菜單的“操作”菜單中增加三個菜單項,“顯示”、“圖形”和“線形”?!皥D形”為級聯(lián)菜單,包括“直線”、“矩形”和“橢圓”三個命令選項,“線形”也是一個級聯(lián)菜單,包括“虛線”、“點線”、“點劃線”三個菜單項。對各菜單操作時能執(zhí)行相應(yīng)的命令。用MFC進行編程的具體步驟如下:(1)建立一個基于單文檔的工程ex10_1。(2)在菜單上添加各菜單項并設(shè)置好屬性,如表10-1所示。ID標明分隔符彈出ID_OPER_SHOW
顯示\tCtrl+W
√圖形√ID_LINE直線ID_RECTANGLE矩形ID_ELLIPSE橢圓線形
√ID_STYLE1虛線ID_STYLE2點線ID_STYLE3點劃線(3)添加新的數(shù)據(jù)成員 菜單消息屬于命令消息,命令消息的消息響應(yīng)函數(shù)可以放到四個類中,本例中,菜單操作僅僅修改了用戶區(qū)的內(nèi)容,所以只對視圖類進行修改。在項目的視圖類的頭文件中定義視圖類的成員變量。根據(jù)要顯示的內(nèi)容,考慮設(shè)置如下幾個變量:①整型變量m_Shape為1時畫直線,為2時畫矩形,為3時畫橢圓。②整型變量m_Style為1、2、3時,線形分別為虛線、點線和點劃線。③整型變量m_MouseDown為1時說明鼠標已經(jīng)按下,鼠標移動時可以畫出圖形,否則不畫任何圖形。④COLORREF型變量m_pencolor存放當(dāng)前畫筆的顏色。⑤CPoint型變量m_LineOrg和m_LineEnd分別為直線、矩形和橢圓的起始點和終止點。12在ex10_1View.h中的classCEx10_1View::publicCview中的public處加入如下聲明:intm_Shape;//用戶可選圖形intm_Style;//用戶可選線形intm_MouseDown;//鼠標按下狀態(tài)COLORREFm_pencolor;//畫筆顏色CPointm_LineOrg;//直線、矩形和橢圓的起始點CPointm_LineEnd;//直線、矩形和橢圓的終止點13(4)在視圖類的構(gòu)造函數(shù)中給變量賦初值當(dāng)用戶建立一個基于單文檔的工程就創(chuàng)建了一個視圖類,就是窗口框架上的用戶區(qū),程序執(zhí)行時,就建立了一個文檔類對象,同時建立了一個視圖對象,此時自動執(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)對4種菜單消息進行響應(yīng)①首先添加“直線”、“矩形”和“橢圓”消息處理函數(shù)。添加消息響應(yīng)函數(shù)可以使用類向?qū)?,也可以手工添加,使用類向?qū)нM行消息映射已經(jīng)在前面介紹過了,下面介紹手工添加方法:在ex10_1View.h中添加語句如下: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不論用哪種消息映射方法,都要編寫消息處理函數(shù),如果是手工添加的消息映射,那么在ex10_1View.cpp文件中添加函數(shù)及代碼,如果是使用類向?qū)砑酉㈨憫?yīng)函數(shù)的話,此處只添加代碼,三個菜單項消息處理函數(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②單擊某個線形菜單項時,要使線形發(fā)生改變,可以對ON_COMMAND_RANGE消息進行響應(yīng)。由于ClassWizard不支持ON_COMMAND_RANGE消息的自動映射,只能手工添加消息響應(yīng)函數(shù)。在ex10_1View.h中聲明消息響應(yīng)函數(shù),添加語句如下:protected: //{{AFX_MSG(CMyResoruceView)afx_msgvoidOnLine();afx_msgvoidOnRectangle();afx_msgvoidOnEllipse();afx_msgvoidOnStyleChange(WORDnID); //}}AFX_MSGON_COMMAND_RANGE消息的處理函數(shù)OnStyleChange()帶一個參數(shù)nID,就是當(dā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③為使被選中的菜單項前面標記選中狀態(tài)“√”,需要給“直線”、“矩形”和“橢圓”菜單項添加UPDATE_COMMAND_Ul消息響應(yīng)函數(shù),使用類向?qū)нM行消息映射,接受默認的消息處理函數(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消息,都會自動帶一個指針參數(shù),通過它可以調(diào)用CCmdUI類的方法。常用的CCmdUI類方法及說明如表10-2所示。方法功能voidEnable(BOOLbOn=TRUE)禁止或允許該菜單項,TRUE允許該菜單項;FALSE禁止該菜單項voidSetCheck(intnCheck=1)設(shè)置菜單項或工具欄按鈕的check狀態(tài),顯示標志為“√”,0表示無check狀態(tài);1表示check狀態(tài);voidSetRadio(BOOLbOn=TRUE)與SetCheck功能類似,顯示標志為“·”voidSetText(LPCTSTRlpszText)設(shè)置菜單項的標明屬性21④單擊某個線形菜單項時,要使線形發(fā)生改變的同時,所選線形菜單項的前面加點。當(dāng)我們對具有連續(xù)ID值的菜單項操作時,不論選中了這三個中的哪一個,MFC都發(fā)來一個ON_COMMAND_RANGE消息(后發(fā))和ON_UPDATE_COMMAND_UI_RANGE(先發(fā))消息。對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)前的菜單項IDpCmdUI->m_nID-ID_Style1是當(dāng)前的菜單項的下標23(6)在CEx10_1View類中添加鼠標消息處理函數(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類中添加鼠標消息處理函數(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類中添加鼠標消息處理函數(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來觸發(fā)“直線”菜單項加速鍵的功能。首先在項目工作區(qū)選擇ResourceView選項卡,單擊Accelerator項前的“+”號(或雙擊Accelerator),展開目錄后雙擊IDR_MAINFRAME,打開加速鍵編輯器,會看到一張加速鍵列表,所顯示的是系統(tǒng)已定義的加速鍵,在列表的最后高亮區(qū)域雙擊,會彈出Accel屬性對話框。在ID文本框中輸入ID_LINE("=32771”由系統(tǒng)自動顯示),即輸入了“直線”菜單項標識符,然后單擊“下一個按下的鍵”按鈕,按下對應(yīng)的加速鍵,這里按下Ctrl+L,則VC++自動設(shè)置好鍵、輔助鍵和類型三個屬性。按Enter鍵則完成加速鍵定義。
3310.3工具欄標準的Windows應(yīng)用程序,工具欄一般位于主菜單的下一行,通常工具欄上的一個按鈕就對應(yīng)某一個菜單項,且功能一致。10.3.1增加工具欄按鈕創(chuàng)建MFC應(yīng)用程序框架中,在MFC應(yīng)用向?qū)У谒牟綄υ捒蛑羞x中“??抗ぞ邫凇本蜑閼?yīng)用程序添加了默認工具欄。在默認工具欄上添加工具欄按鈕的步驟如下:(1)打開工作區(qū)的資源視圖,找到ToolBar節(jié)點展開,雙擊IDR_MAINFRAME標識符,打開工具欄資源編輯器對話框(2)添加工具:選中工具欄預(yù)覽區(qū)最后的空白按鈕,然后在該按鈕的放大位圖上利用繪圖工具繪制所需圖形。34(3)為使工具按鈕和菜單命令的功能相同,在相應(yīng)的工具欄按鈕上雙擊,打開工具欄按鈕屬性對話框,修改ID的內(nèi)容,使其與相應(yīng)的菜單命令的ID一樣,在提示欄中設(shè)置相關(guān)的內(nèi)容,例如“打開一個現(xiàn)有文檔\n打開”,其中“\n”前面的內(nèi)容是在狀態(tài)欄上顯示出來的,“\n”后面的內(nèi)容將是鼠標停留在該按鈕上時顯示的內(nèi)容,通常設(shè)為該按鈕的功能提示。然后關(guān)閉即可。
3510.3.2工具欄應(yīng)用實例【例10-2】在例10-1中添加工具欄,工具欄中包含4個按鈕,分別對應(yīng)菜單的“顯示”、“直線”、“矩形”和“橢圓”菜單項。該工具欄可以在窗口中任意位置???,而且當(dāng)鼠標停留在工具欄按鈕上時,將顯示該按鈕的功能。實現(xiàn)步驟如下:(1)增加工具欄資源單擊插入菜單中的資源菜單項,在彈出的對話框中選擇Toolbar,單擊新建按鈕插入新的工具欄資源。這時在資源編輯器中可以看到一個新的工具欄資源。將新加入的工具欄資源的ID重新命名為IDR_TOOLBAR_NEW。繪制4個按鈕,并設(shè)置相應(yīng)的ID。用戶根據(jù)需要設(shè)計好自己的工具欄后,MFC會自動在資源文件(.rc)和頭文件中加入相應(yīng)的工具欄代碼。36(2)將工具欄添加到窗口中 添加了資源后,需要把工具欄的對象加入到應(yīng)用程序框架窗口中(CMainFrame)。首先需要在應(yīng)用程序的CMainFrame類中加入工具欄對象m_wndToolBar。在MainFrm.h中聲明一個CToolBar變量,添加如下代碼:CToolBarm_wndToolBarNew;(3)在框架窗口類的OnCreate()函數(shù)中調(diào)用工具欄類的Create()或CreateEx()成員函數(shù)創(chuàng)建該工具欄,并調(diào)用LoadToolBar()成員函數(shù)將工具欄對象和前面創(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 }}這段代碼首先通過CreateEx()函數(shù)創(chuàng)建一個工具欄,然后通過LoadToolBar函數(shù)將創(chuàng)建的工具欄與指定的資源(也就是剛才新建的工具欄資源)綁定。38CreateEx()函數(shù)的參數(shù)比較多,第一個參數(shù)是父窗口的指針,this表示當(dāng)前的CmainFrame類窗口指針;第二個參數(shù)是按鈕樣式,TBSTYLE_FLAT表示扁平樣式;第三個參數(shù)是工具欄風(fēng)格,這里可以指定基本的窗口風(fēng)格和基本的工具欄風(fēng)格,WS_CHILD表示該工具欄是子窗口,WS_VISIBLE表示該工具欄是可見的,通常這兩個風(fēng)格是必須設(shè)置的,基本的工具欄風(fēng)格如表10-3所示。39標志簡單描述CBRS_TOP將工具欄放在窗口頂部CBRS_BOTTOM將工具欄放在窗口底部CBRS_ALIGN_ANY工具欄放在窗口的任意位置CBRS_NOALIGN防止控制條在其父窗口改變大小時被復(fù)位CBRS_FLOAT_FLOAT工具欄在主窗口中可以浮動CBRS_TOOLTIPS鼠標光標在按鈕上暫停時,顯示工具提示CBRS_FLYBY鼠標光標在按鈕上暫停時,顯示命令描述CBRS_SIZE_DYNAMIC工具欄的大小可變CBRS_SIZE_FIXED工具欄的大小不可變CBRS_GRIPPER在工具條的左邊加一個夾條CBRS_HIDE_INPLACE隱藏工具欄40為了使新增的工具欄可以在窗口中自由???,在MainFrm.cpp文件的OnCreate()函數(shù)中,還要增加如下代碼:m_wndToolBarNew.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBarNew);
應(yīng)用程序中的工具欄一般具有??炕蚋犹匦?,上面第一條語句調(diào)用CmainFrame類的成員函數(shù)EnableDocking(),使得m_wndToolBarNew對象可以??吭诟复翱谌魏我贿?;第二條語句允許工具欄在主框架窗口內(nèi)任何一邊???;第三條語句中DockControlBar()也是CmainFrame類的成員函數(shù),說明工具欄在父窗口內(nèi)按照前面指定的風(fēng)格???。4110.4.2狀態(tài)欄應(yīng)用實例【例10-3】在應(yīng)用程序例10-2的基礎(chǔ)上,在狀態(tài)欄中添加兩個新的指示器用于顯示鼠標在窗口中的坐標。實現(xiàn)步驟如下:(1)為新建窗格創(chuàng)建一個做為指示器標識符的命令I(lǐng)D。命令I(lǐng)D可以設(shè)置成串表也可以設(shè)置成菜單項,本例中把命令I(lǐng)D設(shè)置成串表。①在工程工作區(qū)中單擊ResourceView,打開資源視圖,在根文件夾上單擊鼠標右鍵,在彈出的菜單中選擇資源符號菜單項,彈出如圖10-11所示的資源符號對話框。單擊新建按鈕,彈出如圖10-12所示的新建符號對話框,在該對話框中,名稱文本框用于指定標識符,值文本框用于指定標識符的數(shù)值。在名稱文本框中輸入ID_X,接受默認的標識符數(shù)值,單擊確定按鈕,完成X坐標指示器標識符的定義。按同樣的方法建立Y坐標指示器標識符ID_Y,接受默認的標識符數(shù)值。在定義標識符時,用戶完全可以自主指定標識符的數(shù)值,但要注意標識符的數(shù)值一定不能重復(fù)。42②在項目工作區(qū)選擇ResourceView選項卡,單擊項目名ex10_1resources前的“+”號,選擇StringTable,打開字符串資源編輯器。雙擊字符串資源編輯器中最后的空白行,打開String屬性對話框,在ID框中選擇ID_X,在標題列表框中輸入“橫坐標X”。同樣,給標識符ID_Y指定標題為“縱坐標Y”。43(2)在狀態(tài)欄描述數(shù)組中添加新的命令I(lǐng)D。將新建的命令I(lǐng)D添加到狀態(tài)欄描述數(shù)組中,該數(shù)組位于MainFrm.cpp文件的開始部分。對數(shù)組indicator的數(shù)組元素進行如下修改: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ù)組中下標為0的元素在狀態(tài)欄的最左端,依次從左向右排列。44(3)為該窗格創(chuàng)建一個命令更新處理程序。使用類向?qū)г贑Ex10_1View類中為ID_X的0N_UPDATE_COMMAND_UI消息進行消息映射,接受默認的函數(shù)名OnUpdateX(),為ID_Y的0N_UPDATE_COMMAND_UI消息進行消息映射,接受默認的函數(shù)名OnUpdateY()。(有時候只能手工添加)在文件ex10_1View.cpp中手工添加消息映射宏,代碼如下:ON_UPDATE_COMMAND_UI(ID_X,OnUpdateX)ON_UPDATE_COMMAND_UI(ID_Y,OnUpdateY)同時在ex10_1View.h中手工添加如下函數(shù)聲明:afx_msgvoidOnUpdateX(CCmdUI*pCmdUI);afx_msgvoidOnUpdateY(CCmdUI*pCmdUI);可以理解為在視圖類的所有0N_UPDATE_COMMAND_UI消息,都調(diào)用OnUpdateX()對狀態(tài)欄ID_X操作,調(diào)用OnUpdateY()對狀態(tài)欄ID_Y操作。45(4)添加消息響應(yīng)函數(shù)的代碼①在ex10_1View.h中添加整型數(shù)據(jù)成員m_MouseX和m_MouseY,用于保存鼠標的x和y坐標值,添加代碼如下:intm_MouseX;//鼠標x坐標intm_MouseY;//鼠標y坐標②在視圖類構(gòu)造函數(shù)中對新添加的數(shù)據(jù)成員初始化,代碼如下:CEx10_1View::CEx10_1View(){ //TODO:addconstructioncodeherem_MouseDown=0;m_Shape=1;m_MouseX=0;m_MouseY=0;}46③在鼠標移動消息處理函數(shù)中給表示鼠標位置坐標的數(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);//顯示鼠標x坐標
pCmdUI->SetText(prompt);}47⑤為函數(shù)OnUpdateY()添加代碼如下:voidCEx10_1View::OnUpdateY(CCmdUI*pCmdUI){ CStringprompt; pCmdUI->Enable(); prompt.Format("Y:%d",m_MouseY);//顯示鼠標y坐標
pCmdUI->SetText(prompt);}4810.5圖標資源 每個Windows應(yīng)用程序在資源管理器中都有自己的圖標,這個圖標就是ICON資源。很多時候我們對于MFC框架應(yīng)用程序的默認圖標不滿意,所以要把它換掉。 一種簡單的方法是在工作區(qū)中選擇ResourceView頁,把Icon下ID為IDR_MAINFRAME的圖標資源刪除,再導(dǎo)入自己制作的圖標資源,把資源ID改為IDR_MAINFRAME就可以了。 如果要在程序中寫代碼改變我們應(yīng)用程序的圖標,比如有時候我們要在程序中動態(tài)改變程序的標題欄或任務(wù)欄圖標,那就要使用MFC的LoadIcon()函數(shù)?!纠?0-4】在例10-3的基礎(chǔ)上通過修改光標資源,使得執(zhí)行程序的圖標變?yōu)榧t色圓形的樣子。(1)在工程工作區(qū)中單擊ResourceView,打開資源視圖,在Icon文件夾上單擊鼠標右鍵,在快捷菜單中選擇插入,資源類型選Icon,進入圖標編輯器新建一個圖標資源,ID號使用默認的IDI_ICON1。也可以導(dǎo)入一個圖標資源。
49(2)在CMainFrame::OnCreat()函數(shù)中加入代碼如下:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){
HICONico; ico=AfxGetApp()->LoadIcon(IDI_ICON1); SetIcon(ico,true);
SetIcon(ico,false);//效果一樣
return0;}LoadIcon()函數(shù)用來裝載圖標:
SetIcon(ico,true);設(shè)置大圖標,指明使用大圖標(32*32相素),在用戶按ALT+TAB鍵切換窗口時,顯示的就是大圖標。SetIcon(ico,false);設(shè)置小圖標。指明使用小圖標(16*16像素),小圖標就是對話框窗口標題欄上的那個圖標。這兩行代碼就將應(yīng)用程序的圖標設(shè)置好了。5010.6位圖資源如果需要一些精美的圖片來點綴界面,可以選擇位圖資源來實現(xiàn)。位圖是一種數(shù)字化的圖形表示形式,基本數(shù)據(jù)結(jié)構(gòu)是像素,一個像素表示一個離散點的顏色值。VC++6.0的資源編輯器只支持256色及以下的位圖的編輯,而最新的VC++7.0已經(jīng)支持24位真彩位圖的編輯了。保存在文件中的位圖可以看作是設(shè)備無關(guān)的,文件本身的數(shù)據(jù)用來描述位圖的內(nèi)容?!纠?0-5】在例10-4的基礎(chǔ)上顯示一幅256色的圖片。(1)首先通過其它繪圖軟件將一幅圖片保存為256色位圖,在工作區(qū)中選擇ResourceView的根目錄,單擊鼠標右鍵,在快捷菜單中選擇引入,在彈出的對話框中的“打開為”選擇自動,“文件類型”選擇所有文件,選擇一個256色的位圖文件,擊“引入”按鈕后進入位圖編輯器??梢孕薷钠銲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)建一個內(nèi)存設(shè)備環(huán)境dcMemory.CreateCompatibleDC(pDC);CBitmapbmp1;//定義位圖對象bmp1.LoadBitmap(IDB_BITMAP_256);//加載256位圖BITMAPbmpInfol;//定義一個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對于繪圖或照片一類的位圖數(shù)據(jù)量一般較大,為了提高顯示刷新速度,位圖操作必須在內(nèi)存中進行。對于位圖操作的系統(tǒng)設(shè)備環(huán)境為內(nèi)存設(shè)備環(huán)境。應(yīng)用程序首先要調(diào)用函數(shù)CreateCompatibleDC()向系統(tǒng)申請獲取內(nèi)存設(shè)備環(huán)境。語句dcMemory.CreateCompatibleDC(pDC);創(chuàng)建與pDC格式相兼容的DC。數(shù)據(jù)結(jié)構(gòu)BITMAP在位圖操作中經(jīng)常使用,其定義中的bmWidth和bmHeight分別是位圖的寬和高。位圖的最終顯示是通過調(diào)用DC類的BitBlt()函數(shù)來完成的,函數(shù)原型如下:BOOLBitBlt(intXDest,intYDest,//目的設(shè)備環(huán)境(顯示器設(shè)備環(huán)境)中位圖基點intnWidth,intnHeitght,//目的設(shè)備環(huán)境中位圖寬度和高寬HDChdcSrc,//源設(shè)備環(huán)境句柄(內(nèi)存設(shè)備環(huán)境句柄)intnXSrc,intnYsrc,//源設(shè)備環(huán)境中位圖基點,一般為0,0DWORDdwRop//標識位圖顯示方式,常用SRCCOPY,用來直接將位圖復(fù)制到目的設(shè)備環(huán)境。)5310.7對話框資源對話框分為模態(tài)對話框與非模態(tài)對話框兩種。模態(tài)對話框顯示的時候,整個程序只有模態(tài)對話框窗口獲得焦點,可以和用戶交互。非模態(tài)對話框顯示的時候,程序主體部分仍然可以和用戶進行交互。在使用的時候是選擇模態(tài)對話框還是非模態(tài)對話框要取決于程序的具體情況。10.7.1模態(tài)對話框應(yīng)用程序的大部分對話框都是模態(tài)對話框。對話框的建立可分為如下幾步:(1)利用對話框資源編輯器創(chuàng)建對話框資源。(2)把對話框資源生成對話框類。(3)給控件連接變量。(4)消息映射。(5)對話框的顯示。54【例10-6】在例10-5的基礎(chǔ)上創(chuàng)建一個對話框資源,對話框中設(shè)置一個顏色下拉列表框,在程序主菜單的“操作”菜單中增加一個菜單項“顏色”,當(dāng)用戶在菜單中選擇顏色菜單項的時候,就彈出該對話框,讓用戶選擇顏色,然后使用剛設(shè)置的顏色來畫直線、橢圓或矩形。顏色選擇對話框如圖所示。55實現(xiàn)步驟如下:(1)對話框資源的創(chuàng)建首先要創(chuàng)建資源,在工程工作區(qū)中單擊ResourceView,打開資源視圖,在根文件夾上單擊鼠標右鍵,在彈出的菜單中選擇插入(也可以在插入菜單中選擇資源菜單項),然后在資源類型對話框中選擇Dialog,擊新建按鈕。右側(cè)的對話框資源編輯器中便出現(xiàn)新創(chuàng)建的對話框資源。根據(jù)要求設(shè)計界面,增加一個靜態(tài)文本和一個下拉列表框控件。設(shè)置好各控件的屬性,把對話框的ID設(shè)置為IDD_DIALOG_NEW。添加控件的方法以及設(shè)置控件屬性、調(diào)整控件的尺寸和位置的方法同第九章,給下拉列表框裝載選項的方法同第九章。(2)生成對話框類在創(chuàng)建完對話框資源之后,需要生成一個相關(guān)的對話框類。確保當(dāng)前VC++處于對話框編輯器狀態(tài),進入類向?qū)?,然后選擇CreateaNewClass,單擊OK按鈕,彈出NewClass對話框,在Name框中輸入“CInputDlg”即可。56(3)給控件連接變量給對話框中的下拉列表框控件IDC_CO
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司房屋租賃協(xié)議書樣本
- 2024年農(nóng)產(chǎn)品購銷合同范本簡單
- 離婚資金監(jiān)管協(xié)議模板2024年
- 簡單易行的個人汽車租賃合同模板
- 租賃合同爭議調(diào)解
- 個人房屋租賃協(xié)議書樣本
- 商品房合同權(quán)利轉(zhuǎn)讓協(xié)議
- 2024年租地合同協(xié)議書
- 創(chuàng)業(yè)團隊股權(quán)分配協(xié)議
- 塔機租賃協(xié)議
- 風(fēng)電場項目施工工程設(shè)備采購方案
- 讀后續(xù)寫人與動物-天使狗狗的守護講義 高三英語作文復(fù)習(xí)寫作專項
- 國家開放大學(xué)《科學(xué)與技術(shù)》形考任務(wù)1-4參考答案
- 廠房泄爆面積計算
- 2023年全國中小學(xué)思政課教師網(wǎng)絡(luò)培訓(xùn)研修總結(jié)心得體會
- 《走進芭蕾-中外芭蕾經(jīng)典作品鑒賞》學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫2023年
- 口腔修復(fù)學(xué):全口義齒課件
- 宮頸及陰道上藥的護理(婦產(chǎn)科護理課件)
- 人教精通版英語五上Unit5《Isthisyourschoolbag》教案
- 2023年口腔醫(yī)學(xué)期末復(fù)習(xí)-牙周病學(xué)(口腔醫(yī)學(xué))考試歷年真題精華集選附答案
- 能源管理知識培訓(xùn)講義
評論
0/150
提交評論