MFC菜单栏及工具栏实现

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");
}

    

猜你喜欢

转载自blog.csdn.net/dongganxiao_maidou/article/details/79938222
今日推荐