Visual C++基礎教程課件:菜單、工具欄和狀態(tài)欄_第1頁
Visual C++基礎教程課件:菜單、工具欄和狀態(tài)欄_第2頁
Visual C++基礎教程課件:菜單、工具欄和狀態(tài)欄_第3頁
Visual C++基礎教程課件:菜單、工具欄和狀態(tài)欄_第4頁
Visual C++基礎教程課件:菜單、工具欄和狀態(tài)欄_第5頁
已閱讀5頁,還剩137頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

菜單、工具欄和狀態(tài)欄

11.1菜單

11.2工具欄

11.3狀態(tài)欄

習題

11.1菜單11.1.1菜單基礎

Windows應用程序中,菜單的結(jié)構(gòu)如圖11-1所示。圖11-1菜單結(jié)構(gòu)

出現(xiàn)在窗口標題欄下的菜單欄叫做應用程序“頂層菜單”,其中的項稱為“頂層菜單項”。單擊頂層菜單項一般會打開一個“下拉菜單”。根據(jù)需要,頂層菜單項也可以是一個命令。下拉菜單中的菜單項稱為“菜單項”。菜單項后面如果有“…”,則單擊時一般會打開一個對話框,若后面帶有“”,則此菜單項帶有子菜單。菜單項中帶下劃線的字符為菜單項的鍵盤助記符,對于頂層菜單,同時按下Alt+帶下劃線的字符則會打開其下拉菜單,對于下拉菜單中的菜單項,如果其沒有子菜單,在菜單打開的情況下在鍵盤上按下帶下劃線的字符即執(zhí)行此菜單項,若有子菜單則會打開子菜單。有些菜單項后還帶有快捷鍵,如“Compile”菜單項帶有快捷鍵Ctrl+F7,當在鍵盤上按下快捷鍵時,就會執(zhí)行此菜單命令。帶有子菜單的菜單項同時作為子菜單的菜單名。

Windows還支持“彈出式菜單”,當右擊鼠標時彈出菜單。彈出式菜單實際上就是下拉式菜單。

MFC提供了CMenu類,用于對菜單進行控制和操作。在MFC應用程序中創(chuàng)建菜單時可以有如下三種方法:

(1)利用菜單編輯器創(chuàng)建菜單資源,并在應用程序運行時加載生成的菜單。

(2)用編程方法創(chuàng)建菜單,調(diào)用CreateMenu、InsertMenu和CMenu類的其它函數(shù)創(chuàng)建、插入和操作菜單。

(3)創(chuàng)建菜單模板,并用CMenu::LoadMenuIndirect創(chuàng)建菜單。11.1.2創(chuàng)建菜單創(chuàng)建菜單最簡單的方法是使用VisualC++提供的菜單編輯器。當使用AppWizard生成應用程序框架時,默認情況下已經(jīng)為應用程序創(chuàng)建了一個菜單ID為IDR_MAINFRAME的菜單資源。可以在此菜單資源的基礎上修改、添加自己的菜單項和子菜單,也可以添加新的菜單資源。下面以實例來說明如何利用菜單編輯器創(chuàng)建菜單。【例11.1】編寫一個單文檔界面應用程序,通過菜單選擇在視圖窗口中畫不同的圖形和設置圖形的顏色。程序的創(chuàng)建過程如下:

(1)利用MFCAppWizard[exe]創(chuàng)建SDI應用程序,項目名設置為MyDraw。

(2)單擊項目工作區(qū)窗口下的“ResourceView”標簽,打開資源列表。展開“Menu”,雙擊Menu下的IDR_MAINFRAME即可打開菜單編輯器,如圖11-2所示。圖11-2菜單編輯器

(3)為程序添加頂層菜單項。雙擊菜單編輯器中的新菜單項框(具有虛線的空白框),打開菜單項屬性對話框,如圖11-3所示。在Caption中輸入菜單項標題“畫圖[&D]”,菜單標題中的“&”表示“&”后面的一個字符為此菜單項的鍵盤助記符,并在此字符下自動添加下劃線。在同一層的菜單項不允許有重復的助記符。對于頂層菜單項,屬性Pop-up缺省是選中的,表示其含有下拉菜單,此時菜單項沒有菜單ID。如果取消Pop-up屬性,則此菜單即為可以執(zhí)行的菜單命令。

(4)為頂層菜單項添加下拉菜單項。在菜單編輯器中單擊“畫圖[&D]”,雙擊下方的新菜單項框,彈出菜單項屬性對話框。在ID框中輸入ID_DRAW_ELLIPSE,在Caption框中輸入菜單項標題“橢圓[&E]\tCtrl+E”。“&”后面的“E”為此菜單項的鍵盤助記符,“\t”后的“Ctrl+E”為此菜單項的快捷鍵。在Prompt框中輸入此菜單的提示信息“在視圖窗口畫一個橢圓”。程序運行時,當用鼠標指向此菜單項時,在狀態(tài)欄上會顯示此提示信息。圖11-3菜單項屬性對話框

(5)重復第(3)、(4)步,設計完成的菜單如圖11-4所示。圖11-4程序中創(chuàng)建的畫圖和顏色菜單各菜單項的ID值如表11-1所示。表11-1各菜單項的ID值菜單ID菜單項標題ID_DRAW_ELLIPSE橢圓[&E]\tCtrl+EID_DRAW_TRIANGLE三角形[&T]ID_DRAW_RECTANGLE矩形[&R]ID_COLOR_RED紅色[&R]ID_COLOR_GREEN綠色[&G]ID_COLOR_BLUE藍色[&B]ID_COLOR_CUSTOM自定義...菜單屬性對話框中其它屬性的含義為:

◆Separator:選中該屬性,則菜單項將變成一個分隔條。

◆Pop-up:選中該屬性,表示此菜單項包含子菜單,即創(chuàng)建一個彈出式菜單,否則該菜單為可執(zhí)行的命令。

◆Inactive:指明菜單項是不活動的。

◆Break:若選擇Column,則此菜單項以及下面的菜單項在新的一列顯示。當菜單項較多時,可以利用此屬性將菜單項分兩列顯示。

◆Checked:選中此屬性,則在菜單項前面添加一個選中標志。

