实验1 含有工具栏对话框的设计

1 创建基于对话框的工程;

2 创建工具栏资源;(可手绘,并更改ID);

3.创建工具栏:

3.1 为Dialog51类添加成员变量m_ToolBar(类视图CXXXDlg双击),类型为CToolBar。CToolBar类为Visual C++ 6.0的自带类。

CToolBar m_ToolBar;

3.2 在OnInitDialog()函数中添加如下代码。

//创建工具栏m_ToolBar

m_ToolBar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_BORDER_BOTTOM);//装入工具栏图标
m_ToolBar.LoadToolBar(IDR_TOOLBAR1);//设置工具栏的大小和位置
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

2

1、添加工具栏资源ID为IDR_TOOLBAR

2、在对话框的类定义(类视图CXXXDlg双击)中加:

CToolBar m_ToolBar;

3、在OnInitDialog中或其它合适的消息响应中加如下代码:(函数可查看MSDN)

m_ToolBar.Create(this); //创建工具栏

m_ToolBar.LoadToolBar(IDR_TOOLBAR);//加载工具栏

//得出控件条大小.

CRect rect;

CRect rectNow;

GetClientRect(rect);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rectNow);

//放置控件条位置

CPoint ptOffset(rectNow.left-rect.left,rectNow.top-rect.top);

CRectrcChild;

CWnd* pwndChild=GetWindow(GW_CHILD);

while (pwndChild)

{

pwndChild->GetWindowRect(rcChild);

ScreenToClient(rcChild);

rcChild.OffsetRect(ptOffset);

pwndChild->MoveWindow(rcChild,FALSE);

pwndChild=pwndChild->GetNextWindow();

}

//调整对话框尺寸

CRect rcWindow;

GetWindowRect(rcWindow);

rcWindow.right+=rect.Width()-rectNow.Width();

rcWindow.bottom+=rect.Height()-rectNow.Height();

MoveWindow(rcWindow, FALSE);

//控件条定位

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

//对框居中

CenterWindow();

4、手工添加处理函数

afx_msg void OnBtnXXX();//消息响应函数声明

ON_COMMAND(ID_BTN_XXX/*工具按钮ID*/,OnBtnXXX/*函数名*/)//消息映射

void CXXXDlg::OnBtnXXX(){}//消息处理函数

基于对话框程序,自定义工具栏(支持真彩色图标,可添加文字)

动机:传统的VC工具栏只支持16色的图标,且不能添加文字。

要点:CToolBarCtrl类的使用。先引用MSDN上的话(翻译水平比较菜,见谅!)

使用CToolBarCtrl类,一般遵从以下几个步骤:

1.构造一个CToolBarCtrl对象。

2.调用Create函数创建Windows工具条通用控件并与CToolBarCtrl对象相关联。

3.确定工具条上的按钮如何显示:

(1)使用位图图像。调用AddBitmap向工具条添加按钮位图

(2)使用图像列表里面显示的图像。调用SetImageList函数、SetHotImageList函数、SetDisabledImageList函数指定图像列表

(3)作用字符串标签。调用AddString和(或)AddStrings函数为工具栏添加字符串

4.调用AddButtons函数为工具条添加按钮结构

5.如果需要为不是CFrameWnd的拥有窗口添加工具提示,需要在工具条拥有窗口中传递TTN_NEEDTEXT消息,该消息在CToolBarCtrl: Handling Tool Tip Notifications中有所描述。

步骤:1.将要作为工具栏图标的位图或图标导入到VC资源管理器中。

2.在C***Dlg类为添加两个成员变量:CImageList m_ImageList,CToolBarCtrl m_ToolBar

3.在OnInitDialog()函数中添加如下代码:

CBitmap bm;

UINT Resource[3]={IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3};//位图ID数组

int i;

m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,0,0);//创建Image List

m_ToolBar.Create(TBSTYLE_FLAT | CCS_TOP | WS_CHILD | WS_VISIBLE | WS_BORDER | CCS_ADJUSTABLE,CRect(0,0,0,0),this,IDR_TOOLBAR);//创建Toolbar Control

m_ToolBar.SetBitmapSize(CSize(32,32));

for(i=0;i<3;i++)

{

bm.LoadBitmap(Resource[i]);

m_ImageList.Add(&bm,(CBitmap *)NULL);

bm.Detach();

}

m_ToolBar.SetImageList(&m_ImageList);

TBBUTTON Buttons[3];//定义TBBUTTON结构体数组

CString str;

for(i=0;i<3;i++)

