类CToolBar的对象是带有一行位图按钮和可选分隔线的控件条。这些按钮可以像普通按钮、核选按钮或单选按钮那样动作。
Visual C++提供了两种创建一个工具条的方法。要使用资源编辑器(ResourceEditor)创建一个工具条,应遵循下面的步骤:
1. 创建一个工具条资源。
2. 构造CToolBar对象。
3. 调用Create(或CreateEx)函数来创建Windows工具条并将它与该CToolBar对象连接。
4. 调用LoadToolBar来装入工具条资源。
另外,也可以依据下面的步骤:
1. 构造CToolBar对象。
2. 调用Create(或CreateEx)函数来创建Windows工具条并将它与CToolBar对象连接。
3. 调用LoadBitmap来装入包含工具条按钮图像的位图。
4. 调用SetButtons来设置按钮风格并使每一个按钮与位图中的一幅图像关联。
此工具条中的所有按钮图像都位于同一个位图,该位图必须为每一个按钮包含一个图像。所有的图像都必须是同样大小的。缺省的尺寸是16个像素宽和15个像素高。这些图像必须一幅接一幅的放在位图中。
SetButtons函数以指向一个控制ID数组的指针和一个指定数组中元素数目的整数作为参数。该函数将每个按钮的ID值设置为对应的数组元素的值,并赋予每个按钮一个图像索引值,每个索引值指定对应按钮图像在位图中的位置。如果某一数组元素的值为ID_SEPARATOR,则不为其赋图像索引值。
按钮图像在位图中的次序通常就是图像在屏幕上的绘制次序,但你也可以使用SetButtonInfo函数来修改图像次序和绘制次序的关系。
一个工具条中的所有按钮都具有相同的尺寸。按照“Windows界面软件设计指南”中所说,缺省尺寸为24×22个像素。图像和按钮之间的任何空白尺寸都可用来在图像周围形成一个边界。
每个按钮具有一幅图像。按钮的各种状态和风格(被压住,弹起,按下,无效,无效按下,以及不定)都可以由这幅图像产生。虽然位图可以是任何颜色,但是使用灰色加黑色文字及阴影可实现最好的效果。
要分配显示在一个按钮上的文本,可以调用GetButtonText来获取要显示在该按钮上的文本,然后调用SetButtonText来设置这些文本。
CToolBar类成员
构造
创建一个CtoolBar对象 | |
创建Windows工具条并将它与该CToolBar连接 | |
为嵌入的CtoolBarCtrl对象创建一个具有附加风格的CToolBar对象 | |
设置按钮及其位图的尺寸 | |
设置工具条的高度 | |
装入一个用资源编辑器创建的工具条资源 | |
装入包含位图-按钮图像的位图 | |
设置一个位图中的图像 | |
设置按钮风格和按钮图像在位图中的索引 |
属性
返回具有给定的命令ID的按钮的索引 | |
返回具有给定索引值的按钮或分隔线的命令ID | |
获取具有给定索引值的项的显示矩形 | |
获取一个按钮的风格 | |
设置一个按钮的风格 | |
获取一个按钮的ID,风格和图像号 | |
设置一个按钮的ID,风格和图像号 | |
获取要显示在一个按钮上的文本 | |
设置要显示在一个按钮上的文本 | |
允许直接访问基本的通用控件 |
CImageList::Create
BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );
BOOL Create( LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREFcrMask );
BOOL Create( CImageList& ImageList1, int nImage1, CImageList&ImageList2, int nImage2, int dx, int dy );
返回值:如果成功,则返回非零值,否则为0。
参数:
cx | 每个图象的尺寸,以像素为单位。 | ||||||||||||||||||
cy | 每个图象的尺寸,以像素为单位。 | ||||||||||||||||||
nFlags | 确定创建的图象列表类型。此参数可能为以下值的组合,但只能有一个ILC_COLOR值。
| ||||||||||||||||||
nInitial | 图象列表最初包含的图象数。 | ||||||||||||||||||
nGrow | 当系统需要改变列表为新图象准备空间时,图象列表可生成的图象数。此参数替代改变的图象列表所能包含的新图象数。 | ||||||||||||||||||
nBitmapID | 与图象列表联系的位图的源ID。 | ||||||||||||||||||
crMask | 用于生成一个掩码的颜色。此指定的位图中的颜色的每个像素变为黑色,掩码中相应位设置为1。 | ||||||||||||||||||
lpszBitmapID | 包含图象的源ID的字符串。 | ||||||||||||||||||
ImageList1 | CImageList对象的参考。 | ||||||||||||||||||
nImage1 | 第一个存在的图象的索引。 | ||||||||||||||||||
ImageList2 | CImageList对象的参考。 | ||||||||||||||||||
nImage2 | 第二个存在的图象的索引。 | ||||||||||||||||||
dx | 每个图象的尺寸,用像素表示。 | ||||||||||||||||||
dy | 每个图象的尺寸,用像素表示。 |
说明:
需要两步构造一个CImageList。首先调用构造函数,然后调用Create,创建图象列表并附加给CImageList对象。
CImageList::Add
int Add( CBitmap* pbmImage, CBitmap* pbmMask );
int Add( CBitmap* pbmImage, COLORREF crMask );
int Add( HICON hIcon );
返回值:
如果成功,则为第一个新图象的基于零的索引,否则为-1。
参数:
pbmImage | 指向包含一个或多个图象的位图的指针。图象数由位图宽推断。 |
pbmMask | 指向包含掩码的位图的指针。如果无掩码与图象列表一起使用,则此参数被忽略。 |
crMask | 生成掩码的颜色。指定位图中的此颜色的每个像素被改为黑色,掩码中的相应位数被设置为1。 |
hIcon | 包含新图象的位图和掩码的图标的句柄。 |
说明:
调用此函数来添加一个或多个图象或图标到图象列表中。
CImageList::Detach
HIMAGELIST Detach( );
返回值:一个图象列表对象的句柄。
说明:
调用此函数把一个图象列表与一个CImageList对象分离。此函数返回图象列表对象的句柄。
NMHDR structure
Containsinformation about a notification message.
Syntax
C++
typedef struct tagNMHDR {
HWND hwndFrom;
UINT_PTR idFrom;
UINT code;
} NMHDR;
Members
hwndFrom
Type: HWND
A window handle to the controlsending the message.
idFrom
Type: UINT_PTR
An identifier of the control sendingthe message.
code
Type: UINT
A notification code. This member canbe one of the common notification codes (see Notifications under General Control Reference), or it can be acontrol-specific notification code.
TOOLTIPTEXT 结构
Visual Studio .NET 2003
此主题尚未评级 - 评价此主题
当编写工具提示通知处理程序时,需要使用 TOOLTIPTEXT 结构。TOOLTIPTEXT 结构的成员有:
typedef struct {
NMHDR hdr; // required for all WM_NOTIFY messages
LPTSTR lpszText; // see below
WCHAR szText[80]; // bufferfor tool tip text
HINSTANCE hinst; // see below
UINT uflags; // flag indicating how to interpret the
// idFrom member ofthe NMHDR structure
// that is includedin the structure
} TOOLTIPTEXT, FAR *LPTOOLTIPTEXT;
hdr
标识需要文本的工具。您在该结构中可能需要的唯一成员是控件的命令 ID。控件的命令 ID 将在 NMHDR 结构的 idFrom 成员中,通过hdr.idFrom 语法访问。有关 NMHDR 结构成员的讨论,请参见 NMHDR。
lpszText
接收工具文本的字符串地址。
szText
接收工具提示文本的缓冲区。应用程序可将文本复制到该缓冲区,以此代替指定字符串地址。
hinst
包含将用作工具提示文本的字符串资源的实例句柄。如果 lpszText 是工具提示文本的地址,则该成员为 NULL。
当处理 TTN_NEEDTEXT 通知消息时,指定将以下列几种方式之一显示的字符串:
- 将文本复制到 szText 成员指定的缓冲区。
- 将包含文本的缓冲区的地址复制到 lpszText 成员。
- 将字符串资源的标识符复制到 lpszText 成员,并将包含资源的实例句柄复制到 hinst 成员。
RepositionBars()函数--显示工具栏、状态栏。
函数原型为:
RepositionBars(UINT nIDFirst,UINT nIDLast,UINT nIDLeftOver,UINTnFlag = CWnd::reposDefault,LPRECT lpRectParam = NULL,LPCRECT lpRectClient =NULL,BOOL bStretch = TRUE)
nIDFirst //要重新定位并改变大小的控制条范围中的第一个控制条的ID
nIDLast //要重新定位并改变大小的控制条范围中的最后一个控制条的ID
nIDLeftOver //指定了填充客户区其余部分的ID
nFlag //布局客户区域的标记
lpRectParam //指向一个RECT结构,其用法依赖于nFlag的取值
lpRectClient //指向一个RECT结构,其中包含了可用的客户区,如果为NULL,则窗口的客户区将被使用
例子:RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
注:第一二参数在微软的MSDN上并没有说明到
BOOL C**Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//创建工具拦窗口
if (!toolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP))
{
return FALSE;
}
//创建图像列表并添加图标到图像列表
imageList.Create(32, 32, ILC_COLOR24 | ILC_MASK, 1, 1);
imageList.Add(AfxGetApp()->LoadIcon(IDI_ICONSTART));
imageList.Add(AfxGetApp()->LoadIcon(IDI_ICONPAUSE));
imageList.Add(AfxGetApp()->LoadIcon(IDI_ICONSTOP));
imageList.Add(AfxGetApp()->LoadIcon(IDI_ICONCUT));
imageList.Add(AfxGetApp()->LoadIcon(IDI_ICONCOALITION));
imageList.Add(AfxGetApp()->LoadIcon(IDI_ICONTIME));
imageList.Add(AfxGetApp()->LoadIcon(IDI_ICONGRASP));
imageList.Add(AfxGetApp()->LoadIcon(IDI_ICONEXIT));
toolBar.GetToolBarCtrl().SetImageList(&imageList);
//toolBar.GetToolBarCtrl().SetHotImageList(&imageList);
//关联图像列表,设置按钮风格和按钮图像在位图中的索引
toolBar.SetButtons(NULL, 9);
toolBar.SetButtonInfo(0, ID_START, TBSTYLE_BUTTON, 0);
toolBar.SetButtonInfo(1, ID_PAUSE, TBSTYLE_BUTTON, 1);
toolBar.SetButtonInfo(2, ID_STOP, TBSTYLE_BUTTON, 2);
toolBar.SetButtonInfo(3, ID_SEPARATOR, TBBS_SEPARATOR, 0);
toolBar.SetButtonInfo(4, ID_CUT, TBSTYLE_BUTTON, 3);
toolBar.SetButtonInfo(5, ID_COALITION, TBSTYLE_BUTTON, 4);
toolBar.SetButtonInfo(6, ID_TIME, TBSTYLE_BUTTON, 5);
toolBar.SetButtonInfo(7, ID_GRASP, TBSTYLE_BUTTON, 6);
toolBar.SetButtonInfo(8, ID_EXIT, TBSTYLE_BUTTON, 7);
//设置要在按钮上显示的文本
toolBar.SetButtonText(0, "开始");
toolBar.SetButtonText(1, "暂停/继续");
toolBar.SetButtonText(2, "停止");
toolBar.SetButtonText(4, "视频截取");
toolBar.SetButtonText(5, "视频合成");
toolBar.SetButtonText(6, "录像时间");
toolBar.SetButtonText(7, "屏幕抓图");
toolBar.SetButtonText(8, "退出");
toolBar.SetSizes(CSize(40, 40), CSize(32, 32));
toolBar.GetToolBarCtrl().EnableButton(ID_PAUSE, FALSE);
toolBar.GetToolBarCtrl().EnableButton(ID_STOP, FALSE);
//激活提示功能
toolBar.EnableToolTips(TRUE);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
return TRUE; // return TRUE unless you set the focus to a control
}
1.在对话框的消息映射部分添加TTN_NEEDTEXT消息的映射宏
ON_NOTIFY_EX(TTN_NEEDTEXT, 0,OnToolTipNotify)
2.添加消息处理函数OnToolTipNotify声明
afx_msg BOOL OnToolTipNotify(UINT id, NMHDR*pNMHDR, LRESULT *pResult);
3.消息处理函数OnToolTipNotify定义
BOOLCKinescopeRecordDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
TOOLTIPTEXT*pTTT = (TOOLTIPTEXT *)pNMHDR;
UINTuiID = pNMHDR->idFrom;
if(uiID)
{
uiID= toolBar.CommandToIndex(uiID);
if(uiID != -1)
{
toolBar.GetButtonText(uiID,toolText);
pTTT->lpszText= toolText.GetBuffer(toolText.GetLength());
//pTTT->hinst= AfxGetResourceHandle();
returnTRUE;
}
}
returnFALSE;
}