◆Grayed:選中此屬性,則此菜單項為灰色,禁止使用。在菜單編輯器中,用鼠標拖動菜單項可以移動位置,選中菜單項然后單擊Delete鍵可以刪除菜單項,還可以對菜單項進行復制和粘貼。11.1.3添加菜單命令處理函數(shù)在基于MFC框架的應用程序中,如果沒有為創(chuàng)建的菜單命令添加相應的命令消息處理函數(shù),則此菜單命令將呈現(xiàn)灰色,禁止用戶使用。應用程序運行時,若用戶執(zhí)行一個菜單命令(通過鼠標單擊或按下快捷鍵等方式),則向應用程序框架發(fā)送WM_COMMAND消息,消息的參數(shù)wParam的低位字保存著該菜單項的菜單ID。在基于MFC框架的應用程序中,可以在任何地方處理命令消息WM_COMMAND。實際上,框架窗口是大多數(shù)命令消息的接收者,但命令消息可以在視圖類、文檔類甚至在應用程序類中被處理,只要在該類的消息映射表中添加要處理的消息的映射項即可。從CCmdTaret派生出來的所有類都可以處理命令消息。在SDI應用程序中,命令消息的傳遞過程如圖11-5所示。當MFC應用程序的框架窗口接收到命令消息WM_COMMAND時,它首先將消息傳遞給活動視圖窗口,如果視圖類中有此命令的處理函數(shù),則調(diào)用此處理函數(shù),消息傳遞結(jié)束,否則此命令消息傳遞給與視圖相關聯(lián)的文檔。因此,活動視圖窗口首先處理命令消息,接著是與視圖關聯(lián)的文檔、框架窗口,最后是應用程序?qū)ο蟆H绻麄鬟f路徑上的某個對象可以處理此消息,則消息傳遞終止。如果傳遞路徑上所有對象都沒有此消息的處理函數(shù),則它會被傳遞給::DefWindowProc進行缺省處理。圖11-5SDI應用程序中命令消息的傳遞路徑需要說明的是,只有命令消息WM_COMMAND和用戶界面更新命令消息UPDATE_COMMAND_UI才遵循上述傳遞機制。標準Windows消息如WM_CREATE、WM_

LBUTTONDOWN等必須在接收這些消息的窗口中處理。由于命令消息可以被傳遞給路徑上的多個對象來進行處理,因此用戶應該根據(jù)命令的功能來決定將命令消息映射到哪個類中。如果菜單命令與視圖的顯示有關,則應該將其映射到視圖類中,即在視圖類中應該只響應特定于該視圖窗口的命令,如copy等。在文檔類中響應對該文檔修改立即有效的命令消息,然后根據(jù)消息處理的結(jié)果,更新與該文檔關聯(lián)的所有視圖,如文檔的讀/寫命令等。對于完成一些通用功能的命令,一般映射到框架窗口類中。添加菜單命令處理函數(shù)可以利用類向?qū)lassWizard。下面給例11.1的MyDraw添加必要的代碼和菜單命令處理函數(shù),完成應用程序的功能。在視圖類CMyDrawView的定義中添加如下的數(shù)據(jù)成員:

protected: intm_nShape; COLORREFm_crColor;

在視圖類CMyDrawView的構(gòu)造函數(shù)中對數(shù)據(jù)成員進行初始化:

CMyDrawView::CMyDrawView()

{ m_nShape=0; //缺省繪制橢圓

m_crColor=RGB(0,0,0); //缺省圖形顏色為黑色}利用ClassWizard在視圖類CMyDrawView中為菜單命令添加消息處理函數(shù)。執(zhí)行“View”→“ClassWizard”菜單命令或按下Ctrl+W快捷鍵打開ClassWizard對話框,選中“MessageMaps”標簽,在Classname框中選擇類名CMyDrawView,在ObjectsIDs下選擇ID_DRAW_ELLIPSE(“畫圖”→“橢圓”菜單項的ID),在Messages框中選擇COMMAND,單擊“AddFunction”按鈕為橢圓菜單項添加消息處理函數(shù),單擊“EditCode”按鈕打開代碼編輯窗口,編輯ClassWizard生成的消息處理函數(shù):

voidCMyDrawView::OnDrawEllipse()

{ m_nShape=0; Invalidate(); //產(chǎn)生WM_PAINT消息更新視圖

}

同樣為其它菜單項添加WM_COMMAND消息處理函數(shù)如下:

voidCMyDrawView::OnDrawTriangle()

{ m_nShape=1; Invalidate();

}

voidCMyDrawView::OnDrawRectangle()

{ m_nShape=2; Invalidate();

}

voidCMyDrawView::OnColorRed()

{ m_crColor=RGB(255,0,0); Invalidate();

}

voidCMyDrawView::OnColorGreen()

{ m_crColor=RGB(0,255,0); Invalidate();

}

voidCMyDrawView::OnColorBlue()

{ m_crColor=RGB(0,0,255); Invalidate();

}

voidCMyDrawView::OnColorCustom()

{ CColorDialogcolorDlg;

//定義公用顏色對話框?qū)ο?/p>

colorDlg.DoModal();

//顯示顏色對話框

m_crColor=colorDlg.GetColor(); //獲取用戶在對話框中選擇的顏色

Invalidate();

}

編輯視圖類OnDraw函數(shù),在其中添加如下黑體代碼:

voidCMyDrawView::OnDraw(CDC*pDC)

{ CMyDrawDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahere CPointpoints[3]; CRectrcClient; GetClientRect(&rcClient); intcx=rcClient.Width()/2; intcy=rcClient.Height()/2; CRectrcShape(cx-45,cy-45,cx+45,cy+45); CBrushbrush,*pOldBrush; brush.CreateSolidBrush(m_crColor); pOldBrush=pDC->SelectObject(&brush); switch(m_nShape) { case0: rcShape.InflateRect(30,0); pDC->Ellipse(rcShape); break; case1: points[0].x=cx-45; points[0].y=cy+45; points[1].x=cx; points[1].y=cy-45; points[2].x=cx+45; points[2].y=cy+45; pDC->Polygon(points,3); break; case2: pDC->Rectangle(rcShape); break; } pDC->SelectObject(pOldBrush);

}編譯、鏈接和運行程序,程序運行結(jié)果如圖11-6所示。圖11-6程序MyDraw的運行結(jié)果11.1.4更新菜單項在許多應用程序中,必須不斷更新菜單中的菜單項,使它能反映出應用程序的內(nèi)部狀態(tài)和數(shù)據(jù)的變化。例如在MyDraw中,當從顏色菜單中選擇了一種顏色后,相應的菜單就應該加上復選標記,指明當前選中的顏色。當某個菜單命令執(zhí)行的條件不具備時,應該使菜單項無效。在Windows應用程序中,經(jīng)常看到灰色的菜單項,以及菜單項前面的復選標記。

MFC提供了一種簡單方便的機制更新菜單項。利用ClassWizard可以為菜單項添加用戶界面更新命令消息UPDATE_COMMAND_UI的處理函數(shù),當用戶打開下拉菜單時,應用程序框架調(diào)用菜單中所有菜單項的更新命令處理函數(shù)。每個更新命令處理函數(shù)都有一個指向CCmdUI對象的指針,在處理函數(shù)中利用該對象的成員函數(shù)修改菜單項。類CCmdUI只用作在CCmdTarget派生類的用戶界面更新命令消息UPDATE_COMMAND_UI的處理函數(shù)中,類中包含有指向用戶界面對象的ID值或指針,其成員函數(shù)如表11-2所示。用戶界面更新處理函數(shù)只能應用于下拉菜單的菜單項,而不能應用于頂層菜單項。例如,不能使用用戶界面更新處理函數(shù)來禁止一個“文件”菜單項。表11-2CCmdUI成員函數(shù)成員函數(shù)說明Enable使用戶界面對象有效或無效SetCheck設置或取消選中用戶界面對象SetRadio給用戶界面對象添加或刪除單選標記SetText改變菜單項標題文本下面為例11.1的程序MyDraw的“畫圖”下拉菜單項添加用戶界面更新處理函數(shù)。利用類向?qū)lassWizard添加用戶界面更新處理函數(shù)的方法與添加命令處理函數(shù)的方法相同,區(qū)別只是在Messages列表框中選擇UPDATE_