{

str.LoadString(IDS_FILE+i);//IDS_FILE是在String Table中添加的String

Buttons[i].iString=m_ToolBar.AddStrings(str);

Buttons[i].dwData=0;

Buttons[i].fsState=TBSTATE_ENABLED;

Buttons[i].fsStyle=TBSTYLE_BUTTON;

Buttons[i].iBitmap=i;

Buttons[i].idCommand=IDS_FILE+i; //按钮命令响应

}

m_ToolBar.AddButtons(3,Buttons);

m_ToolBar.AutoSize();

m_ToolBar.ShowWindow(SW_SHOW);

注解:TBBUTTON是定义工具条按钮的结构体,声明如下:

typedef struct _TBBUTTON {

int iBitmap;// zero-based index of button image

int idCommand;// command to be sent when button pressed

BYTE fsState; // button state--see below

BYTE fsStyle; // button style--see below

DWORD dwData; // application-defined value

int iString;// zero-based index of button label string

} TBBUTTON;

调用AddButtons函数向工具栏添加按钮。函数原型如下:

BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );

其中nNumButtons是要添加的按钮数目,lpButtons是指向TBBUTTON结构体的指针。

向对话框类中添加工具栏

在文档/视图结构中,添加工具栏是非常方便的,但在基于对话框的应用程序中,就稍稍复杂一点了。通常情况下,向对话框中添加工具栏有两种方法。

第一种方法:

特点:  ① 使用CToolBar类,可以装载工具栏资源。

② 代码编写简单方便。

缺点:

只支持16位图标。

步骤:

(1)通过AppWizard新建一个基于对话框的项目Main。

(2)在对话框资源中单击鼠标右键,在弹出的快捷菜单上选择“Properties”菜单项,打开“Dialog Properties”对话框。

(3)在“Dialog Properties”对话框中将“Caption”文本框的内容改为“在对话框中添加工具栏(16位图标)”。

(4)通过工具栏设计器创建一个工具栏资源ID_TOOLBAR1,并画好各工具按钮,如图1所示。

(5)在对话框类CMain中添加一个成员变量CToolBar m_ToolBar。

(6)在对话框的OnInitDialog()成员函数中添入以下代码:

BOOL CDMain::OnInitDialog() {

CDialog::OnInitDialog();

if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_ToolBar.LoadToolBar(IDR_TOOLBAR))

{

TRACE0("Failed to create toolbar\n"); return -1;      // fail to create

}

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

m_ToolBar.ShowWindow(SW_SHOW);

// http://www.isstudy.com return true;

}

第二种方法:

特点:

① 使用CToolBarCtrl类,必须与CImageList类联合使用。

② 可以支持真彩色(32位)图标。

缺点:

代码编写较为复杂。

步骤:

(1)通过AppWizard新建一个基于对话框的项目Main。

(2)在对话框资源中单击鼠标右键,在弹出的快捷菜单上选择“Properties”菜单项,打开Dialog Properties对话框。

(3)在“Dialog Properties”对话框中将“Caption”文本框的内容改为“在对话框中添加工具栏(32位图标)”。

(4)在对话框类CMyDlg中添加两个成员变量CToolBarCtrl m_ToolBar和CImageList m_ImageList。

(5)添加若干需要在工具栏上显示的图标资源。

6)在对话框的OnInitDialog()成员函数中添入以下代码:

BOOL CDMain::OnInitDialog()

{

CDialog::OnInitDialog();

const int ARRAY_MAX=5;

//建立ImageList对象及ToolBar对象

m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);

//创建一个图像列表框

m_ToolBar.EnableAutomation();

m_ToolBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID_TOOLBAR);

//向ImageList对象中添加资源图标

UINT

Resource[ARRAY_MAX]={IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4,IDI_ICON5};

int i;

TBBUTTON button[ARRAY_MAX];

for(i=0;i< ARRAY_MAX;i++)

{

//向图像列表框中添加图片

m_ToolBar.SetImageList(&m_ImageList);

for(i=0;i< ARRAY_MAX;i++)    //设置每个按钮属性

{

button[i].dwData=0;

button[i].fsState=TBSTATE_ENABLED;

button[i].fsStyle=TBSTYLE_BUTTON  button[i].iBitmap=i;

}

m_ToolBar.AddButtons(ARRAY_MAX,button);

TBBUTTON Wrap;

//创建一个分隔条 Wrap.dwData=0;

Wrap.fsState=TBSTATE_ENABLED;

Wrap.fsStyle=TBSTYLE_SEP;

m_ToolBar.InsertButton(3,&Wrap);

m_ToolBar.AutoSize();

m_ToolBar.SetStyle(TBSTYLE_FLAT|CCS_TOP);

return true;

}