VS2010 MFC中在对话框上添加工具栏以及工具栏提示信息并改变图标支持256色
网上资料:
在基于单文档和基于多文档的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, 内容是: 打开文件
在运行的时候,将鼠标放在按钮上面就会提示 "打开文件"了
这样就完成了所有的步骤。