|
工具条在基于对话框的项目中和多文档项目中是不同的.在基于对话框添的项目中加一个工具条,远没有在文档视图里面加工具条方便。
先看一下效果图:
先来说一下多文档的项目:
1.首先添加资源文件:
(1)工具栏资源的最右边总是会有一个待编辑的按钮,我们对其进行编辑后,工具栏资源会自动增加一个新的空白按钮,这也实现了按钮的添加操作。如果我们想要删除某个按钮,就可以用鼠标左键点住它,拖出工具栏资源的范围即可。
(2)第三个按钮(保存按钮)和第四个按钮(剪切按钮)之间有一些间隙,在运行程序后会出现一个竖的分隔线,所以想要在两个按钮之间添加分隔线的话,可以用鼠标左键拖住右边的按钮往右稍移动一些就可以了。
(3)如果想用现成的bmp文件,先把按钮数量添加够,然后选中IDR_TOOLBAR右键属性Filename字段写好路径,也可以在这修改ID名称.
2.在对话框的.h里添加
protected:
CToolBar m_toolbar; //工具栏
XXXdlg.cpp的OnInitDialog()加载工具栏
//创建工具栏
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);//加载工具栏资源
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
CToolBar ::Create的定义形式为:
virtual BOOL Create(CWnd* pParentWnd,DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,UINT nID = AFX_IDW_TOOLBAR);
第一个参数:pParentWnd:指向工具条父窗口的指针。
第二个参数:dwStyle :工具条的风格。
CBRS_TOP 表示工具条在框架窗口的顶部
CBRS_BOTTOM 表示工具条在框架窗口的底部
CBRS_NOALIGN 表示工具条在父窗口改变大小时不响应
CBRS_TOOLTIPS 表示工具条具有动态提示功能
CBRS_SIZE_DYNAMIC 表示工具条是静态的不能改变
CBRS_SIZE_FIXED 表示工具条是动态的可以改变
CBRS_FLOATING 表示工具条是浮动的
CBRS_FLYBY 表示状态条上显示工具条中按钮的信息
CBRS_HIDE_INPLACE 表示工具条隐藏
第三个参数:nID :工具条子窗口的标识符。
CToolBar ::CreateEx的定义形式为:
virtual BOOL CreateEx(CWnd* pParentWnd,DWORD dwCtrlStyle = TBSTYLE_FLAT,DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR);
第一个参数:pParentWnd:
第二个参数:dwCtrlStyle :
第三个参数:dwStyle :
第四个参数:rcBorders :
第五个参数:nID :
CToolBar ::LoadToolBar的定义形式为:
BOOL LoadToolBar(UINT nIDResource );
参数:nIDResource :要加载的工具栏的资源ID
接下来是基于对话框项目:
(1)添加资源文件:
(2)在XXXdlg.cpp的OnInitDialog()加载工具栏
//创建工具栏
HWND hDlg=GetSafeHwnd();//对话框的窗口句柄
HINSTANCE hInstance=AfxGetInstanceHandle();//当前应用程序的实例句柄
//填充工具条按钮结构:
TBBUTTON ptoolbar[30]={{STD_FILENEW, //指定Windows的标准帮助图标
IDR_TOOLBAR, //工具条按钮的ID
TBSTATE_ENABLED, //可用状态
TBSTYLE_BUTTON, //指定创建一个可以下按的按钮
0, //保留,由应用程序定义该参数意义
0}, //按钮字串索引
{STD_FILEOPEN, IDR_TOOLBAR, TBSTATE_ENABLED, TBSTYLE_BUTTON,0, 0},
{STD_FILESAVE, IDR_TOOLBAR, TBSTATE_ENABLED, TBSTYLE_BUTTON,0, 0},
//创建一个分割按钮用的竖线
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
{STD_CUT, IDR_TOOLBAR, TBSTATE_ENABLED, TBSTYLE_BUTTON,0, 0},
{STD_COPY, IDR_TOOLBAR, TBSTATE_ENABLED, TBSTYLE_BUTTON,0, 0},
{STD_PASTE, IDR_TOOLBAR, TBSTATE_ENABLED, TBSTYLE_BUTTON,0, 0},
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
{STD_PRINT, IDR_TOOLBAR, TBSTATE_ENABLED, TBSTYLE_BUTTON,0, 0},
{STD_HELP, IDR_TOOLBAR, TBSTATE_ENABLED, TBSTYLE_BUTTON,0, 0},
};
//在对话框上动态创建工具条,并添加工具条按钮:
HWND hToolsWindow=::CreateToolbarEx(hDlg, //指定对话框为父窗口,将工具条创建在对话框上
WS_CHILD|WS_VISIBLE|TBSTYLE_WRAPABLE|TBSTYLE_TOOLTIPS|
TBSTYLE_FLAT|CCS_ADJUSTABLE,//指定工具条的创建风格
IDR_TOOLBAR,//预定义的工具条资源ID
30,HINST_COMMCTRL, //包含图片资源的可执行文件的实例句柄
IDB_STD_SMALL_COLOR,//图片的资源ID
ptoolbar, //待添加的按钮
10, //加入到工具条的按钮的个数
0,0,0,0,sizeof(TBBUTTON));
//从IDR_TOOLBAR资源中装载按钮图标到对话框的工具条上
TBADDBITMAP tab;
tab.hInst=hInstance;
tab.nID=IDR_TOOLBAR;
::SendMessage(hToolsWindow,TB_ADDBITMAP,(WPARAM)3,(LPARAM)&tab);
TBBUTTON:关联图像和/或字符串与按钮的位置,风格,主题和命令ID.
TBBUTTON定义形式为:
typedef struct _TBBUTTON {
int iBitmap;
int idCommand;
BYTE fsState;
BYTE fsStyle;
DWORD_PTR dwData;
INT_PTR iString;
} TBBUTTON, NEAR* PTBBUTTON, *LPTBBUTTON;
typedef const TBBUTTON *LPCTBBUTTON;
第一个参数:iBitmap:从0开始记数的按钮图象的索引;如果是Windows标准的一些工具条按钮,CommCtrl.h头文件中有详细定义.STD_CUT,STD_COPY,STD_PASTE,STD_UNDO,STD_REDOW
第二个参数:idCommand:工具条的资源id;
第三个参数:fsState:按钮的状态标志.TBSTATE_CHECKED、TBSTATE_ELLIPSES、TBSTATE_ENABLED、TBSTATE_HIDDEN、TBSTATE_INDETERMINATE、TBSTATE_MARKED、TBSTATE_PRESSED、TBSTATE_WRAP。
第四个参数:fsStyle:按钮的风格;
第五个参数:dwData:应用程序定义的值,通常为0;
第六个参数:iString:从0开始技术的按钮字串的索引.
遇到问题:
原因:在基于对话框的项目中用多文档的方法创建工具条 |
|