關於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命名一個字串就行了
最後來看結果圖: