动态修改CMFCMenuBar及CMFCToolBar的文字及Prompt,ToolTip文字.

本文介绍如何在MFC应用程序中动态修改菜单栏和工具栏的文字、提示信息及ToolTip文字。包括修改顶层菜单文字、子菜单项文字、工具栏按钮文字以及更新提示信息的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态修改CMFCMenuBar及CMFCToolBar的文字及Prompt,ToolTip文字.

1. 修改CMFCMenuBar菜单项的文字,分两种.

  A. 修改顶层有POP_UP属性的菜单文字,即类型单文档中的" 文件" ,"编辑","视图"等这类一直显示着的.

    因为CMFCMenuBar基类是CMFCToolBar,所以有有如下代码:   (特别注意: 在单文档中,此函数一定要在主窗口ShowWindow之后调用)

//更新菜单栏父项,即无ID的项.
	CAdoString Str;
	CMFCToolBarButton  *pButton = NULL;
	int Index = 0;
	do
	{
		pButton = m_wndMenuBar.GetMenuItem(Index);
		if(pButton)
		{
			//由于无ID,就只能按索引来修改了,这里只修改了索引为0的菜单项,在单文档中是"文件"菜单项
			if(Index == 0)
			{
				Str.LoadString(TEXT("IDS_FILE"));
				pButton->m_strText = Str;
			}

		}
		++Index;
	}
	while( pButton != NULL );

  B, 修改由顶层菜单弹出菜单的有ID的菜单项. 

      响应ON_UPDATE_COMMAND_UI 然后在其中修改,代码如下:

void CMainFrame::OnUpdateFileNew(CCmdUI *pCmdUI)
{
	CAdoString Str;
	Str.LoadString(TEXT("IDS_FILE_NEW"));

	//加上如下判断,是只更新菜单中这个ID对应的串,而工具栏中对应的串,在其它地方修改,
	//如果没有这个条件,工具栏上显示的文字将与菜单栏相同.
	if(pCmdUI->m_pMenu != NULL) 
	{
		pCmdUI->SetText(Str);
	}

	//特别注意: 如果这里调用这类的函数,可能导致工具栏不弹出ToolTip提示.
	//m_wndToolBar.AdjustLayout(); 
}
如果相让菜单中显示的文字和工具栏上文字相同,则去掉 if(pCmdUI->m_pMenu !=NULL)这句.


2. 工具栏CMFCToolBar文字修改.

    A. 在ON_UPDATE_COMMAND_UI , 前面已经说过.

   B. 使用CMFCToolbar的方法修改. 代码如下:   (特别注意: 在单文档中,此函数一定要在主窗口ShowWindow之后调用)

//修改工具栏文字
	UINT itemID = 0;
	int nCount  = m_wndToolBar.GetCount();
	for( int i=0 ;i<nCount; ++i)
	{
		if( TBBS_SEPARATOR != m_wndToolBar.GetButtonStyle(i) )//分隔栏没有文字
		{
			itemID = m_wndToolBar.GetItemID(i);//根据命令ID修改对应文字.
			switch(itemID)
			{
			case ID_FILE_NEW:
				Str.LoadString(TEXT("TOOL_NEW"));
				m_wndToolBar.SetToolBarBtnText(i,Str);
				break;
			case ID_FILE_OPEN:
				Str.LoadString(TEXT("TOOL_OPEN"));
				m_wndToolBar.SetToolBarBtnText(i,Str);
				break;
			case ID_FILE_SAVE:
				Str.LoadString(TEXT("TOOL_SAVE"));
				m_wndToolBar.SetToolBarBtnText(i,Str);
				break;
			case ID_FILE_PRINT:
				Str.LoadString(TEXT("TOOL_PRINT"));
				m_wndToolBar.SetToolBarBtnText(i,Str);
				break;
			}
		}

	}

3. 修改Prompt信息.

    Prompt信息分成两段: 一般格式如下:  

        保存活动文档\n保存

    在编辑菜单项或者工具栏项时如果输入如上信息,则会被分成两段.   "保存活动文档" 和 " 保存".

    "保存活动文档" 这段会在你鼠标移动到菜单项上或者工具栏项上时,显示到 状态栏 中. 而 "保存"则作为菜单项和工具栏ToolTip的标题.  

    

   这两段字不能在同一个地方动态修改.

   要分为两次.

  A. 修改 \n 前的部分.即  "  保存活动文档\n保存 "   中的     "保存活动文档"  串.

  通过在主窗口类中重载虚函数: GetMessageString 实现修改,代码如下:

 

void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
{
		
	CAdoString Str;

	//根据菜单或者工具栏命令ID加载自己的串,否则调用基类函数
	if( nID == ID_FILE_OPEN)
	{
		 Str.LoadString(TEXT("IDS_TIP_FILE_OPEN"));
		 rMessage = Str;
		 return;
	}
	else if( nID == ID_FILE_NEW )
	{
		Str.LoadString(TEXT("IDS_TIP_FILE_NEW"));
		rMessage = Str;
		return;
	}

	CMDIFrameWndEx::GetMessageString(nID, rMessage);
}

B. 修改 \n之后的部分, 即 "  保存活动文档\n保存 "   中的     "保存"  串.

   些串的修改,需要派生CMFCToolBar类, 并重载虚函数OnToolHitTest.  代码如下:

 

INT_PTR CMyMFCToolBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
	static CString strText;
	CAdoString adoStr;
	INT_PTR hInt = CMFCToolBar::OnToolHitTest(point,pTI);//先调用基类函数,再修改串.
	strText = pTI->lpszText;
	int Index = strText.Find('(');
	if(Index > 0)
	{
		strText.Delete(0,Index);//去掉加速键前的文字,如 "New(Ctrl+N)前面的" new
	}
	else
	{
		strText.Empty(); //如果没有加速键文本,则全部清空.
	}
	if(pTI->uId == ID_FILE_NEW )
	{
		adoStr.LoadString(TEXT("TOOL_NEW"));
		
	}
	else if(pTI->uId == ID_FILE_OPEN )
	{
		adoStr.LoadString(TEXT("TOOL_OPEN"));
	}
	else if(pTI->uId == ID_FILE_SAVE)
	{
		adoStr.LoadString(TEXT("TOOL_SAVE"));
	}
	else
	{
		((CString&)adoStr) = TEXT("Other");
	}
	strText = adoStr + strText; //重新组合成: New(Ctrl+N)形式.
	
	//基类中会释放这个指针pTI->lpszText,但是由于我们要修改这个串,
	//所以原来的空间不一定够,所以要释放掉原来的,并重新申请,
	int len = strText.GetLength()*sizeof(TCHAR);
	TCHAR *pBuf =(TCHAR*)malloc(len+10);
	memset(pBuf,0,len+10);
	_tcscpy_s(pBuf,strText.GetLength()+2,strText);
	free(pTI->lpszText); 
	pTI->lpszText = pBuf;

	return hInt;
}

至此, 动态修改CMFCMenuBar及CMFCToolBar的文字及Prompt,ToolTip文字.就全部完成.

补充说明:  工具栏上的文字要使得修改后能马上看到效果,则要把如下函数多调用几次.

m_wndToolBar.AdjustLayout();
	m_wndToolBar.RecalcLayout();
	m_wndToolBar.CalcFixedLayout(TRUE,FALSE);
	m_wndToolBar.AdjustLayout();
	m_wndToolBar.RecalcLayout();
	m_wndToolBar.CalcFixedLayout(TRUE,TRUE);
	m_wndToolBar.AdjustLayout();
	m_wndToolBar.RecalcLayout();
	m_wndToolBar.CalcFixedLayout(TRUE,TRUE);

由于文字改变后,工具栏的重新计算每个工具栏按钮的宽度及整个工具栏的宽度. 所认有以上函数的调用. 至于为什么要调用多次才能正确,确是没有去深究他.

还有要注意,注册表里面保存有工具栏配置信息, 可能需要删除注册表项. 当然比较好的,还是在在CMFCToolBar的派生类中重载LoadState及SaveState函数,什么也不做,直接返回.

BOOL CMyMFCToolBar::LoadState(
					   LPCTSTR lpszProfileName/*=NULL*/,
					   int nIndex/*=-1*/,
					   UINT uiID/*=(UINT)-1*/ 
					   )
{
	return TRUE;
}


不知道微软的东西是越来越难用,还是因为不用之不得其道 ,总感觉这些新类除了好看, 用起真是难用之极啊.

