1. 程式人生 > >關於CMFCToolBar上各個按鈕的Prompt提示訊息

關於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命名一個字串就行了

    最後來看結果圖: