網上資料:
在基於單文檔和基於多文檔的MFC中,工具欄是自動添加的,但是在基於對話框的MFC中則需要編者用代碼添加,而且工具欄的提示信息的添加也較SDI和MDI要復雜的多,下面講的是:如何在基於對話框的MFC中添加工具欄,以及工具欄的提示信息,以及改變工具欄的圖標,使其支持256色。
1.在ResourceView里加入Toolbar資源,命名IDR_TOOLBAR1
2.在主程序的.h文件中加入變量:
CToolBar m_wndtoolbar;//添加工具欄
CImageList m_ilToolBar;//使工具欄圖標顯示256色
3.在主程序的.h文件中加入函數:
afx_msg BOOL OnToolTipText(UINT NID, NMHDR* pNMHDR, LRESULT* pResult);//使工具欄顯示提示信息
4.在主程序的.h文件中的BEGIN_MESSAGE_MAP(CDetectorDlg, CDialog)函數里加入:
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )//使工具欄顯示提示信息
5.在主程序的.cpp文件中,在初始化的地方(OnCreate或者OnInitDialog)加入:
//添加一個平面工具欄
if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT , WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS,
CRect(4,4,0,0)) || !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) )
{
TRACE0("failed to create toolbar\n");
return FALSE;
}
m_wndtoolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
//使工具欄圖標顯示256色
HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_TOOLBAR1), //加載IDB_TOOLBAR
IMAGE_BITMAP, //按位圖格式
0,0, // cx,cy
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );
CBitmap bm;
bm.Attach(hbm);
m_ilToolBar.Create(24,24,ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm,(CBitmap*)NULL);
m_wndtoolbar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
6.在主程序的.cpp文件中編譯函數OnToolTipText//使工具欄顯示提示信息
BOOL CDetectorDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
// UNICODE消息
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
//TCHAR szFullText[512];
CString strTipText;
UINT nID = pNMHDR->idFrom;
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
{
// idFrom為工具條的HWND
nID = ::GetDlgCtrlID((HWND)nID);
}
if (nID != 0) //不為分隔符
{
strTipText.LoadString(nID);
strTipText = strTipText.Mid(strTipText.Find('\n',0)+1);
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
{
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
}
else
{
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
}
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
{
_wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
}
else
{
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
}
#endif
*pResult = 0;
// 使工具條提示窗口在最上面
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
return TRUE;
}
return TRUE;
}
7.在ResourceView的String資源里,將工具欄中每個按鈕的ID都對應上希望顯示的提示信息即可,例如:
toolbar中有一按鈕的ID是IDC_OPENFILE,希望顯示的提示信息為“打開文件” 那么,你需要做的就是在string資源中加入一條ID同樣是IDC_OPENFILE, 內容是: 打開文件
在運行的時候,將鼠標放在按鈕上面就會提示 "打開文件"了
這樣就完成了所有的步驟。