<think>我们正在使用CMFCToolBar,需要设置工具栏按钮的图标、文字和提示信息。根据引用[1]和[2],我们可以得到一些线索,但需要更具体的方法。 步骤: 1. 设置图标:CMFCToolBar使用图像列表(CImageList)来管理图标。我们需要创建一个图像列表,并将包含多个图标的位图加载进去,然后为每个按钮设置图像索引。 2. 设置文字:我们可以通过调用工具栏按钮的SetText方法或者使用工具栏的SetToolBarBtnText函数来设置按钮的文本。 3. 设置提示信息:通过调用工具栏按钮的SetToolTipText方法或者使用工具栏的SetButtonToolTip函数来设置提示信息。 但是,由于CMFCToolBar是从CPane派生的,与传统的CToolBar不同,因此设置方法可能有所差异。 具体实现: 1. 设置图标: - 首先,我们需要准备一个位图资源,该位图包含多个工具栏图标(通常排列成一行)。 - 然后,在创建工具栏后,使用CMFCToolBar::SetImages方法将位图设置为工具栏的图像列表。注意,CMFCToolBar内部管理多个图像列表(包括正常状态、禁用状态、热键状态等),但我们通常只需要设置正常状态的图像列表。 - 另外,也可以使用CMFCToolBar::ReplaceButton来替换按钮,并设置其图像索引。 2. 设置文字: - 可以通过调用CMFCToolBar::SetButtonText来设置按钮的文本。注意,默认情况下工具栏按钮可能只显示图标,要显示文本需要设置工具栏的样式。 - 设置样式:使用SetToolBarBtnText(CMFCToolBarButton* pButton, LPCTSTR lpszText, BOOL bShowText=TRUE, BOOL bShowImage=TRUE)函数,或者调用工具栏的SetButtonStyle来设置TBSTYLE_AUTOSIZE和TBSTYLE_SHOWTEXT等样式。 3. 设置提示信息: - 通过调用CMFCToolBar::SetToolTipText来设置按钮的提示信息。或者,在添加按钮时,可以在CMFCToolBarButton的创建参数中设置提示信息。 示例代码: 假设我们有一个工具栏对象m_wndToolBar,我们想要添加一个按钮,并设置其图标、文字和提示信息。 步骤1:在资源文件中定义位图资源(IDB_TOOLBAR_IMAGES),包含多个图标(每个图标16x16,按顺序排列)。 步骤2:在创建工具栏后,设置图像列表。 ```cpp // 创建工具栏 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) { return -1; } // 设置图像列表 CImageList images; images.Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 0); CBitmap bmp; bmp.LoadBitmap(IDB_TOOLBAR_IMAGES); images.Add(&bmp, RGB(255,0,255)); // 假设使用品红色作为掩码色 m_wndToolBar.GetImages().SetImageSize(CSize(16,16)); // 设置图像大小 m_wndToolBar.SetImages(&images, NULL); // 设置正常状态图像列表 // 注意:CMFCToolBar内部使用CMFCToolBarImages管理图像,所以也可以直接操作CMFCToolBarImages // 另一种方法:使用CMFCToolBarImages CMFCToolBarImages toolBarImages; toolBarImages.SetImageSize(CSize(16,16)); toolBarImages.Load(IDB_TOOLBAR_IMAGES); m_wndToolBar.SetImages(&toolBarImages, NULL, FALSE); // 设置正常图像 ``` 步骤3:添加按钮并设置文本和提示信息。 ```cpp // 假设我们要在工具栏上添加一个按钮 int index = m_wndToolBar.CommandToIndex(ID_MY_COMMAND); if (index >= 0) { CMFCToolBarButton* pButton = m_wndToolBar.GetButton(index); if (pButton != NULL) { // 设置文本 pButton->SetText(_T("我的按钮")); // 设置提示信息 pButton->SetToolTip(_T("这是我的按钮")); pButton->SetDescription(_T("描述信息")); // 状态栏提示 } } // 或者,在添加按钮时直接设置 // 首先,确保工具栏已经创建,然后我们可以通过插入按钮的方式 // 创建一个按钮 CMFCToolBarButton btn(ID_MY_COMMAND, -1, _T("我的按钮")); btn.SetToolTip(_T("这是我的按钮")); btn.SetDescription(_T("描述信息")); m_wndToolBar.InsertButton(btn, 0); // 插入到第一个位置 // 另外,为了显示文本,我们需要设置工具栏按钮的样式,允许显示文本 m_wndToolBar.SetButtonStyle(index, TBBS_BUTTON | TBBS_AUTOSIZE); m_wndToolBar.SetToolBarBtnText(pButton, _T("我的按钮"), TRUE, TRUE); // 显示文本和图像 ``` 步骤4:更新工具栏布局。 ```cpp m_wndToolBar.AdjustLayout(); m_wndToolBar.RedrawWindow(); ``` 注意:上述代码仅为示例,实际使用时需要根据具体情况进行调整。 另外,引用[2]提到了一种实现256色工具栏图标的方法,我们可以使用32位色的位图,并确保使用ILC_COLOR32标志创建图像列表。 关于提示信息,我们还需要确保在创建工具栏时指定了CBRS_TOOLTIPS样式,这样提示信息才会显示。 相关问题: 1. CMFCToolBar与传统的CToolBar有哪些主要区别? 2. 如何为CMFCToolBar按钮设置不同状态(如禁用、高亮)的图标? 3. 如何动态改变CMFCToolBar按钮的图标和文本?</think>### CMFCToolBar 设置图标、文字及提示信息详解 在 MFC 中使用 CMFCToolBar 设置按钮的图标、文字和提示信息,需结合资源文件和代码配置。以下是具体步骤: --- ### 1. **图标设置** #### 方法 1:通过位图资源加载 1. **准备位图资源** 在资源视图(Resource View)中添加位图资源(如 `IDB_BITMAP1`),尺寸建议为 `16x16` 或 `24x24`。 ```cpp // 加载位图资源 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); ``` 2. **关联图像列表** 使用 `CMFCToolBarImages` 管理图标(支持 256 色): ```cpp CMFCToolBarImages images; images.SetImageSize(CSize(16, 16)); // 设置图标尺寸 images.AddImage(bmp, TRUE); // TRUE 表示自动生成掩码 m_wndToolBar.SetImages(&images); // 关联到工具栏 ``` #### 方法 2:直接设置按钮图标 ```cpp int nIndex = m_wndToolBar.CommandToIndex(ID_BUTTON1); // 获取按钮索引 CMFCToolBarButton* pButton = (CMFCToolBarButton*)m_wndToolBar.GetButton(nIndex); pButton->SetImage(0); // 0 表示图像列表中的第一个图标 ``` --- ### 2. **文字设置** #### 方法 1:通过资源字符串 在字符串表(String Table)中为按钮命令 ID 添加文本: ```cpp // 示例:ID_BUTTON1 的字符串资源为 "保存\nSave" m_wndToolBar.SetButtonText( m_wndToolBar.CommandToIndex(ID_BUTTON1), _T("保存") // 显示文本 ); ``` #### 方法 2:动态设置文本 ```cpp m_wndToolBar.SetToolBarBtnText( m_wndToolBar.CommandToIndex(ID_BUTTON1), _T("保存"), TRUE, // 显示文本 TRUE // 显示图标 ); ``` #### 启用文本显示 在工具栏初始化时调用: ```cpp m_wndToolBar.SetButtonStyle( nIndex, TBBS_BUTTON | TBBS_AUTOSIZE // 允许显示文本 ); m_wndToolBar.AdjustLayout(); // 刷新布局 ``` --- ### 3. **提示信息设置** #### 方法 1:通过字符串资源 在字符串表中为命令 ID 添加提示信息(格式:`提示文本\n状态栏描述`): ```cpp // 字符串资源 ID_BUTTON1: "保存文件\n保存当前文档" ``` #### 方法 2:动态设置提示 ```cpp CMFCToolBarButton* pButton = (CMFCToolBarButton*)m_wndToolBar.GetButton(nIndex); pButton->SetToolTip(_T("保存文件")); // 鼠标悬停提示 pButton->SetDescription(_T("保存当前文档")); // 状态栏描述 ``` #### 启用提示功能 在创建工具栏时添加 `CBRS_TOOLTIPS` 样式: ```cpp m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | CBRS_TOP | CBRS_TOOLTIPS); ``` --- ### 完整示例代码 ```cpp // 初始化工具栏 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | CBRS_TOP | CBRS_TOOLTIPS) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) { return -1; } // 设置图标 CMFCToolBarImages images; images.SetImageSize(CSize(16, 16)); images.Load(IDB_TOOLBAR_IMAGES); // 多图标位图资源 m_wndToolBar.SetImages(&images); // 设置按钮文本 int nIndex = m_wndToolBar.CommandToIndex(ID_FILE_SAVE); m_wndToolBar.SetToolBarBtnText(nIndex, _T("保存"), TRUE, TRUE); // 设置提示信息 CMFCToolBarButton* pButton = (CMFCToolBarButton*)m_wndToolBar.GetButton(nIndex); pButton->SetToolTip(_T("保存文件")); pButton->SetDescription(_T("保存当前文档到磁盘")); // 刷新布局 m_wndToolBar.AdjustLayout(); ``` --- ### 关键注意事项 1. **图标颜色深度** 使用 `CMFCToolBarImages` 替代传统 `CImageList` 以支持 256 色图标[^2]。 2. **布局刷新** 修改文本或图标后需调用 `AdjustLayout()` 更新界面。 3. **资源匹配** 按钮命令 ID 需与字符串表、位图资源一致。 --- ### 相关问题 1. 如何动态更新 CMFCToolBar 按钮的图标状态(如禁用/高亮)? 2. CMFCToolBar 与 Ribbon 控件如何协同使用? 3. 如何实现 CMFCToolBar 的自定义绘制? [^1]: CMFCToolBar 是 VS2008 SP1 引入的工具栏控件,派生自 `CPane`,支持 Ribbon 主题。 [^2]: 使用 `CMFCToolBarImages` 可避免传统 16 色限制,实现 256 色工具栏图标。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值