动态创建CMFCToolbar并添加按钮

99 篇文章 0 订阅

最近遇到一个问题,需要动态的从xml文件读取一系列图标文件,加载到一个toolbar中,由于使用的是vs2008 with sp1 feature pack,自然想到用CMFCToolbar来做,思路也很简单

1、将图标文件加入CMFCToolBarImages。

2、设置CMFCToolbar::SetUserImages为第1步中的CMFCToolBarImages。

3、继承CMFCToolbar,在OnCreate中动态调用SetButtons或者InsertButton函数添加相应按钮,或者在外部调用InsertButton public版本(引用)添加按钮。

4、在MainFrm中动态创建工具条。

一切就绪后问题出现了,工具栏图标没有显示,而鼠标hover时tooltip中却可以看见加载的图标。

在网上google一天,始终得不到答案。

无奈之下,试着在Create后调用LoadToolbar,加载一个已经存在的toolbar资源,然后调用RemoveAllButtons,删除原本的所有按钮,然后再动态添加按钮,奇迹出现了!所有图片都能构显示出来。最终还是实现了想要的效果!

翻看源码后,任然没有找到答案,只有先记在这里。希望知道的人能告诉一声。下面是我的代码。

// 创建工具条  
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1, 1, 1, 1), USERTOOLBAR) ||
	!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
	//	TRACE0("未能创建工具栏\n");
	return false;      // 未能创建
}
m_wndToolBar.RemoveAllButtons();


if (CMFCToolBar::GetUserImages() == NULL)
{
	// 加载用户定义的工具栏图像
	if (m_UserImages.Load(_T(".\\toolbar32.bmp")))
	{
		m_UserImages.SetImageSize(CSize(32, 32), TRUE);
		CMFCToolBar::SetSizes(CSize(32, 32), CSize(32, 32));
		CMFCToolBar::SetUserImages(&m_UserImages);
	}
}

// 在这里CMFCToolBarButton()第四个参数需要设置为true,这样在重绘的时候才会,调用自己设置的图像。  
int a = m_UserImages.GetCount();

//添加按钮1
m_wndToolBar.InsertButton(CMFCToolBarButton(2000, 0, NULL, TRUE, 0));
// 设置按钮提示
m_wndToolBar.SetButtonText(0, L"测试按钮1");

//添加按钮2
m_wndToolBar.InsertButton(CMFCToolBarButton(2001, 1, NULL, TRUE, 0));
m_wndToolBar.SetButtonText(1, L"测试按钮2");

//添加按钮3
m_wndToolBar.InsertButton(CMFCToolBarButton(2002, 2, NULL, TRUE, 0));
m_wndToolBar.SetButtonText(2, L"测试按钮3");

m_wndToolBar.AdjustSizeImmediate();//根据按钮大小调整工具栏 

消息响应函数

afx_msg void OnCustomButtonCmd(UINT id); //id即为触发的工具条按钮ID

void CMainFrame::OnCustomButtonCmd(UINT id)
{

}

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
        ON_COMMAND_RANGE(2000, 2500, &OnCustomButtonCmd)
END_MESSAGE_MAP()

加载的图片资源:


效果图片:




要在cmfctoolbar添加编辑框,可以按照以下步骤进行操作: 1. 首先,在窗口的头文件中包含相应的头文件,比如afxcmn.h。 2. 创建一个全局变量或者成员变量,用于引用编辑框对象。例如,可以在窗口类的头文件中添加如下代码: ``` CEdit m_editBox; ``` 3. 在窗口的创建过程中,通过调用Create函数创建编辑框。在窗口类的OnCreate函数中添加如下代码: ``` m_editBox.Create(WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, CRect(0, 0, 100, 20), &m_wndToolBar, ID_MY_EDIT); ``` 这里,通过调用Create函数来创建编辑框对象,并设置样式为WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,位置为CRect(0, 0, 100, 20),父窗口为m_wndToolBar(即cmfctoolbar对象),并为编辑框指定一个ID(这里为ID_MY_EDIT)。 4. 在窗口的布局过程中,通过调用MoveWindow函数设置编辑框的位置和尺寸。例如,在窗口类的OnSize函数中添加如下代码: ``` m_editBox.MoveWindow(10, 10, 100, 20); ``` 这里,通过调用MoveWindow函数设置编辑框的位置为(10, 10),尺寸为100x20。 5. 在窗口类的OnCmdMsg函数中添加对编辑框的消息处理。例如,可以添加如下代码: ``` if (m_editBox.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; ``` 这里,通过调用编辑框的OnCmdMsg函数来处理与编辑框相关的消息。 通过以上步骤,就可以在cmfctoolbar中成功添加一个编辑框。需要注意的是,根据具体需求,可以根据编辑框的样式、位置和尺寸进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值