COMMAND_UI。為“畫圖”下拉菜單項添加的用戶界面更新處理函數(shù)如下:

voidCMyDrawView::OnUpdateDrawEllipse(CCmdUI*pCmdUI)

{

pCmdUI->Enable(m_nShape!=0);

//執(zhí)行“橢圓”菜單后禁用

}

voidCMyDrawView::OnUpdateDrawTriangle(CCmdUI*pCmdUI)

{ pCmdUI->Enable(m_nShape!=1);

}

voidCMyDrawView::OnUpdateDrawRectangle

(CCmdUI*pCmdUI)

{ pCmdUI->Enable(m_nShape!=2);

}11.1.5鍵盤快捷鍵快捷鍵利用鍵盤輸入方式代替執(zhí)行應用程序的菜單命令或工具欄命令,可提高使用效率。當在鍵盤上按下快捷鍵時,也會發(fā)送WM_COMMAND命令消息。在給菜單項輸入標題時,字符“\t”后的字符串為此菜單項的快捷鍵,但要使此快捷鍵起作用,還需要做一些工作。在基于MFC框架的應用程序中,給菜單項或工具欄上的按鈕添加鍵盤快捷鍵非常方便簡單。單擊項目工作區(qū)窗口下的“ResourceView”標簽,打開資源列表。展開Accelerator,雙擊Accelerator下的IDR_

MAINFRAME,打開快捷鍵編輯器。用鼠標雙擊快捷鍵編輯器中的快捷鍵列表項可打開“AccelProperties”對話框,可在此對話框中對快捷鍵進行設置。要添加新的快捷鍵,雙擊快捷鍵列表底部的空白行,在打開的屬性對話框中即可進行設置。選中快捷鍵列表中的項,按Delete鍵可以刪除快捷鍵。下面為MyDraw程序的“橢圓”菜單添加快捷鍵。雙擊快捷鍵列表底部的空白行,打開屬性對話框,如圖11-7所示。圖11-7快捷鍵屬性對話框在ID下拉列表框中選中“畫圖”菜單的ID值ID_DRAW

_ELLIPSE,在Key欄中輸入“E”,在Modifiers中選中Ctrl,則“畫圖”菜單項的快捷鍵為Ctrl+E。由于快捷鍵總是配合菜單或工具欄命令按鈕使用,因此,不必為快捷鍵添加命令處理函數(shù),它共用與其ID值相同的菜單或工具欄命令按鈕的消息處理函數(shù)。11.1.6快捷菜單快捷菜單也稱為彈出式菜單或上下文菜單,當用戶右擊鼠標時,快捷菜單出現(xiàn)在鼠標指針所在位置。快捷菜單可以利用菜單欄上的已有下拉菜單創(chuàng)建,也可為快捷菜單添加新的菜單資源。當用戶單擊鼠標右鍵時會產(chǎn)生WM_CONTEXTMENU消息,可以在應用程序中為此消息添加消息處理函數(shù),在消息處理函數(shù)中調(diào)用CMenu::TrackPopupMenu可顯示快捷菜單。函數(shù)原型為:

BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);其中,參數(shù)“nFlags”確定快捷菜單相對于x值的水平對齊方式以及哪一個鼠標按鈕用來選中菜單中的菜單項。對齊標志TPM_CENTERALIGN、TPM_LEFTALIGN和TPM_

RIGHTALIGN分別指定快捷菜單與x值水平居中、左對齊和右對齊。TPM_LEFTBUTTON和TPM_RIGHTBUTTON標志確定鼠標左鍵或右鍵是否能進行菜單項選擇。參數(shù)“x”和“y”確定菜單在屏幕上的位置。參數(shù)“pWnd”標識擁有此快捷菜單的窗口。在使用菜單欄上的下拉菜單創(chuàng)建快捷菜單時,首先要獲得指向下拉菜單的指針,這可以通過調(diào)用CWnd::GetMenu和CMenu::GetSubMenu函數(shù)獲得。函數(shù)GetMenu可以獲得指向菜單欄的指針(菜單欄位于框架窗口內(nèi),子窗口沒有菜單)。函數(shù)GetSubMenu獲得指向下拉菜單的指針,其參數(shù)指定包含下拉菜單的菜單項在菜單中的位置,第一個菜單項位置為0。下面為例11.1的MyDraw添加快捷菜單,當用戶右擊視圖窗口時,彈出“顏色”菜單。利用ClassWizard在視圖類中添加消息WM_

CONTEXTMENU的處理函數(shù),在函數(shù)中添加如下黑體代碼:

voidCMyDrawView::OnContextMenu(CWnd*pWnd,CPointpoint)

{ CWnd*pParent=GetParent();

//獲得指向視圖窗口父窗口(框架窗口)的指針

CMenu*pMenu=pParent->GetMenu();

//獲得指向頂層菜單的指針

//獲得顏色菜單的指針,顏色菜單在頂層菜單中位于第6項

CMenu*pSubMenu=pMenu->GetSubMenu(5); pSubMenu->TrackPopupMenu

(TPM_

LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this);

}編譯、鏈接和運行程序,當在視圖窗口中右擊鼠標時,彈出快捷菜單,如圖11-8所示。圖11-8MyDraw的快捷菜單11.1.7動態(tài)修改菜單

MFC應用程序可以在程序運行過程中動態(tài)增加、修改和刪除菜單。CMenu類中提供了對菜單進行操作的相應的成員函數(shù)。CMenu類中用于增加、修改和刪除菜單的成員函數(shù)如表11-3所示。表11-3CMenu類中用于修改菜單的成員函數(shù)成員函數(shù)說明AppendMenu在菜單尾部添加一個菜單項InsertMenu在菜單指定位置插入一個菜單項ModifyMenu修改指定菜單項的ID、標題或其它屬性RemoveMenu刪除指定的菜單項,但不刪除其子菜單DeleteMenu刪除指定的菜單項及其子菜單11.1.8用代碼創(chuàng)建菜單除了利用菜單編輯器創(chuàng)建菜單外,用MFC的CMenu類和它的成員函數(shù)通過編程也可以創(chuàng)建菜單。

CMenu類中用于創(chuàng)建菜單的成員函數(shù)有CreateMenu、CreatePopupMenu和AppendMenu。函數(shù)CreateMenu用于創(chuàng)建菜單,CreatePopupMenu用于創(chuàng)建子菜單,AppendMenu用于向子菜單中添加菜單項或?qū)⒆硬藛螔旖拥巾攲硬藛紊稀!纠?1.2】在應用程序MyDraw中通過編程增加兩個菜單“縮放”和“修改菜單”。編程和實現(xiàn)方法如下:

(1)為將要新增的菜單定義ID值。由于每一個菜單項都必須有唯一的一個ID值,因此,在增加菜單之前必須為新的菜單項定義一個ID值。單擊項目工作區(qū)窗口下的FileView標簽,展開SourceFiles,雙擊Resource.h打開資源頭文件,在其中添加如下的菜單ID值的定義:

