MFC菜单栏实现:
在资源视图中,右键工程名.rc–>添加资源,选择Menu。对Menu设置ID,并对Menu菜单进行设置(即添加菜单栏的名字)
在C***Dlg.h中,添加CMenu m_Menu;
在C***Dlg.c的初始化中,添加m_Menu.LoadMenu(IDR_MENU1); // IDR_MENU1
SetMenu(&m_Menu);
MFC工具栏实现:
工具栏的实现由好几种,现在举例两种:(推荐第一种)
第一种:
在资源视图中,右键工程名.rc–>添加资源,选择ToolBar。打开ToolBar,为每个按钮命名ID,这样就可以生成按钮,如果发现按钮加多了,就把按钮从ToolBar拖到下方区域就没了。根据自己合成的BMP图片选择按钮数量,并选择好尺寸,按钮数量添加足够厚,点击保存,这时在res里会生成一个toolbar1.bmp,然后你需要将你的bmp替换掉这个toolbar1.bmp,名字保持一致,然后回到VS中重新加载,这样就能够进VS了。
下面说一下BMP图标制作:
1.先制作单张的图标,bmp格式的16*16的图片,可以用PS做,通过像素大小设置尺寸,里面的铅笔工具比较好用,对图片进行拾色Alt+鼠标左键,制作完成后保存成bmp图即可。
2.然后使用合成软件,开始用的是TBCreator和MergePic,但后面发现VS加载工具栏图标后会有一些地方颜色与事先排序的不一致,而且会有错位,无奈换了VisualToolbar才好了。使用VisualToolbar生成hot图,然后需要将图片设置成4位bmp图。刚开始使用PS里做的,但感觉不太好用,方法是:加载图片后,图像–>模式–>索引颜色,然后文件–>存储为,选择bmp图,然后保存后悔弹出一个对话框,选择4位bmp图即可。另一种方法是用win7自带的画图工具,加载图片后,进行另存为,选择16色位图bmp,bmp4位=16色位图(2^4=16)。
3.最后将该图片替换掉原始的toolbar1.bmp即可。
有一个问题,使用LoadToolBar貌似只能加载4位的bmp图,无法加载16位的图,一加载就崩溃,因此这里加载的IDR_TOOLBAR1是4位bmp图。
程序方面:
在C***Dlg.h中,添加CToolBar m_toolbar;CImageList m_ImageList;
在C***Dlg.c的初始化中
if(!m_toolbar.CreateEx(this,TBSTYLE_TOOLTIPS|TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_toolbar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to Create Dialog ToolBar\n");
EndDialog(IDCANCEL);
}
m_toolbar.EnableToolTips(TRUE);
m_toolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //调整工具栏的位置
第二种方法:
在资源视图中,右键工程名.rc–>添加资源,选择ToolBar。同时新建一个Bitmap,然后将要显示的图片进行加载,单个的图标位图大小为16*16。
在C***Dlg.h中,添加CToolBar m_toolbar;CImageList m_ImageList;
在C***Dlg.c的初始化中
BOOL CDrawDemoDlg::ToolBar_Init()
{
//创建Toolbar,加载Toolbar
if(!m_toolbar.CreateEx(this,TBSTYLE_TOOLTIPS|TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_toolbar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to Create Dialog ToolBar\n");
EndDialog(IDCANCEL);
}
//16位的工具栏按钮个数决定24位的工具栏按钮个数,因为那些bmp位图是显示在工具栏按钮上的
CImageList image;
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP2); //加载24位BMP工具栏
image.Create(16, 16, ILC_MASK | ILC_COLOR24, 3, 1); //创建图像列表,ILC_MASK表示背景透明,3个工具按钮,每次增加一个
image.Add(&bmp,RGB(255,255,255)); //把bmp加入到图像列表,背景颜色为白色
m_toolbar.GetToolBarCtrl().SetImageList(&image);
image.Detach(); //用完之后解绑
bmp.Detach(); //用完之后解绑
CRect rect; //如果显示不完全,就调整一下大小
m_toolbar.GetItemRect(0, &rect); //获取第一个工具按钮的大小
m_toolbar.SetSizes(rect.Size(), CSize(16, 16)); //第一个参数是按钮大小,第二个是图片大小
m_toolbar.EnableToolTips(TRUE);
m_toolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //调整工具栏的位置
return TRUE;
}
给工具栏增加提示消息
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipText)
在资源视图的toolbar中为每个图标添加prompt。
BOOL CDrawDemoDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
// UNICODE消息
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
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;
}
给工具栏的按钮增加事件处理程序
ON_COMMAND(IDM_TEST, OnTest)//工具栏
void CDrawDemoDlg::OnTest()
{
// TODO: Add your command handler code here
MessageBox(“test”);
}