CMFCToolBarComboBoxButton如何添加Prompt提示

Ilson_ 2018-06-16 10:17:19
先来看图

对于两个下拉框(红色框内)和 按钮右侧有三角符号(椭圆内)我是通过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)));

1. 我如何能在鼠标移动到CMFCToolBarComboBoxButton控件上时也像鼠标移动到打开文件夹一样有个提示
2. 我如何能在鼠标移动到右侧有三角符号按钮上时也像鼠标移动到打开文件夹一样有个提示
3. 我如何能把提示前面的的图标(箭头所指)去掉
...全文
983 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ilson_ 2018-06-20
  • 打赏
  • 举报
回复
引用 2 楼 youyingbo 的回复:

BOOL CTestDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
	TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
	UINT nID = pNMHDR->idFrom;
	UINT nIndex = m_toolbar.CommandToIndex(nID);

	m_strToolBarMsg = _T("");
	switch (nIndex)
	{
	case 0:
		m_strToolBarMsg = _T("Setting");
		break;
	case 1:
		m_strToolBarMsg = _T("Run");
		break;
	case 2:
		m_strToolBarMsg = _T("Clear");
		break;
	case 3:
		m_strToolBarMsg = _T("Refresh");
		break;
	case 4:
		m_strToolBarMsg = _T("About");
		break;
	case 5:
		m_strToolBarMsg = _T("Exit");
		break;
	default:
		m_strToolBarMsg = _T("");
		break;
	}
	pTTT->lpszText = m_strToolBarMsg.GetBuffer();
	pTTT->hinst = AfxGetResourceHandle();
	m_strToolBarMsg.ReleaseBuffer();

	return TRUE;
}
对于这种方法也不能说不对只是有些地方用错了, 其实可以改成这样UINT nID = pNMHDR->idFrom; CMFCToolBarButton *pButton = m_toolbar.GetButton(nID); 然后通过 switch(pButton->m_nID) 决定是修改哪个按钮的Prompt
Ilson_ 2018-06-20
  • 打赏
  • 举报
回复
其实对于这三个问题都可以通过继承CMFCToolBar解决:

CMyMFCToolBar mToolBar1_;
CMyMFCToolBar mToolBar2_;
CMyMFCToolBar mToolBar3_;

//mToolBar1_.EnableToolTips(TRUE); //使用自带的Prompt提示消息(带有图标),如果再加上这句话就会再添加多一个ToolTip提示消息(不带图标)
mToolBar2_.EnableToolTips(TRUE); //为了响应CMFCToolBarComboBoxButton的ToolTip提示消息,因为CMFCToolBarComboBoxButton没有Prompt提示消息
//mToolBar3_.EnableToolTips(TRUE); //使用自带的Prompt提示消息(带有图标),如果再加上这句话就会再添加多一个ToolTip提示消息(不带图标)

继承的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)
{
//这是第二个工具栏的两个ComboBox提示消息
case ID_COMBO_CALIBRATE:
sPrompt.LoadString(ID_COMBO_CALIBRATE);
break;

case ID_COMBO_UNIT:
sPrompt.LoadString(ID_COMBO_UNIT);
break;

//这是第三个工具栏的 右侧带有三角符号的 按钮的提示消息
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;
}

//这里根据自己定义的字符串是否带有换行符"\n"决定要不要去掉
if (!sPrompt.IsEmpty())
{
sPrompt.Replace(L"\n", L"");
return TRUE;//表示外部修改过
}

return FALSE;//表示使用默认的提示
}


对于问题三我这里就不去掉了(还是让他自带这图标好点),如果你们想去掉自带的图标可以把默认的Prompt提示去掉(在资源管理窗口,各个项的属性页面的Prompt置空)然后工具栏都设置属性EnableToolTips(TRUE),这样就停用了Prompt提示开启了ToolTip()提示消息





Ilson_ 2018-06-19
  • 打赏
  • 举报
回复
引用 2 楼 youyingbo 的回复:
感谢你的回答: 我用过这种方法,但是UINT nID = pNMHDR->idFrom; UINT nIndex = m_toolbar.CommandToIndex(nID);通过nID获取到的nIndex根本不对 跳不进switch里面 ,所以这方法对我是行不通的
tiger波波 2018-06-19
  • 打赏
  • 举报
回复

BOOL CTestDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
	TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
	UINT nID = pNMHDR->idFrom;
	UINT nIndex = m_toolbar.CommandToIndex(nID);

	m_strToolBarMsg = _T("");
	switch (nIndex)
	{
	case 0:
		m_strToolBarMsg = _T("Setting");
		break;
	case 1:
		m_strToolBarMsg = _T("Run");
		break;
	case 2:
		m_strToolBarMsg = _T("Clear");
		break;
	case 3:
		m_strToolBarMsg = _T("Refresh");
		break;
	case 4:
		m_strToolBarMsg = _T("About");
		break;
	case 5:
		m_strToolBarMsg = _T("Exit");
		break;
	default:
		m_strToolBarMsg = _T("");
		break;
	}
	pTTT->lpszText = m_strToolBarMsg.GetBuffer();
	pTTT->hinst = AfxGetResourceHandle();
	m_strToolBarMsg.ReleaseBuffer();

	return TRUE;
}

rollingman 2018-06-19
  • 打赏
  • 举报
回复
MFC好像有一个MoveOver,你可以搜索一下这个方法的使用
Ilson_ 2018-06-19
  • 打赏
  • 举报
回复
引用 4 楼 youyingbo 的回复:
你第一个按钮的nID和nIndex分别是多少?第二个呢?
nID为1 因为我是移动到右侧有三角符号的按钮上(椭圆框内) 刚好是我的第三个CMFCToolBar的第一个按钮 这是对的 nIndex 通过m_toolbar.CommandToIndex(nID);获取到的这个值是非常大的 还有就是 我发现只有鼠标移动到右侧有三角符号的按钮上时才会响应这个函数 如果移动到CMFCToolBarComboBoxButton上或者没有三角符号的按钮上时不会响应
tiger波波 2018-06-19
  • 打赏
  • 举报
回复
你第一个按钮的nID和nIndex分别是多少?第二个呢?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