MFC之CMFCToolBar 各个按钮的Prompt提示消息

    先来看图

    对于两个下拉框(红色框内)和 按钮右侧有三角符号(椭圆内)我是通过CMFCToolBar::ReplaceButton()方式设置上去的:

mToolBar2_.ReplaceButton(ID_BAR_COMBO1, *mpCalibration_);
...
CMenu menu1;
menu1.LoadMenu(IDR_TOOLA);
mToolBar3_.ReplaceButton(ID_BAR_TOOLA,
CMFCToolBarMenuButton(ID_BAR_TOOLA, menu1, GetCmdMgr()->GetCmdImage(ID_BAR_TOOLA)));

    如果这时候我想给各个按钮添加Prompt消息,应该怎么添加呢:

    1. 先来给普通的CMFCToolBarButton添加Prompt提示消息,对于ToolBar系统自带的Prompt来说只需要在资源管理页面的属性页中填上相对应的提示就行了,如:

    这时候你会发现在你的String Table里面会自动的添加一个相对应的以你当前的工具按钮的ID作为  字符串ID的字符,如:

    这就是系统自带的Prompt提示消息过程了

    2. 对于使用ReplaceButton()函数替换过的CMFCToolBarComboBoxButton,因为没有相对应的属性界面添加Prompt消息该怎么添加提示消息呢, 其实也很简单我们就以两个CMFCToolBarComboBoxButton的ID, ID_COMBO_CALIBRATE、ID_COMBO_UNIT作为String Table里面的字符串的ID就完全可以实现系统自带的Prompt消息提示,如:

    3. 对于也是使用ReplaceButton()函数替换过的第三种情况,也就是按钮右侧有三角符号的按钮我们该怎么处理呢,首先给带有三角符号的各个按钮分别以自身ID命名添加字符串到String Table,如:

    然后继承CMFCToolBar为CMyMFCToolBar

 CMyMFCToolBar   mToolBar3_;

    CMyMFCToolBar需要重写virtual BOOL OnUserToolTip(CMFCToolBarButton* pButton, CString& sPrompt) const;

BOOL CMyMFCToolBar::OnUserToolTip(CMFCToolBarButton* pButton, CString& sPrompt) const
{
	int iImg = pButton->GetImage();//根据当前按钮图标索引做判断
	switch (pButton->m_nID)
	{
	case ID_BAR_TOOLA:
		if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLA2))	
			sPrompt.LoadString(ID_MENS_TOOLA2);
		else 
			sPrompt.LoadString(ID_MENS_TOOLA1); 
		break;

	case ID_BAR_TOOLC:
		if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLC2))	
			sPrompt.LoadString(ID_MENS_TOOLC2);
		else
			sPrompt.LoadString(ID_MENS_TOOLC1);
		break;

	case ID_BAR_TOOLE:
		if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLE2))
			sPrompt.LoadString(ID_MENS_TOOLE2);
		else if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLE3))
			sPrompt.LoadString(ID_MENS_TOOLE3);
		else 
			sPrompt.LoadString(ID_MENS_TOOLE1);
		break;

	case ID_BAR_TOOLH:
		if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLH2))
			sPrompt.LoadString(ID_MENS_TOOLH2);
		else
			sPrompt.LoadString(ID_MENS_TOOLH1);
		break;

	case ID_BAR_TOOLK:
		if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLK2))
			sPrompt.LoadString(ID_MENS_TOOLK2);
		else if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLK3))
			sPrompt.LoadString(ID_MENS_TOOLK3);
		else
			sPrompt.LoadString(ID_MENS_TOOLK1);
		break;

	case ID_BAR_TOOLM:
		if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLM2))
			sPrompt.LoadString(ID_MENS_TOOLM2);
		else
			sPrompt.LoadString(ID_MENS_TOOLM1);
		break;

	case ID_BAR_TOOLQ:
		if (iImg == GetCmdMgr()->GetCmdImage(ID_MENS_TOOLQ2))
			sPrompt.LoadString(ID_MENS_TOOLQ2);
		else
			sPrompt.LoadString(ID_MENS_TOOLQ1);
		break;
	}

	if (!sPrompt.IsEmpty())
	{
		sPrompt.Replace(L"\n", L""); 
		return TRUE;//自己做处理过
	}

	return FALSE;//系统处理
}

    最后一个问题,看图:

    对于这种问题也就是被你使用ReplaceButton()函数替换过后出现的,这种问题出现的原因是因为本来CMFCToolBar上的各个按钮都有相对应的一个ID_ITSELF,但是后来你使用ReplaceButton()函数替换了这个ID_ITSELF,而替换者本身也有一个ID_OTHER,你在String Table里面添加的只是ID_OTHER对应的Prompt,你并没有给它原本的ID_ITSELF添加一个Prompt,所以会出现这样的警告,所以你只需要在String Table以ID_ITSELF命名一个字符串就行了

    最后来看结果图:

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页