动态改变工具条中按钮的位图

2024-02-10 06:18

本文主要是介绍动态改变工具条中按钮的位图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      一、动态改变工具栏按钮图标:
  这个例子中将动态改变的工具栏按钮图标存放在ID为IDR_TOOLBAR_SHELL的工具条资源中,可以被作为位图资源使用。
  
   CImageList* m_imgList1;
   m_imgList1=(m_wndToolBar.GetToolBarCtrl()).GetImageList();
   m_nToolBtns=m_imgList1->GetImageCount();
   CBitmap cbmp;
   BITMAP bmp;
   cbmp.LoadBitmap(IDR_TOOLBAR_SHELL);
   cbmp.GetBitmap(&bmp);
   m_imgList1->Add(&cbmp,RGB (192, 192, 192));
   (m_wndToolBar.GetToolBarCtrl()).SetImageList(m_imgList1);
   m_imgList1->Detach();
   m_imgList1=NULL;
   cbmp.DeleteObject();
  上面这部分代码将IDR_TOOLBAR_SHELL中位图添加到m_wndToolBar的图像列表,当然也可以通过其他方法实现。
  
  接下来就可以动态改变某个按钮的图标了,如将ID为ID_PAUSE的图标改为IDR_TOOLBAR_SHELL中的第二个图标:
  
  m_wndToolBar.SetButtonInfo(m_wndToolBar.CommandToIndex(ID_PAUSE),ID_PAUSE,TBBS_BUTTON,m_nToolBtns+1);
  
  二、动态改变工具栏按钮提示文本:
  在MFC中框架类CFrameWnd通过函数OnToolTipText处理工具提示,可在MFC的文件AFXWIN.H及WINFRM.CPP找到该函数的定义及实现。如果要动态改变工具提示,需要重载该函数。实际上MFC的CMDIChildWnd类就重载了该函数。
  
  1、在MainFrm.h的DECLARE_MESSAGE_MAP()前添加函数的定义:
  
      afx_msg BOOL OnToolTipText(UINT nID, NMHDR* pNMHDR, LRESULT* pResult);
  
  2、在MainFrm.cpp的END_MESSAGE_MAP()前面添加消息映射:
  
       ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
       ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
  3、在MainFrm.cpp中添加动态提示的实现代码:
  
  假如对ID为ID_PAUSE的工具栏按钮实现动态提示,如下(红色部分)。其中SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)(LPCTSTR)strTipText)用来设置状态条的显示文本。
  
  BOOL CMainFrame::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
  {
   ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
  
   // need to handle both ANSI and UNICODE versions of the message
   TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
   TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
   TCHAR szFullText[256];
   CString strTipText;
   UINT nID = pNMHDR->idFrom;
   if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
   pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
   {
   // idFrom is actually the HWND of the tool
   nID = ::GetDlgCtrlID((HWND)nID);
   }
  if(nID==ID_PAUSE)
   {
   strTipText=(m_bPause?/"继续/":/"暂停/");
   SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)(LPCTSTR)strTipText);
   }
   else if (nID != 0) // will be zero on a separator
   {
   // don’t handle the message if no string resource found
   if (AfxLoadString(nID, szFullText) == 0)
    return FALSE;
  
   // this is the command id, not the button index
   AfxExtractSubString(strTipText, szFullText, 1, ’n’);
   }
  #ifndef _UNICODE
   if (pNMHDR->code == TTN_NEEDTEXTA)
   lstrcpyn(pTTTA->szText, strTipText, _countof(pTTTA->szText));
   else
   _mbstowcsz(pTTTW->szText, strTipText, _countof(pTTTW->szText));
  #else
   if (pNMHDR->code == TTN_NEEDTEXTA)
   _wcstombsz(pTTTA->szText, strTipText, _countof(pTTTA->szText));
   else
   lstrcpyn(pTTTW->szText, strTipText, _countof(pTTTW->szText));
  #endif
   *pResult = 0;
  
   // bring the tooltip window above other popup windows
   ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
   SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
   strTipText.Empty();
   return TRUE;  // message was handled
  }

    ---- 在VC++ 编程过程中,我们可以通过开发环境中的资源编缉器加入或修改工具条中的按钮,并为其指定一个位图。但是这种指定是静态的,如何在程序中动态地改变工具条中按钮的位图,是我们下面要讨论的问题。首先,我们来了解两个重要的类:

    ---- 1. CToolBar (工具条类) :

    ---- CToolBar 类的对象是带有一行位图按钮和可选分隔线的控件条,它的成员函数为你提供了Windows通用控件的大多数性能。以下是我们将要用到的成员函数:

    ---- int CommandToIndex( UINT nID );

    ---- 功能:获得 ID 值为 nID 的按钮在工具条中的索引号。

    ---- (注:索引号代表了该按钮在工具条中的位置。)

    ---- void GetButtonInfo(int nIndex,UINT& nID, UINT& nStyle, int& iImage);

    ---- 功能:获得工具条中索引号为 nIndex 的按钮的 ID 值,风格和图象索引号。

    ---- (注:图象索引号代表了与该按钮相关的图象在整个工具条按钮图象列表中的位置。)

    ---- void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );

    ---- 功能:设置工具条中索引号为 nIndex 的按钮的 ID 值,风格和图象索引号。

    ---- CToolBarCtrl & GetToolBarCtrl( ) const;

    ---- 功能:获得与此CToolBar类相联系的CToolBarCtrl( 工具条控制类)的指针。函数返回值为引用类型。

    ---- 2)CToolBarCtrl( 工具条控制类) :

    ---- CToolBarCtrl类的对象包含几个重要的内部数据结构:一个按钮图像列表,一个按钮标签字符串列表和一个TBBUTTON结构的列表,该结构使一个图像和/或字符串与按钮的位置,风格,主题和命令ID相关联。它提供了Windows工具条通用控件的几乎所有性能。它的成员函数使你能更加接近底层地去操作工具条控件。以下是我们将要用到的它的成员函数:

    ---- int AddBitmap( int nNumButtons, UINT nBitmapID );

    ---- 功能:将一个或更多个位图按钮图像添加到工具条控件的按钮图像列表中。

    ---- 其中nNumButtons 位图中的按钮图像的数目。

    ---- nBitmapID 包含按钮图像或要增加图像的位图的资源标识符。

    ---- 在下面的程序中,我们将实现这样的功能:在主边框窗口的工具条上有一个"红灯"按钮,当用户点击该按钮后,按钮变为"绿灯",再点击又变为"黄灯"….

    ---- 操作步骤如下:

    ---- (一)生成基本应用程序框架:

    ---- 打开开发环境中的"文件"菜单,点击"新建",选中Projects 标签中的 MFC AppWizard(exe) 项,输入项目名称,然后回车;选中 Single document 单选按钮,最后点击"完成"。

    ---- (二)编缉工具条按钮和位图;

    ---- 1.在资源编缉器中,打开 ToolBar 新建一个按钮(不用作图)将其ID 改为 ID_LIGHT 。

    ---- 2.右击 "resources"文件夹,选中"Insert…"项,插入位图资源。然后加入三个位图,分别编缉为"红灯","绿灯"和"黄灯"三种图象。ID值分别为:IDB_RED , IDB_GREEN , IDB_YELLOW 。

    ---- (三)增加成员变量:

    ---- 在CMainFrame 中加入六个成员变量:

            UINT  nID ;
    UINT  nStyle ;
    Int   index_red;
    Int   index_green;
    Int   index_yellow;
    Int   flag;

    ---- 并在构造函数中将以上各成员变量均初始化为0。
    ---- (四)加入成员函数:

    ---- 1.右击CMainFrame 类,选中"Add Windows Message Handler…"项,为CMainFrame加入响应消息 WM_SETFOCUS 的成员函数 OnSetFocus(CWnd* pOldWnd),在该函数中加入以下语句:

    CToolBarCtrl & toolctrl=
    m_wndToolBar.GetToolBarCtrl();
    index_red=toolctrl.AddBitmap(1,IDB_RED);
    index_green=toolctrl.AddBitmap(1,IDB_GREEN);
    index_yellow=toolctrl.AddBitmap(1,IDB_YELLOW);
    int index=m_wndToolBar.CommandToIndex(IDB_LIGHT);
    int iImage;
    m_wndToolBar.GetButtonInfo
    (index,nID,nStyle,iImage);
    m_wndToolBar.SetButtonInfo
    (index,nID,nStyle,red_index);

    ---- 2.利用"Class Wizard"在CMainFrame 中加入按钮命令 ID_LIGHT 的响应函数OnLight() , 在函数中加入以下语句:
    light + +;
    if(light > 2)
      light = 0;
    switch(light)
    {
    case 0:
    int index=m_wndToolBar.
    CommandToIndex(IDB_LIGHT);
    m_wndToolBar.SetButtonInfo
    (index,nID,nStyle,index_red);
      break;
    case 1:
      int index=m_wndToolBar.
    CommandToIndex(IDB_LIGHT);
      m_wndToolBar.SetButtonInfo
    (index,nID,nStyle,index_green);
      break;
    case 2:
      int index=m_wndToolBar.
    CommandToIndex(IDB_LIGHT);
      m_wndToolBar.SetButtonInfo
    (index,nID,nStyle,index_yellow);
    }
    ---- 好了,到现在可以编译运行了。
    ---- 上面的程序虽然简单,但基本上说明了按钮图标的动态改变方法,在编制实时检测(或控制)系统中,完全可以用此来自动显示仪器设备的运行状态。使人一目了然。

这篇关于动态改变工具条中按钮的位图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/696341

相关文章

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