#defineID_ZOOM_IN110

#defineID_ZOOM_OUT120

#defineID_MODIFY_ADD130

#defineID_MODIFY_DEL140

#defineID_DRAW_TEXT150

(2)編程創(chuàng)建兩個子菜單,并將其添加到頂層菜單中。由于在SDI中菜單屬于主框架窗口,因此將創(chuàng)建菜單的代碼添加在主框架窗口類中。在CMainFrame類的OnCreate成員函數(shù)中添加如下的代碼:

intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)

{

CMenu*pmainMenu; pmainMenu=GetMenu(); //獲取指向主菜單的指針

CMenusubMenu; subMenu.CreatePopupMenu(); //創(chuàng)建子菜單

subMenu.AppendMenu(MF_STRING,ID_ZOOM_IN,“放大”);

//添加菜單項

subMenu.AppendMenu(MF_STRING,ID_ZOOM_OUT,“縮小”);

//將子菜單掛接到主菜單上

pmainMenu->AppendMenu(MF_POPUP,(UINT)

subMenu.Detach(),"縮放(&Z)"); subMenu.CreatePopupMenu(); subMenu.AppendMenu(MF_STRING,ID_MODIFY_ADD,"增加"); subMenu.AppendMenu(MF_STRING,ID_MODIFY_DEL,"刪除"); pmainMenu->AppendMenu(MF_POPUP,(UINT)

subMenu.Detach(),"修改菜單"); pmainMenu->Detach();//將主菜單與CMenu對象分離

return0;

}

(3)通過第(2)步,已經(jīng)創(chuàng)建了兩個下拉菜單“縮放”和“修改菜單”,下面需要給創(chuàng)建的子菜單項添加命令處理函數(shù),否則,創(chuàng)建的菜單在運行時禁止使用。對于通過編程創(chuàng)建的菜單項,不能利用ClassWizard為其添加命令消息處理函數(shù),因此只能手工添加消息處理函數(shù)。對于每一個消息處理函數(shù),需要添加函數(shù)原型、消息映射項和函數(shù)體。打開視圖類的頭文件MyDrawView.h,在其中找到DECLARE_MESSAGE_MAP,在DECLARE_

MESSAGE_MAP之上、注釋“//}}AFX_MSG”之下添加消息處理函數(shù)原型:

classCMyDrawView:publicCView

{ protected: //{{AFX_MSG(CMyDrawView) //}}AFX_MSG afx_msgvoidOnZoomIn(); afx_msgvoidOnZoomOut(); afx_msgvoidOnModifyAdd(); afx_msgvoidOnModifyDel(); afx_msgvoidOnDrawText(); DECLARE_MESSAGE_MAP()

};手工添加的消息處理函數(shù)原型應該添加在注釋對“//}}AFX_MSG”的外面,注釋對中間的部分為ClassWizard添加和管理。在視圖類的實現(xiàn)文件MyDrawView.cpp中添加消息映射項。打開MyDrawView.cpp文件,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間添加消息映射項。手工添加的消息映射項應該在注釋對“//}}AFX_MSG_MAP”之外:

BEGIN_MESSAGE_MAP(CMyDrawView,CView) //{{AFX_MSG_MAP(CMyDrawView) //}}AFX_MSG_MAP ON_COMMAND(ID_ZOOM_IN,OnZoomIn) ON_COMMAND(ID_ZOOM_OUT,OnZoomOut) ON_COMMAND(ID_MODIFY_ADD,OnModifyAdd) ON_COMMAND(ID_MODIFY_DEL,OnModifyDel) ON_COMMAND(ID_DRAW_TEXT,OnDrawText) //Standardprintingcommands END_MESSAGE_MAP()在視圖類的實現(xiàn)文件MyDrawView.cpp中添加消息處理函數(shù)的函數(shù)體如下:

voidCMyDrawView::OnZoomIn()

{ m_nFlag=1; //設置放大標志

Invalidate(); //更新視圖

}

voidCMyDrawView::OnZoomOut()

{ m_nFlag=2; Invalidate();

}

voidCMyDrawView::OnModifyAdd()

{ //在“畫圖”菜單下增加菜單項“文本”

CWnd*pParent=GetParent(); CMenu*pMenu=pParent->GetMenu(); CMenu*pSubMenu=pMenu->GetSubMenu(4); pSubMenu->AppendMenu(MF_STRING,ID_DRAW_

TEXT,"文本");

}

voidCMyDrawView::OnModifyDel()

{ //刪除“畫圖”菜單下增加的菜單項

CWnd*pParent=GetParent(); CMenu*pMenu=pParent->GetMenu(); CMenu*pSubMenu=pMenu->GetSubMenu(4); pSubMenu->RemoveMenu(ID_DRAW_TEXT,MF_BYCOMMAND);

}

//新增菜單的命令消息處理函數(shù)

voidCMyDrawView::OnDrawText()

{ m_nShape=3; Invalidate();

}

(4)修改視圖類的OnDraw以適應菜單的變化。在CMyDrawView類的定義中增加一個int數(shù)據(jù)成員m_nFag,用于記錄執(zhí)行創(chuàng)建菜單“縮放”的情況,并在構(gòu)造函數(shù)中將其初始化為0。修改OnDraw,在其中增加如下的黑體代碼:

voidCMyDrawView::OnDraw(CDC*pDC)

{

switch(m_nFlag) { case1: rcShape.InflateRect(50,50); break; case2: rcShape.DeflateRect(10,10); break; } switch(m_nShape) {

case3: pDC->DrawText("執(zhí)行了增加的菜單",rcShape,DT_WORDBREAK|DT_CENTER|DT_VCENTER); break; } pDC->SelectObject(pOldBrush);}編譯、鏈接和運行程序,運行結(jié)果如圖11-9所示。圖11-9用代碼創(chuàng)建菜單的執(zhí)行結(jié)果11.1.9使用菜單資源使用AppWizard創(chuàng)建應用程序框架時,應用程序框架中已經(jīng)添加了IDR_MAINFRAME的菜單資源,可以在此菜單資源的基礎上修改和添加應用程序的菜單。除了可以使用缺省生成的菜單資源外,在應用程序中還可以創(chuàng)建用戶自己的菜單資源。

為了在程序中使用自己的菜單資源,首先需要利用CMenu::LoadMenu從應用程序中裝載菜單資源并與CMenu對象關聯(lián),函數(shù)原型為:

BOOLLoadMenu(UINTnIDResource);其中,參數(shù)“nIDResource”指定裝載的菜單資源ID。然后利用CWnd::SetMenu將與菜單資源關聯(lián)的CMenu對象設置為當前菜單,函數(shù)原型為:

BOOLSetMenu(CMenu*pMenu);其中,參數(shù)“pMenu”指定新的菜單對象。【例11.3】在應用程序MyDraw中創(chuàng)建一個英文的菜單資源,并允許在中、英文菜單之間進行切換。編程和實現(xiàn)方法如下:

