VC 创建具有提示功能的工具栏

1 篇文章 0 订阅

类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

创建一个CtoolBar对象

Create

创建Windows工具条并将它与该CToolBar连接

CreateEx

为嵌入的CtoolBarCtrl对象创建一个具有附加风格的CToolBar对象

SetSizes

设置按钮及其位图的尺寸

SetHeight

设置工具条的高度

LoadToolBar

装入一个用资源编辑器创建的工具条资源

LoadBitmap

装入包含位图-按钮图像的位图

SetBitmap

设置一个位图中的图像

SetButtons

设置按钮风格和按钮图像在位图中的索引


属性

CommandToIndex

返回具有给定的命令ID的按钮的索引

GetItemID

返回具有给定索引值的按钮或分隔线的命令ID

GetItemRect

获取具有给定索引值的项的显示矩形

GetButtonStyle

获取一个按钮的风格

SetButtonStyle

设置一个按钮的风格

GetButtonInfo

获取一个按钮的ID,风格和图像号

SetButtonInfo

设置一个按钮的ID,风格和图像号

GetButtonText

获取要显示在一个按钮上的文本

SetButtonText

设置要显示在一个按钮上的文本

GetToolBarCtrl

允许直接访问基本的通用控件

 

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值。

含义

ILC_COLOR

如果没有其它ILC_COLOR* 标记被确定,则使用缺省行为。典型地,缺省为ILC_COLOR4;但对于旧的显示驱动程序,缺省为ILC_COLORDDB

ILC_COLOR4

使用4位(16色)设备独立位图(DIB)部分作为图象列表的位图

ILC_COLOR8

使用8位DIB部分。彩色表格使用的颜色与半色调调色板的一样

ILC_COLOR16

使用16位(32/64K色)DIB部分

ILC_COLOR24

使用24位DIB部分

ILC_COLOR32

使用32位DIB部分

ILC_COLORDDB

使用设备独立位图

ILC_MASK

使用掩码。图象列表包含两个位图,其中一个是用做掩码的位图。如果不包括此值,图象列表只包含一个位图

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,则窗口的客户区将被使用

bStretch //指明控制条是否被缩放到框架的大小

 

例子: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;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值