工具栏,默认创建时,VC6.0是CToolbar ,但从VS某个版本(网上说VS2008SP1,笔者并未考证)开始就是CMFCToolbar了。
两者用法上区别还是蛮大的。本文给出一个基本用法。
1.创建一个工具条ID资源,IDR_TOOLBAR1
2.m_mfcToolbarImage 设置SetImageSize 大小
3.把m_ToolbarImageNew显示在m_ToolBarNew上
4.插入按钮
5.添加映射消息
上代码,笔者亲测有效。
CMFCToolBar m_ToolBarNew;
CMFCToolBarImages m_ToolbarImageNew;
//1.创建一个工具条ID资源,IDR_TOOLBAR1
m_ToolBarnew.CreateEx(this, TBSTYLE_FLAT, dwStyle, CRect(1, 1, 1, 1), 1000);
m_ToolBarnew.AddToolBarForImageCollection(IDR_TOOLBAR1, IDB_BITMAP1);//可有可无
CString name;
bNameValid = name.LoadString(IDS_MyToolBar);
ASSERT(bNameValid);
m_ToolBarNew.SetWindowText(name);//给工具条命名
m_ToolBarNew.SetSizes(CSize(23, 22), CSize(16, 15));//设置大小(按钮和图片)
//2.m_mfcToolbarImage 设置SetImageSize 大小
m_mfcToolbarImage.SetImageSize(CSize(16, 15), TRUE);//默认图片大小
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1); //装载资源栏中的Bitmap
m_mfcToolbarImage.AddImage(bmp);
bmp.DeleteObject();
//3.把m_ToolbarImageNew显示在m_ToolBarNew上
int aa = m_myToolBar.SetUserImages(&m_mfcToolbarImage);
m_myToolBar.RemoveAllButtons();
// 4.插入按钮:按钮id,index,text,TRUE表示重绘.
//ID_BUTTON1是需要实现
m_ToolBarNew.InsertButton(CMFCToolBarButton(ID_BUTTON1, 0, _T("提示?"), TRUE, 0));
...
m_ToolBarNew.AdjustSizeImmediate();
//5.添加映射消息
afx_msg void OnToolButtonCmd(UINT id); //按钮触发函数
void CMainFrame::OnToolButtonCmd(UINT id)
{
}
//响应ID_BUTTON1-ID_BUTTON20的消息
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
ON_COMMAND_RANGE(ID_BUTTON1, ID_BUTTON20, &OnToolButtonCmd)
END_MESSAGE_MAP()
2.注意点:
2.1 m_ToolBarNew 和m_ToolbarImageNew 都有图片大小的设置,setsize()。设置不当会出各种错。如果发现图片显示异常,从大小入手.
2.2setsize()值为像素值。bitmap存储默认为4通道,32位,64位,等显示不同。bitmap默认函数中存的都是4的倍数。
2.3.CMFCToolBarImages 有个函数是count(),
如果你设置的m_mfcToolbarImage的值为16,// m_mfcToolbarImage.SetImageSize(CSize(16, 15), TRUE);,
但是加载的Bitmap 的值是 48 //m_mfcToolbarImage.AddImage(bmp);
虽然你只AddImage一次,但是m_mfcToolbarImage认为你加了3张图片(48/16)
有篇值得借鉴 CMFCToolBar那些事