(1)在IDR_MAINFRAME菜單資源中增加一個“英文”頂層菜單命令。在項目工作區(qū)窗口中選中“ResourceView”標簽,在窗口中雙擊IDR_MAINFRAME打開菜單資源,增加頂層菜單命令“英文”,取消其Pop-up屬性,指定其ID值為ID_ENGLISH,Caption標題為“英文”。

(2)插入新的菜單資源,創(chuàng)建新菜單。單擊項目工作區(qū)窗口的“ResourceView”標簽,在窗口中右擊Menu,選擇“InsertMenu”菜單命令,插入新的菜單資源。右擊插入的菜單資源ID,選擇“Properties”菜單命令,在彈出的對話框中將插入的菜單資源的ID修改為IDR_ENGLISH。在插入的菜單資源中添加如圖11-10所示的菜單。為了與中文菜單共用相同的菜單命令消息處理函數(shù),各對應菜單的ID值與IDR_MAINFRAME中的菜單ID值應相同。圖11-10在新菜單資源中添加的菜單取消菜單命令“Chinese”的Pop-up屬性,指定其ID值為ID_CHINESE。

(3)為菜單命令“英文”和“Chinese”添加命令消息處理函數(shù),在兩個菜單資源中進行切換。利用ClassWizard在主框架窗口類CMainFrame中添加兩個菜單命令的消息處理函數(shù):

voidCMainFrame::OnChinese()

{ CMenum_Menu; //定義菜單對象

m_Menu.LoadMenu(IDR_MAINFRAME); //裝載菜單資源

SetMenu(&m_Menu); //將裝載的菜單資源設置為當前菜單

m_Menu.Detach(); //將菜單與CMenu對象分離

}

voidCMainFrame::OnEnglish()

{ CMenum_Menu; m_Menu.LoadMenu(IDR_ENGLISH); SetMenu(&m_Menu); m_Menu.Detach();

}

編譯、鏈接和運行程序,當執(zhí)行“英文”命令時切換到英文菜單(如圖11-11所示),執(zhí)行“Chinese”命令時切換到中文菜單。兩套菜單命令使用相同的消息處理函數(shù)。圖11-11切換到英文菜單的結(jié)果11.2工具欄11.2.1工具欄編輯器在工具欄上,所有工具欄按鈕都存儲于一個位圖資源中。默認方式下,每個按鈕圖像都是16個像素寬、15個像素高。應用程序框架給按鈕提供了一個邊框,并通過改變這些邊框和按鈕的圖像顏色來反映當前按鈕的狀態(tài)。圖11-12顯示了工具欄位圖和與之對應的工具欄。圖11-12工具欄位圖和實際的工具欄在VisualC++中,可以使用工具欄編輯器對工具欄進行編輯和修改,也可以插入新的工具欄資源。選中項目工作區(qū)窗口中的“ResourceView”標簽,在窗口中展開“Toolbar”,雙擊其中的工具欄資源,出現(xiàn)如圖11-13所示的工具欄編輯器和繪圖工具欄(Graphics)、調(diào)色板(Colors)工具欄。工具欄編輯器實際上是一個圖像編輯器,利用它可以在工具欄上添加按鈕、編輯按鈕和刪除按鈕。圖11-13工具欄編輯器

1.添加新的工具欄執(zhí)行“Insert”→“Resource”菜單命令(或按快捷鍵Ctrl+R),在“插入資源”對話框中雙擊Toolbar,或者在項目工作區(qū)窗口的ResourceView標簽窗口中右擊Toolbar,選擇“InsertToolbar”菜單命令。新添加的工具欄自動在工具欄編輯器中打開,其中有一個空白按鈕。

2.添加和編輯按鈕打開要編輯的工具欄,在工具欄最右側(cè)會顯示一個空白按鈕,用鼠標單擊此按鈕即可在按鈕編輯窗口中設計按鈕。當創(chuàng)建和編輯一個新的按鈕時,在工具欄右側(cè)會自動出現(xiàn)一個新的空白按鈕。要編輯修改已有的按鈕,只需要單擊選中該按鈕,即可在按鈕編輯窗口中進行編輯和修改。在工具欄上拖動并將其放在工具欄中的新位置就可以移動按鈕。在工具欄上拖動按鈕離開工具欄可以刪除按鈕。

3.按鈕屬性設置按鈕的屬性包括按鈕ID值、寬度、高度以及工具提示信息。選中要設置屬性的按鈕,然后在按鈕顯示窗口或按鈕編輯窗口的空白處雙擊或選中按鈕后按Alt+Enter快捷鍵,或者直接雙擊工具欄上相應的按鈕,可打開如圖11-14所示的工具欄按鈕屬性對話框。圖11-14工具欄按鈕屬性對話框

ID框中的下拉列表中列出了當前應用程序中已有的ID值,如果需要按鈕與某個菜單命令對應,可以在此列表中選擇相應菜單項的ID值,則此按鈕與對應的菜單命令共用同一個命令消息處理函數(shù)。如果按鈕沒有對應的菜單命令,則可以輸入一個新的ID值。按鈕圖像的缺省大小為16個像素寬、15個像素高,可以在屬性對話框中進行修改。當修改一個按鈕的大小后,工具欄上所有的按鈕會同時變化。在Prompt框中可以為按鈕添加說明和提示信息,輸入的內(nèi)容可以分為兩個部分,中間用“\n”分隔,前面部分為鼠標指向該按鈕時狀態(tài)欄上的顯示信息,后面部分為按鈕工具提示,即當鼠標停留在按鈕上時鼠標下面顯示的提示。

4.在工具欄按鈕間添加空格工具欄按鈕間的空格對應程序運行時按鈕間的垂直或水平分隔條。在按鈕間插入空格的方法如下:如果要在按鈕左側(cè)插入空格且此按鈕右側(cè)沒有空格,拖動此按鈕向右移動直到其覆蓋下一個按鈕的一半時釋放。如果要在按鈕左側(cè)插入空格且此按鈕右側(cè)已有空格,則拖動此按鈕向右移動直到其右邊界接觸到下一個按鈕的左邊界時釋放。此時,會保留按鈕右側(cè)的空格。如果拖動按鈕直到覆蓋下一個按鈕的一半時才釋放,則會刪除按鈕右側(cè)的空格。如果要刪除按鈕間的空格,則拖動空格一側(cè)的按鈕向另一側(cè)移動直到覆蓋下一個按鈕將近一半時釋放。【例11.4】為例11.3的程序MyDraw的“繪圖”菜單添加工具欄按鈕。

(1)打開應用程序項目MyDraw,單擊項目工作區(qū)窗口的“ResourceView”標簽,在窗口中展開Toolbar,雙擊下面的IDR_MAINFRAME打開工具欄編輯器。在工具欄的右側(cè)添加如圖11-15所示的三個按鈕,同時在“矩形”按鈕左側(cè)插入一個空格。圖11-15為應用程序MyDraw添加的按鈕

(2)為添加的按鈕設置屬性。雙擊“矩形”按鈕,打開屬性對話框,在ID框中選擇菜單“繪圖”→“矩形”的ID值,在Prompt欄中輸入“在視圖窗口畫一個矩形\n畫矩形”。采用相同的方法設置其它按鈕的屬性,其ID值選擇與其對應菜單項的ID值。由于添加的每個按鈕都有對應的菜單命令,因此不需要為按鈕添加命令消息處理函數(shù),當單擊這些按鈕時,其功能與執(zhí)行相應菜單命令的功能相同。編譯、鏈接和運行程序,即可以通過工具欄按鈕繪制不同的圖形。11.2.2創(chuàng)建工具欄

Windows應用程序運行時可以同時擁有多個工具欄。利用AppWizard創(chuàng)建應用程序框架時,默認設置已經(jīng)生成了一個工具欄,在應用程序中根據(jù)需要還可以創(chuàng)建新的工具欄。在MFC應用程序中創(chuàng)建工具欄的步驟如下:

(1)在應用程序的項目工作區(qū)窗口中插入一個工具欄資源,并利用工具欄編輯器添加和編輯按鈕,設置按鈕屬性。

(2)構(gòu)造一個CToolBar類的對象。

(3)調(diào)用CToolBar::Create或CreateEx函數(shù)創(chuàng)建工具欄。

CToolBar::Create函數(shù)原型為:

BOOLCreate(CWnd*pParentWnd,DWORDdwStyle=

WS_CHILD|WS_VISIBLE|CBRS_TOP,UINTnID=AFX_IDW_TOOLBAR);其中,參數(shù)“pParentWnd”為指向工具欄窗口父窗口的指針,參數(shù)“dwStyle”指明工具欄的風格。由于工具欄本身也是一個窗口,因此參數(shù)dwStyle可以指明窗口的風格,如WS_

CHILD|WS_VISIBLE指明是一個子窗口并可見。同時工具欄還有一些附加的風格,如表11-4所示。參數(shù)“nID”是工具欄子窗口ID。調(diào)用CreateEx創(chuàng)建工具欄時,除了可以指明Create中使用的工具欄風格外,還可以給工具欄指明附加的風格,如TBSTYLE_FLAT創(chuàng)建扁平的工具欄。表11-4CToolBar::Create工具欄風格工具欄風格說明CBRS_TOP工具欄放置在框架窗口的頂端CBRS_BOTTOM工具欄放置在框架窗口的底部CBRS_NOALIGN當調(diào)整工具欄父窗口大小時不調(diào)整工具欄的位置CBRS_TOOLTIPS當鼠標光標停留在工具欄按鈕上時,顯示工具提示CBRS_SIZE_FIXED工具欄的大小固定CBRS_FLOATING工具欄是浮動的CBRS_FLYBY當鼠標光標指向工具欄按鈕時,狀態(tài)欄上顯示按鈕的說明CBRS_HIDE_INPLACE工具欄不顯示給用戶除了可以在Create或CreateEx函數(shù)中指定工具欄的風格外,還可以在創(chuàng)建工具欄后調(diào)用SetBarStyle(CToolBar從CControlBar類繼承來的成員函數(shù))設置或改變工具欄的風格。例如,如果要用CBRS_BOTTOM風格取代CBRS_TOP風格,使工具欄和框架窗口的底部對齊,可以調(diào)用如下語句(w_wndToolbar為CToolBar的對象):

w_wndToolbar.Create(this,WS_CHILD|WS_VISIBLE|

CBRS_BOTTOM);也可以按如下方式創(chuàng)建工具欄:

w_wndToolbar.Create(this);

w_wndToolbar.SetBarStyle((w_wndToolbar.GetBarStyle()&~CBRS_TOP|CBRS_BOTTOM);因為工具欄是應用程序主框架窗口的子窗口,通常隨框架窗口的創(chuàng)立而創(chuàng)建,因此一般在框架窗口類中添加一個CToolBar的對象成員,并在框架窗口的OnCreate處理程序中調(diào)用Create或CreateEx。

(4)調(diào)用CToolBar::LoadToolBar裝入工具欄資源。函數(shù)原型為:

BOOLLoadToolBar(UINTnIDResource);其中,參數(shù)“nIDResource”指定被裝入的資源ID。11.2.3停靠和浮動工具欄默認情況下,CToolBar工具欄停靠在框架窗口的一側(cè),且不能移動,只能通過程序控制來移動。實際上,CToolBar允許用戶拖動工具欄移動,使它脫離原來的位置,并將其放在窗口的另一側(cè),或讓它浮動在自己的框架窗口中。為了使工具欄成為可停靠的工具欄,需要調(diào)用CToolBar::EnableDocking(從CControlBar繼承來的成員函數(shù))和CFrameWnd::EnableDocking。

CToolBar::EnableDocking函數(shù)使工具欄成為可停靠的或禁止停靠的,函數(shù)原型為:

voidEnableDocking(DWORDdwStyle);其中,參數(shù)“dwStyle”設置工具欄是否支持停靠和工具欄能夠停靠在父窗口的位置,其取值可以是表11-5所列的一個或多個的組合。如果為0(即沒有標志),則工具欄不能拖動停靠。這里指定的停靠位置必須與框架窗口允許的停靠位置相匹配。

CFrameWnd::EnableDocking函數(shù)決定工具欄停靠的位置,函數(shù)原型為:

voidEnableDocking(DWORDdwDockStyle);其中,參數(shù)“dwDockStyle”指定框架窗口的哪一側(cè)可作為工具欄的停靠位置,取值為表11-5所列的一個或多個值的組合。表11-5工具欄的停靠標志停靠標志說明CBRS_ALIGN_TOP允許停靠在框架窗口頂部CBRS_ALIGN_BOTTOM允許停靠在框架窗口底部CBRS_ALIGN_LEFT允許停靠在框架窗口左側(cè)CBRS_ALIGN_RIGHT允許停靠在框架窗口右側(cè)CBRS_ALIGN_ANY允許停靠在框架窗口任意一側(cè)

CToolBar::EnableDocking和CFrameWnd::EnableDocking都要指定停靠位置,但其含義不同,前者指明工具欄可以停靠的位置,而后者指明框架窗口允許工具欄停靠的位置。如果框架窗口包含多個工具欄,并且每個工具欄都有不同的停靠位置,則分別指定工具欄和框架窗口的停靠位置參數(shù)就顯得比較方便了。例如,如果m_wndToolBar1和m_wndToolBar2屬于同一個框架窗口,則

m_wndToolBar1.EnableDocking

(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);

m_wndToolBar2.EnableDocking

(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT);

EnableDocking(CBRS_ALIGN_ANY);將m_wndToolBar1停靠在頂部或底部,而將m_

wndToolBar2停靠在左側(cè)或右側(cè)。執(zhí)行完CToolBar::EnableDocking和CFrameWnd::EnableDocking函數(shù)后,應調(diào)用CFrameWnd::DockControlBar停靠工具欄,函數(shù)原型為:voidDockControlBar(CControlBar*pBar,UINTnDockBarID=0,LPCRECTlpRect=NULL);其中,參數(shù)“pBar”為指向被停靠的工具欄指針。參數(shù)“nDockBarID”決定框架窗口的哪一側(cè)用于停靠,可以為0或表11-6所列的一個或多個值的組合,若為0(缺省值),則工具欄可以在目標框架窗口中任意可停靠的位置停靠。參數(shù)“l(fā)pRect”以屏幕坐標表示目標框架窗口非客戶區(qū)中可以被工具欄停靠的位置。表11-6DockControlBar函數(shù)的停靠位置停靠位置說明AFX_IDW_DOCKBAR_TOP停靠到框架窗口的頂部AFX_IDW_DOCKBAR_BOTTOM停靠到框架窗口的底部AFX_IDW_DOCKBAR_LEFT停靠到框架窗口的左側(cè)AFX_IDW_DOCKBAR_RIGHT停靠到框架窗口的右側(cè)【例11.5】為應用程序MyDraw創(chuàng)建一個新的工具欄,用于執(zhí)行“顏色”菜單中的命令。

(1)在項目中添加和編輯新的工具欄資源。打開項目MyDraw,單擊項目工作區(qū)窗口的“ResourceView”標簽,插入一個新的工具欄資源,設置其資源ID為IDR_COLORS,添加和編輯如圖11-16所示的4個按鈕,并按表11-7設置按鈕的屬性。各按鈕的ID值與“顏色”菜單中各菜單項的ID值相同,因此,此工具欄上的按鈕成為菜單命令的快捷方式。圖11-16項目MyDraw添加的工具欄資源表11-7按鈕的屬性設置按鈕大小(寬,高)IDPrompt紅色16,15ID_COLOR_RED設置圖形為紅色\n紅色綠色16,15ID_COLOR_GREEN設置圖形為綠色\n綠色藍色16,15ID_COLOR_BLUE設置圖形為藍色\n藍色自定義16,15ID_COLOR_CUSTOM通過顏色對話框設置圖形顏色\n自定義

(2)在應用程序主框架窗口中創(chuàng)建、裝入和停靠工具欄。在框架窗口類CMainFrame中添加CToolBar類的數(shù)據(jù)成員:

protected://controlbarembeddedmembers CStatusBarm_wndStatusBar; CToolBarm_wndToolBar; CToolBarm_colorToolBar;

在CMainFrame::OnCreate函數(shù)中添加代碼,創(chuàng)建工具欄、裝入工具欄資源IDR_COLORS并允許工具欄停靠在窗口的任意位置。

intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)

{ //創(chuàng)建工具欄

m_colorToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER

|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC); m_colorToolBar.LoadToolBar(IDR_COLORS); //裝入工具欄資源

//工具欄可以停靠在任意位置

m_colorToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); //允許工具欄停靠在任意位置

DockControlBar(&m_colorToolBar); //停靠工具欄

return0;

}

(3)編譯、鏈接和運行程序,程序運行結(jié)果如圖11-17所示。單擊工具欄按鈕可以設置圖形顏色,可以拖動工具欄使其浮動在框架窗口內(nèi)或停靠在窗口任意一側(cè)。圖11-17添加工具欄后的運行結(jié)果11.2.4顯示和隱藏工具欄工具欄可以提高用戶操作程序的效率,但工具欄占用了框架窗口的客戶區(qū)域,因此,當不需要使用工具欄時,應該將其隱藏起來。大部分包含工具欄的Windows應用程序都設置有顯示或隱藏工具欄的命令。

MFC缺省的工具欄可以通過執(zhí)行“查看”→“工具欄”菜單命令來顯示或隱藏。在顯示或隱藏工具欄之前應該知道工具欄當前的可見狀態(tài),這可以通過調(diào)用CWnd的成員函數(shù)GetStyle查詢工具欄的所有風格。要確定工具欄的可見性,可以簡單地用風格標志W(wǎng)S_VISIBLE和GetStyle函數(shù)的執(zhí)行結(jié)果進行按位與運算,如果結(jié)果非0,則工具欄當前是可見的。應用程序中一般通過菜單命令或快捷鍵來顯示或隱藏工具欄,因此,可以通過編寫菜單命令的命令消息處理函數(shù),在其中調(diào)用CFrameWnd::ShowControlBar來隱藏或顯示工具欄。其函數(shù)原型為:

voidShowControlBar(CControlBar*pBar,BOOLbShow,BOOLbDelay);其中,參數(shù)“pBar”為指向要顯示或隱藏的工具欄的指針;參數(shù)“bShow”指定是顯示還是隱藏工具欄,若為TRUE則顯示工具欄,為FALSE則隱藏工具欄;參數(shù)“bDelay”為TRUE時則延遲顯示工具欄,為FALSE時則立即顯示。一般不要通過簡單地打開或關閉工具欄的WS_VISIBLE標志切換工具欄。工具欄被顯示或隱藏時,MFC會調(diào)整視圖窗口的大小以適應框架窗口客戶區(qū)中可見區(qū)域的變化。ShowControlBar在顯示或隱藏工具欄時已經(jīng)考慮了這些因素。【例11.6】在MyDraw中添加菜單命令來顯示或隱藏顏色設置工具欄。

(1)添加菜單項。打開項目MyDraw,單擊項目工作區(qū)窗口的“ResourceView”標簽,雙擊菜單資源IDR_MAINFRAME,在“查看”菜單下添加“顏色工具欄”菜單項,設置其ID為ID_VIEW_COLORBAR。

(2)利用ClassWizard為菜單命令“顏色工具欄”在框架窗口類中添加命令消息處理函數(shù)和用戶界面更新命令消息UPDATE_COMMAND_UI的處理函數(shù),并添加代碼:

voidCMainFrame::OnViewColorbar()

{ ShowControlBar(&m_colorToolBar,(m_colorToolBar.GetStyle()& WS_VISIBLE)==0,FALSE);

}

voidCMainFrame::OnUpdateViewColorbar(CCmdUI*pCmdUI)

{ //設置檢查標志

pCmdUI->SetCheck((m_colorToolBar.GetStyle()

&WS_VISIBLE)?1:0);

}

(3)編譯、鏈接和運行程序,測試“顏色工具欄”命令。11.2.5給按鈕添加文字在默認情況下,工具欄按鈕只包含圖像,不包含文字。可以通過以下步驟給按鈕表面添加文字:

(1)利用工具欄編輯器調(diào)整按鈕圖像的大小,使其適合添加文本的長度。

(2)調(diào)用CToolBar::SetButtonText給按鈕添加字符串。函數(shù)原型為:

BOOLSetButtonText(intnIndex,LPCTSTRlpszText);其中,參數(shù)“nIndex”指定了設置文本的按鈕的索引,其中0代表工具欄最左端位置上的按鈕,工具欄上的分隔條也占用一個對應的索引。參數(shù)“l(fā)pszText”指定設置給按鈕的文本字符串。

(3)調(diào)用CToolBar::SetSizes調(diào)整按鈕尺寸。例如,給例11.5創(chuàng)建的顏色設置工具欄上的按鈕添加文本。首先利用工具欄編輯器調(diào)整按鈕位圖的大小為40個像素寬、19個像素高,然后在CMainFrame::OnCreate函數(shù)的語句m_colorToolBar.LoadToolBar(IDR_COLORS);后添加如下代碼:

