付費下載
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第十八講工具欄和狀態欄教學提綱一、教學內容:工具欄和狀態欄編程二、學時:兩課時三、教學目的和要求掌握工具欄的創建方法和步驟,如何將工具欄的功能與菜單的功能相對應掌握創建狀態欄的方法和步驟四、教學重點和難點重點:工具欄編程難點:狀態欄編程五.教學過程提要工具欄編程狀態欄編程本單小結內容提要§6.2工具欄§6.3狀態欄§6.2工具欄
工具欄是一系列工具按鈕的組合,也是一種常用的命令輸入方式。可以說,工具欄是菜單的一種快捷方式。6.2.1創建工具欄的方法和步驟創建工具欄資源在這里,我們將對上一節的例子進行擴充,增加一個工具欄。當用鼠標選擇工具欄上的某個按鈕時,顯示出【個人資料】對話框。具體步驟如下:步驟一:打開上一節創建的Dialog例子。步驟二:在工作區窗口中選擇【ResourceView】選項卡,展開【DialogResources】文件夾,由于我們在用AppWizard生成應用程序時,沒有選擇生成工具欄,因此在【DialogResources】文件夾中,找不到Toolbar文件夾。6.2工具欄步驟三:選擇【Insert】菜單中的【Resource】菜單項,在彈出菜單中選擇【Insert】菜單項。系統將彈出【InsertResource】對話框,在對話框中選擇【Toolbar】,單擊【New】按鈕。步驟四:系統將自動在【DialogResounrces】文件夾中添加一個【Toolbar】文件夾,同時在【Toolbar】文件夾中添加了一個名為IDR_TOOLBAR1的文件。屏幕上同時顯示工具欄設計窗口。步驟四:鼠標右鍵單擊【ResourceView】中【Toolbar】文件夾中的IDR_TOOLBAR1項目。在彈出菜單中選擇【Properties】菜單項,系統將彈出工具欄屬性對話框。在屬性對話框中的【ID】框中,我們把ID號修改為IDR_MYTOOLBAR。步驟五:添加按鈕和制作按鈕圖標。我們可以利用【Graphic】和【Color】工具欄上提供的設計工具,根據自己需要制作按鈕圖標。我們用字母R作為按鈕的圖標。工具欄按鈕的繪制是一個個分開進行的,在畫完一個按鈕后,該按鈕的實際效果立刻顯示出來。
在【ToolbarButtonProperties】工具欄按鈕屬性對話框中,各項的含義如表6.5所示。項目含義IDWidthHeightPrompt用于輸入或從下拉列表中選擇工具欄按鈕的ID號用于輸入工具欄按鈕的寬度,單位是像素用于輸入工具欄按鈕的高度,單位是像素工具欄按鈕文本
注:要使選擇工具欄按鈕的功能與選擇菜單的功能一致時,應將工具欄按鈕屬性對象框中的ID號設置為與某一菜單項的ID號相同。
值得一提的是,在創建工具欄按鈕的過程中,可以進行有關的操作及方法:(1)創建新的工具欄按鈕在新建一個工具欄的過程中,在工具欄的右端會有一個空按鈕,用鼠標單擊該按鈕,則該按鈕的周圍有虛的方框包圍,同時在編輯區內顯示出該按鈕,用戶可以在其中繪制圖形。(2)移動工具欄中的按鈕在編輯工具欄的過程中,可以根據用戶的需要移動工具欄中的按鈕,將某個按鈕放置到所需要的位置上。(3)復制工具欄中的按鈕在工具欄編輯窗口內,選擇待移動的工具欄按鈕,在按下Ctrl鍵的同時,將其拖動到所需要的位置。(4)刪除工具欄中的按鈕方法是用鼠標拖動該按鈕到工具欄以外的位置。(5)在工具欄中的按鈕間插入空格可以根據需要在某個按鈕的左邊、右邊或兩邊插入一個空格分隔符,方法是:①如果某按鈕左邊沒有任何空格,拖動該按鈕向右移動并當按鈕的右邊界接觸到右邊按鈕時,釋放鼠標鍵,則可以此按鈕的左邊插入一個空格,反之,亦然。②如果某按鈕的左邊已有空格而右邊沒有空格,拖動該按鈕向左移動并當按鈕的左邊界接觸到左邊按鈕時,釋放鼠標鍵,則可在此按鈕右邊插入一個空格。③如果某按鈕的左右兩邊都有空格,拖動該按鈕向右移動并接觸到相鄰按鈕時,則此按鈕左邊的空格保留,按鈕右邊的空格消失。反之亦然。實現工具欄
編碼實現工具欄。具體實現步驟如下:步驟一:在工作區中窗口中選中【ClassView】選項卡,用鼠標右鍵單擊【CmainFrame】,在彈出的菜單中選擇【AddMemberVariable】菜單項,系統將彈出【AddMemberVariable】對話框。步驟二:在【VariableType】欄中輸入類型名稱CToolBar,在【VariableName】欄中輸入變量名稱m_MyDataToolBar。單擊【OK】按鈕繼續。此時,VisualC++將自動在主框架中的類定義文件MainFrm.h中添加以下聲名:CToolBarm_MyDataToolBar;步驟三:選擇【View】菜單中的【ClassWizard】菜單項,或者直接按Ctrl+R鍵,彈出【MFCClassWizard】對話框。在【Classname】列表框選擇CmainFrame類;在【ObjectIds】列表框中選中CMainFrame;雙擊【Messages】列表欄中的WM_CREATE選項,或者選中WM_CREATE,再單擊【AddFunction】按鈕。在【MemberFunction】欄中將會出現OnCreate()函數。步驟四:單擊【EditCode】按鈕,ClassWizard將自動在框架類的實現文件MainFrm.cpp中添加成員函數OnCreate()。在函數中加入顯示工具欄的代碼。具體代碼如下,其中粗體部分為新添加的代碼。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n");return-1;}return0;}步驟五:編譯并運行該程序。當單擊工具欄上的新建按鈕,窗口中將彈出【個人資料】對話框。此按鈕的作用和選擇【顯示】菜單中的【個人資料】菜單項的效果是一樣的。說明:(1)在上例創建工具欄的過程中,曾用到了CToolBar類的對象,CToolBar類是由CControlBar類派生而來的,它用于描述工具欄。其中,Create函數是其成員函數,該函數的原型為:BOOLCreate(Cwnd*pParentWnd,DWORDwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP,UNITnID=AFX_IDW_TOOLBAR);其中:參數pParentWnd是指向父窗口的指針,dwStyle是工具欄的風格,nID是子窗口的ID號。取值風格CBRS_TOPCBRS_BOTTOMCBRS_NOALIGNCBRS_TOOLTIPSCBRS_SIZE_DYNAMICCBRS_SIZE_FIXEDCBRS_FLOATINGCBRS_FLYBYCBRS_HIDE_INPLACE在框架窗口的頂部在框架窗口的底部不隨父窗口改變尺寸顯示按鈕提示尺寸可改變控件條固定浮動狀態狀態欄中顯示按鈕的信息不顯示工具欄表6.6工具欄的部分風格(2)TRACE宏
TRACE宏提供了類似與printf函數的輸出格式,用于將某一信息(即字符串)輸出到Dump的設備環境DC中。該宏只在調試狀態下工作。TRACE宏的限制是一次最多輸出512個字符。如:inti=1;charsz[]="one";TRACE("Integer=%d,String=%s\n",i,sz);此外,還有TRACE0~TRACE3這樣4個獨立的宏,分別用于輸出純字符串~字符串+3個參數。它們的原型分別為:TRACE0(exp)TRACE1(exp,param1)TRACE2(exp,param1,param2)TRACE3(exp,param1,param2,param3)如:TRACE0("StartDumpofMyClassmembers:");inti=1;TRACE1("Integer=%d\n",i);//Output:'Integer=1'intj=1;charsz[]="one";TRACE2("Integer=%d,String=%s\n",j,sz);//Output:'Integer=1,String=one'6.2.2實現工具欄的船塢化所謂船塢化工具欄就是可以將工具欄拖動到屏幕的任意位置上,還可以用鼠標改變工具欄的大小。下面我們就來實現工具欄的船塢化。首先要通過調用CControlBar的成員函數EnableDocking()使工具欄能夠船塢化;然后通過調用CFrameWnd類的成員函數EnableDocking()確保邊框窗口能夠船塢化;最后調用CFrameWnd的成員函數DockControlBar()使工具欄固定在邊框窗口上。
所有這些工作都在邊框窗口類的成員函數OnCreate()中完成。這三個函數的原型為:voidCControlBar::EnableDocking(DWORDdwStyle);voidCFrameWnd::EnableDocking(DWORDdwDockStyle);voidCFrameWnd::DockControlBar(CControlBar*pBar,UINTnDockBarID=0,LPCRECTlpRect=NULL);
其中:參數dwStyle和dwDockStyle表示工具欄的風格,其取值見表6.6,pBar是指向待船塢化的工具欄的指針。
具體代碼如下,其中粗體部分為新添加的代碼。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n");return-1;} m_MyDataToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_MyDataToolBar);return0;}
編譯并運行該應用程序,將看到工具欄已經船塢化了。可以用鼠標將它拖動到窗口的任意位置。與工具欄相關的MFC類MFC的兩個類CToolBar和CToolBarCtrl都是用來為工具條提供操作支,CToolBar繼承了類CControlBar,CToolBarCtrl直接繼承CWnd,CToolBarCtrl能提供更復雜的功能。§6.3狀態欄
狀態欄位于應用程序框架窗口的底部,它可以分割成幾個窗格,一般用于顯示一些文本信息,比如:工具欄按鈕的提示信息、CapsLock鍵及NumLock鍵的狀態等等。1、創建狀態欄資源下面,我們在前例的基礎上,為應用程序Dialog添加一個狀態欄,用來顯示一個消息區、一個字符串和NumLock鍵的狀態。其具體步驟如下:步驟一:打開資源符號對話框。步驟二:在對話框中單擊【New】按鈕,彈出【NewSymbol】對話框,在【Name】欄中填入ID_STATUSBAR_STR,在【Value】欄中的數字是系統為用戶提供的ID數值。單擊【OK】按鈕繼續。6.3狀態欄步驟三:新添加的ID信息將會出現在【ResourceSymbols】對話框的列表中。單擊【Close】按鈕關閉【ResourceSymbols】對話框。此時完成創建ID的工作。步驟四:在工作區窗口中選擇【ResourceView】選項卡,雙擊【StringTable】文件夾中的【StringTable】選項,窗口中將顯示出串表編輯器。在編輯器中單擊鼠標右鍵,在彈出的菜單中選擇【NewString】菜單項。步驟五:系統彈出【StringProperties】對話框,在【ID】框中選擇ID_STATUSBAR_STR項,在【Caption】框中輸入字符串“測試狀態欄!”,按【Enter】鍵確認。2、實現狀態欄實現狀態欄的具體步驟如下:步驟一:在工作區窗口中選擇【ClassView】選項卡,用鼠標右鍵單擊【CMainFrame】選項,在彈出菜單中選擇【AddMemberVariable】菜單項。彈出【AddMemberVariable】對話框,在【VariableType】欄中輸入類型名稱CStatusBar,在【VariableName】欄中輸入類型名稱為m_MyStatusBar。單擊【OK】按鈕繼續。此時,VisualC++將自動在主框架的類定義文件MainFrm.h中添加以下聲明:CStatusBarm_MyStatusBar;步驟二:在MainFrm.cpp文件中加入數組indicators的定義,具體代碼如下,其中粗體部分為新增加的代碼。//CMainFrameIMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CONTEXTMENU()ON_WM_CREATE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()staticUINTindicators[]={ID_SEPARATOR, //狀態行指示器
ID_STATUSBAR_STR,ID_INDICATOR_NUM,};步驟三:在文件MainFrm.app中對函數OnCreate()進行修改,增加狀態欄的創建代碼。具體代碼如下,其中粗體部分為新增加的代碼。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n"); return-1; } m_MyDataToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_MyDataToolBar);if(!m_MyStatusBar.Create(this)||!m_MyStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){TRACE0("Failedtocreatedstatusbar\n");return-1;//failtocreate}return0;}步驟四:編譯并運行此應用程序,將會看到在原來程序的基礎之上,在窗口的最下端增加了一個狀態欄。說明:(1)在上例創建狀態欄的過程中,曾用到了CStatusBar類的對象,CStatusBar是VisualC++的MFC類庫中的一個類,它用于描述狀態欄,CStatusBar類是由CControlBar類派生而來的。其中,Create函數是其成員函數,該函數的原型為:
BOOLCreate(CWnd*pParentWnd, DWORDdwStyle=WS_CHILD|WS_VISIBLE |CBRS_BOTTOM, UINTnID=AFX_IDW_STATUS_BAR);其中:pParentWnd是指向狀態欄父窗口的指針,dwStyle是狀態欄的風格,nID是子窗口的ID號,表6.7中列出了決定狀態欄風格的幾種常用的取值及對應的風格。
表6.7dwStyle的取值及對應的狀態欄的風格(2)在MainFrm.cpp文件中加入的數組indicators的定義:staticUINTindicators[],用于描述狀態欄中所包含的內容。如果在利用AppWizard向導創建SDI或MDI應用程序框架中的第4步中,選擇了“Initialstatusbar”時,則向導會自動在MainFrm.cpp文件中加入數組indicators的定義。向導生成的缺省的indicator數組包含了四個元素,它們是ID_SEPARATOR、ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL。取值風格CBRS_TOPCBRS_BOTTOMCBRS_NOALIGN在框架窗口的頂部在框架窗口的底部當父窗口改變尺寸以后不隨之變動(3)要在狀態欄的窗格中顯示文本信息,可以采用以下三種方法:①調用CWnd::SetWindowText函數更新信息行窗格中的文本。由于狀態欄也是一種窗口,所以在程序中可以直接調用該函數。如:若狀態欄變量為m_wndStatusBar,則m_wndStatusBar.SetWindowText(“新修改的信息”)語句將在信息行窗格中顯示“新修改的信息”。②手動處理狀態欄的MAND_UI更新信息,并在處理函數中調用CCmdUI::SetText函數,該函數的原型為:virtualvoidSetText(LPCTSTRlpszText);其中:參數lpszText是一個指向字符串的指針。③調用函數CStatusBar::SetPaneText與CStatusBar::GetPaneText可以設置或獲得任何窗格(包括信息行窗格)中的文本。此函數的原型為:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);CStringGetPaneText(intnIndex)const;其中,參數nIndex是待設置的窗格位置索引號(第1個窗格的位置索引為0),lpszNewText表示要顯示的字符串,若參數bUpdate的值為TRUE,系統自動更新顯示的結果。(4)調用CStatusBar::CommandToIndex可以獲得指定資源ID號所在窗格的位置索引號,該函數的原型為:intCommandToIndex(UINTnIDFind)const;其中:參數nIDFind是狀態欄中某一資源ID號。(5)調用函數CStatusBar::SetPaneInfo與CStatusBar::GetPaneInfo可設置或獲得窗格的長度、風格等信息,它們的函數原型為:voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);voidGetPaneInfo(intnIndex,UINT&nID,UINT&nStyle,int&cxWidth)const;其中:參數nIndex表示要設置的狀態欄窗格的索引號,nID用來為狀態欄窗格指定新的資源ID號,cxWidth表示窗格的像素寬度,nStyle表示狀態欄窗格的風格類型,用來指定窗格的外觀,如:SBPS_POPOUT表示窗格是凸起來的。具體見表6.8。風格取值風格SBPS_NOBORDERSSBPS_POPOUTSBPS_DISABLEDSBPS_STRETCH
SBPS_NOMAL窗格四周沒有3D邊框反顯邊框使文字凸起顯示禁用窗格,不顯示文本拉伸窗格,交填充窗格不用的空白空間。但狀態欄中只能有一個窗格具有這種風格普通窗格,沒有“拉伸”、“3D邊框”、“文字凸起顯示”等效果表6.8狀態欄中各窗格的風格取值及對應風格(6)調用CStatusBar::SetPaneStyle與CStatusBar::GetPaneStyle可分別用來設置或獲得狀態欄窗格的風格,二者的原型如下:UINTGetPaneStyle(intnIndex)const;voidSetPaneStyle(intnIndex,UINTnStyle);其中:參數nIndex是狀態欄中某一窗格的位置索引號,nStyle為狀態欄中窗格的風格。3、進一步完善狀態欄現在,我們在剛才添加狀態欄例子的基礎上進行修改。當用戶選擇“關于”菜單項時,彈出“字體對話框”,當單擊“確定”按鈕關閉此對話框后,在狀態欄上原來顯示文本測試狀態欄的空格中顯示“您已經查看過字體對話框!”,按照下面的方法進行操作。步驟一:選擇【View】菜單中的【ClassWizard】菜單項。彈出【MFCClassWizard】對話框,在【Classname】列表中選擇類CMainFrame,在【ObjectIDs】列表中選擇ID_APP_ABOUT;右邊的【Messages】欄中將出現COMMAND和MAND_UI,雙擊COMMAND選項。將彈出AddMemberFunction對話框。步驟二:接受系統缺省的函數名稱OnAppAbout,單擊【OK】按鈕,返回MFCClassWizard對話框。這時在MFCClassWizard對話框中的【Memberfunctions】框中增加了一個函數OnAppAbout。步驟三:單擊【EditCode】按鈕,在代碼編輯窗口中打開OnAppAbout函數。在編輯此函數之前,首先要在MainFrm.cpp文件中添加一個#include語句。具體代碼如下,其中粗體部分為新增加的代碼。//MainFrm.cpp:implementationoftheCMainFrameclass//#include"stdafx.h"#include"Dialog.h"#include"MainFrm.h"#include"MydataDialog.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif步驟四:在代碼編輯窗口中,編輯函數OnAppAbout()。具體代碼如下,其中粗體部分為新增加的代碼。voidCMainFrame::OnAppAbout(){//TODO:AddyourcommandhandlercodehereCMydataDialogdlg;if(dlg.DoModal()==IDOK){CClientDCdc(this);SIZEsize=dc.GetTextExtent("您已經查看過個人資料對話框!");intmandToIndex(ID_STATUSBAR_STR);m_MyStatusBar.SetPaneInfo(index,ID_STATUSBAR_STR,SBPS_POPOUT,size.cx);說明:在此函數中,首先生成了一個字體對話框的實例,并且顯示為有模式對話框。當用戶單擊【確定】按鈕退出此對話框時,要改變狀態欄的字符串顯示。首先調用函數GetTextExtent()來獲得字符串的長度,然后調用CommandToIndex()函數獲得窗格的索引,再通過調用函數SetPaneInfo()來設置窗格的長度、風格等信息。在此例中,我們使用了風格SBPS_POPOUT,它使創建的窗格看起來是從狀態欄中凸出來的。最后調用函數SetPaneText()來顯示文本內容。步驟五:編譯并運行此應用程序。m_MyStatusBar.SetPaneText(index,_T("您已經查看過個人資料對話框!"),TRUE);}}在應用程序中,要實現菜單的功能,其步驟和方法是先利用菜單編輯器建立菜單資源,然后編寫菜單命令的MAND消息映射函數及相應代碼。在MFC框架中,菜單命令消息是按照一定的順序進行傳遞的。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 護理實習生學習:患者隱私保護不是一句口號
- 2024人教版八年級生物上冊期末復習全冊考點提綱
- 2026年振動環境下三維掃描精度保障技術調研及專業產品報告
- 統編小學二年級語文上冊第四單元測試卷(二)含答案
- 統編版七年級歷史下冊知識要點
- 2024年安徽省中考物理試題(原卷版)
- 陜西西安市某校2025-2026學年高二年級下冊5月階段檢測物理試卷(含答案)
- 在雷波哪家幼兒園好?芳華有愛口碑佳
- 網絡和基礎保護 8
- 2026中國醫藥器械行業市場發展深度解析及未來趨勢與投資機遇研究報告
- 上海市2026年中考數學試題(附答案)
- 2026年交管12123駕駛證學法減分試題(含參考答案)
- 《自我保護免受傷害》教學課件 - 2026-2027 學年統編版(新教材)小學道德與法治四年級上冊
- 2026中國遠洋漁業船舶智能化改造需求與衛星通信系統標配化
- 2026年(完整版)國家GCP培訓考試題庫及參考答案(完整版)
- 中考英語作文10賓語從句寫作句型練習
- 租戶騰退協議書模板
- 2026年船舶駕駛員考試題庫及答案
- 預防接種規范培訓課件教學
- 項目技術標述標
- 睡眠呼吸障礙合并哮喘的診療策略-1
評論
0/150
提交評論