CMFCToolBarButton动态切换位图

来源:互联网 发布:c语言n不为0的表达式 编辑:程序博客网 时间:2024/06/04 19:08

CMFCToolBarButton中有时候要用不同的图标表示不同的状态,那么如何改变CMFCToolBarButton的位图或者图标呢?

这个问题今天困扰了我一天?查了一天的资料终于解决了。

问题:

图中红色圆形中的图标在程序初始化时是灰色的,但是当我点击连接设备并成功后图标变为绿色,代表表连接成功。


实现方法:

1、在创建CMFCToolBar工具栏时

//创建串口工具栏if (!m_wndSerialPortToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,  CRect(1,1,1,1), IDR_TOOLBAR_SERIALPORT) ||!m_wndSerialPortToolBar.LoadToolBar(IDR_TOOLBAR_SERIALPORT, 0, 0, TRUE, IDB_SERIALPORT_COOL, 0, IDB_SERIALPORT_HOT)){TRACE0("未能创建工具栏\n");return -1;      // 未能创建}
要添加两个资源,一个是IDB_SERIALPORT_HOT,一个是IDB_SERIALPORT_COOL

2、需要添加按钮的消息映射。

在头文件中添加:afx_msg void OnBnClickedButtonStatueIcon();

在实现文中添加:

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
ON_BN_CLICKED(ID_BUTTON_SERIALPORT_STATUEICON, &CMainFrame::OnBnClickedButtonStatueIcon)
END_MESSAGE_MAP()

以及

void CMainFrame::OnBnClickedButtonStatueIcon()
{
}


3、添加状态切换的消息映射

头文件中添加:afx_msg void OnUpdateMainmenuOncommandStatueIcon(CCmdUI *pCmdUI);

实现文件中添加:

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
ON_UPDATE_COMMAND_UI(ID_BUTTON_SERIALPORT_STATUEICON, &CMainFrame::OnUpdateMainmenuOncommandStatueIcon)
END_MESSAGE_MAP()

以及

void CMainFrame::OnUpdateMainmenuOncommandStatueIcon(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_bOnlineStatue);
}

4、在头文件中添加一个BOOl变量m_bOnlineStatue,由于3中的函数是自动触发的,所以只要改变m_bOnlineStatue的值,就可以任意控制按钮上的图标是灰是亮了。


OK,完美解决!





1 0