m_colorToolBar.SetButtonText(0,"紅色"); m_colorToolBar.SetButtonText(1,"綠色"); m_colorToolBar.SetButtonText(2,"藍色"); m_colorToolBar.SetButtonText(3,"自定義"); m_colorToolBar.SetSizes(CSize(48,42),CSize(40,19));生成的工具欄如圖11-18所示。圖11-18帶文字的工具欄按鈕11.2.6在工具欄中添加非按鈕控件工具欄上最常見的是按鈕,但工具欄上除了按鈕外,還可以添加非按鈕控件。例如,在工具欄上常見到組合框,用于設置字體、字號等。要在工具欄上添加非按鈕控件,一般需按以下步驟進行:

(1)利用工具欄編輯器在工具欄上添加一個分隔條或其它按鈕。該按鈕可具有任意ID和按鈕圖像,此位置將作為非按鈕控件的預留位置。

(2)調(diào)用CToolBar::SetButtonInfo調(diào)整預留位置分隔條或其它按鈕的寬度。函數(shù)SetButtonInfo用于設置按鈕的命令ID、風格和圖像號。函數(shù)原型為:

voidSetButtonInfo(intnIndex,UINTnID,UINTnStyle,intiImage);其中,參數(shù)“nIndex”為要設置信息的按鈕或分隔條的索引;參數(shù)“nID”為給按鈕設置的ID值;參數(shù)“nStyle”指明設置按鈕的新風格,可以為以下值:

·TBBS_BUTTON:標準下壓式按鈕(缺省設置)。

·TBBS_SEPARATOR:分隔條。

·TBBS_CHECKBOX:自動復選按鈕。

·TBBS_GROUP:標記一個按鈕組的開始。

·TBBS_CHECKGROUP:標記一個復選按鈕組的開始。參數(shù)“iImage”為按鈕的圖像在位圖中的新索引。對于具有TBBS_SEPARATOR風格的分隔條,此參數(shù)用于設置分隔條的像素寬度。

(3)調(diào)用控件類的Create函數(shù)在工具欄窗口的預留位置創(chuàng)建控件。

(4)為創(chuàng)建的控件添加消息處理函數(shù)。為了給非按鈕控件添加工具提示,可以在字符串表中為其添加一個字符串資源,則當光標停留在非按鈕控件上時會自動出現(xiàn)工具提示。【例11.7】工具欄使用示例。在工具欄上添加一個組合框,用于設置視圖窗口中文本顯示的字體。程序?qū)崿F(xiàn)過程如下:

(1)利用AppWizard創(chuàng)建SDI應用程序框架,項目名設置為ToolBarSample。

(2)利用工具欄編輯器編輯工具欄。單擊項目工作區(qū)窗口的“ResourceView”標簽,雙擊Toolbar下的IDR_

MAINFRAME工具欄資源打開工具欄,首先刪除“打印”和“關于”兩個按鈕,然后添加如圖11-19所示的4個按鈕,并按表11-8所示設置各按鈕的屬性。圖11-19添加的按鈕表11-8按鈕屬性設置按鈕IDPrompt加粗ID_BOLD\n加粗傾斜ID_ITALIC\n傾斜下劃線ID_UNDERLINE\n下劃線預留位置缺省

(3)在視圖類CToolBarSampleView的頭文件中增加如下描述文本屬性的數(shù)據(jù)成員:

protected: BOOLm_bItalic; //是否傾斜

BOOLm_bUnderline; //是否加下劃線

BOOLm_bBold; //是否加粗

CStringm_strFont; //字體名然后在視圖類CToolBarSampleView的構(gòu)造函數(shù)中初始化新增的數(shù)據(jù)成員:

CToolBarSampleView::CToolBarSampleView()

{ m_bBold=FALSE; //缺省不加粗

m_bItalic=FALSE; //缺省不傾斜

m_bUnderline=FALSE; //缺省不加下劃線

m_strFont="宋體"; //缺省字體為宋體}

(4)編輯視圖類CToolBarSampleView的OnDraw成員函數(shù),創(chuàng)建字體并選入設備環(huán)境,在視圖窗口的中心顯示文本:

voidCToolBarSampleView::OnDraw(CDC*pDC)

{ intnWeight; if(m_bBold) nWeight=FW_BOLD; else nWeight=FW_NORMAL; CFont*pOldFont,font; font.CreateFont(48,0,0,0,nWeight,m_bItalic,m_bUnderline,0, DEFAULT_CHARSET,OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE,m_strFont); pOldFont=pDC->SelectObject(&font); CRectrect; GetClientRect(&rect); pDC->DrawText("工具欄使用示例",&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); pDC->SelectObject(pOldFont);

}

(5)利用ClassWizard為工具欄按鈕添加命令消息處理函數(shù)和用戶界面更新命令處理函數(shù):

voidCToolBarSampleView::OnBold()

{ m_bBold=!m_bBold;

//單擊“加粗”按鈕,將文本加粗屬性取反

Invalidate(); //更新視圖窗口

}

voidCToolBarSampleView::OnUpdateBold(CCmdUI*pCmdUI)

{ pCmdUI->SetCheck(m_bBold); //更新按鈕狀態(tài)

}

voidCToolBarSampleView::OnItalic()

{ m_bItalic=!m_bItalic; Invalidate();

}

voidCToolBarSampleView::OnUpdateItalic(CCmdUI*pCmdUI)

{ pCmdUI->SetCheck(m_bItalic);

}

voidCToolBarSampleView::OnUnderline()

{ m_bUnderline=!m_bUnderline; Invalidate();

}

voidCToolBarSampleView::OnUpdateUnderline

(CCmdUI*pCmdUI)

{ pCmdUI->SetCheck(m_bUnderline);

}

(6)在工具欄上的預留位置處添加組合框。首先在主框架窗口類CMainFrame的頭文件中增加CComboBox類的對象成員:

public: CComboBoxm_wndComboBox;然后要為增加的組合框定義一個ID值,方法是執(zhí)行“View”→“ResourceSymbols…”菜單命令,在彈出的對話框中單擊“New…”按鈕,添加名稱為“IDC_COMBOBOX”的ID標識,其值取缺省值。編輯CMainFrame類的OnCreate函數(shù),在其中增加創(chuàng)建組合框控件的代碼:

intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)

{ DockControlBar(&m_wndToolBar); //將預留位置的按鈕設置為分隔條,設置其寬度為100個像素寬,ID值任意

m_wndToolBar.SetButtonInfo(11,111,TBBS_SEPARATOR,100); CRectrect; m_wndToolBar.GetItemRect(11,&rect);

//獲取預留位置的矩形區(qū)域

rect.bottom+=100;

//增加矩形高度以便容納組合框的列表

//創(chuàng)建組合框 m_wndComboBox.Create(CBS_DROPDOWNLIST|WS_VISIBLE|CBS_AUTOHSCROLL,rect,

&m_wndToolBar,IDC_COMBOBOX); m_wndComboBox.AddString("宋體");

//初始化組合框

m_wndComboBox.AddString("黑體"); m_wndComboBox.AddS

溫馨提示

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

評論

0/150

提交評論