VC++实现显示透明的256色以上的图标

2016-02-19 18:44 222 1 收藏

今天图老师小编要向大家分享个VC++实现显示透明的256色以上的图标教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

  在学习Visual C++编程的过程中,有很多朋友可能会问Visual C++中如何保证256色以上的图标加载后不失真。虽然有介绍如何实现256色以上的工具栏的文章,但是方法中大都采用加载一幅256色以上的工具栏位图的方法。这样的方法存在一个麻烦就是用什么简便好用的制图工具来做这样的位图呢?相信读者朋友都希望能有更直接的方法来使用256色以上的图标,并且能够以透明的效果不失真地将图标显示出来。本实例介绍了实现上述目标的方法,实现了在工具条上显示透明的256色位图:

  一、实现方法

  一般情况下,我们如果碰到需要在程序中使用图标的问题,首先要想到要用图像列表CimlageList类,该类是相同尺寸的图像或图标的集合,每个图像或图标用以"0"为基准的索引号来表征,因此它能有效地管理大量图标或位图。CimageList类常与列表控件ClistCtrl、树控件CtreeCtrl或标签控件CtabCtrl一起使用,在本实例中,该类与CtoobBarCtrl类一起使用。

  CimageList类的成员函数Create()初始化图像列表并且将它附加到一个CimageList对象上,该函数原型为:

BOOL Create(int cx,int cy,BOOL bMask,int nInitial,int nGrow);

  函数中前两个参数cx、cy指定了图标/图像的宽度和高度,即:图标/图像的尺寸定义。 第三个参数bMask为掩模标志,它指定何如显示图标/图像。如果该值等于ILC_ COLOR8说明以256色的调色板来显示图标/图像。而等于值"TRUE"则指明了以透明方式来显示图标/图像。那么如果两者进行"按位或"运算后的意义就变为:以透明方式来显示256色图标。 函数中的第四和第五个参数则分别表示为:初始图标个数和新增图标时对象自动申请内存空间的步长。如果在大批量操作图标,并且需要不断的增删图标时,设置第五个参数可以改变程序的性能,如果第五个参数设置的比较适中则可以避免程序反复的申请和释放内存空间。

  创建过CImageList类后,还需要将各个图标装载到该类的对象中去,具体实现过程可以先用Windows的API函数LoadImage()装载图标资源,然后用CImageList类的Add(HICON hIcon)函数加将装载后的图表添加到CImageList类对象中去。其中LoadImage()的函数原型如下:

HANDLE LoadImage(
 HINSTANCE hinst, // handle of the instance containing the image
 LPCTSTR lpszName, // name or identifier of image
 UINT uType, // type of image
 int cxDesired, // desired width
 int cyDesired, // desired height
 UINT fuLoad // load flags
);

  上述函数用来装载图标、图像或光标资源,如果调用成功,函数返回装载的资源的句柄,否则返回"NULL"。其中参数hinst为包含图标/图像资源的应用程序句柄;lpszName为资源的名字,该资源名字的获取可以使用MAKEINTRESOURCE()函数将资源ID转换得到;参数uType说明当前资源的类型,是图标、图像还是光标;cxDesired和cyDesired为希望的目标尺寸;最后一个参数是装载标志,在处理图标资源时,一般情况下设置为"0"。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  最后,需要调用CToolBarCtrl类的CImageList* SetImageList( CImageList* pImageList )函数将图标列表对象与工具条对象关联起来,从而在工具条上显示出装载的图标。

  二、编程步骤

  1、 启动Visual C++6.0,建立一个单文档工程(多文档也可)的应用程序,命名为"TB";

  2、 在程序的主框架CMainFrame类的头中定义一个CImageList对象,代码如下:CImageList m_ilTB;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  3、 在应用程序中添加256色的彩色图标,具体方法是启动程序中图标资源编辑器,点击资源编辑器上的"New Device Image"按钮,在弹出的对话框中选择"自定义"就可以了,实例程序中采用的图标大小为32*32,颜色为256色;

  4、 添加代码,编译运行程序;

三、程序代码

//////////////////////////////////////////////////////////////////////////////////////
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  return -1;
 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |
  CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |
  CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
 {
  TRACE0("Failed to create toolbar");
  return -1; // fail to create
 }
 if (!m_wndStatusBar.Create(this) ||
  !m_wndStatusBar.SetIndicators(indicators,
  sizeof(indicators)/sizeof(UINT)))
 {
  TRACE0("Failed to create status bar");
  return -1; // fail to create
 }
 //设置ToolBar的图标列表
 m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0);
 HICON hIcon = NULL;
 hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
 hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
 hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON3), IMAGE_ICON, 32, 32, 0);
 m_ilTB.Add(hIcon);
 hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON4), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
 m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilTB);
 // TODO: Delete these three lines if you don't want the toolbar to be dockable
 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 DockControlBar(&m_wndToolBar);
 return 0;
}

  四、小结

  本实例通过灵活的使用CImageList类的Create()函数实现了透明的256色位图的显示,其实Visual C++中的CImageList类远比我们想象的强大的多,例如通过图标的掩模操作也能实现包括透明显示的各种效果,只是没有我们这里介绍的方法简单而已。有兴趣的读者朋友可以仔细研究研究,相信一定会获益匪浅。

来源:http://www.tulaoshi.com/n/20160219/1618808.html

延伸阅读
如何让工具条显示256色图像 编译:hangwire 下载范例源代码 问题:    论坛中有很多人提出:基于Windows的程序如资源管理器(Explorer.exe),IE等都能显示出漂亮的工具栏图像和图标。但是,用MFC开发的应用程序一般都只能显示16色的工具栏图像和列表视图(如CListView)图像,...
在Office2000中,就用户界面丰富程度而论,Word以56个工具栏(Toolbar)、50个弹出式菜单(Popup Menu)雄居首位,但Excel(工具栏40个、弹出式菜单51个)和PowerPoint(工具栏43个、弹出式菜单25个)也相差不远。大多数用户可能从来没有见过所有这些工具栏,甚至许多用户不知道Office提供了这么多命令工具。 虽然我们可以用菜单隐藏...
问题: 论坛中有很多人提出:基于Windows的程序如资源管理器(Explorer.exe),IE等都能显示出漂亮的工具栏图像和图标。但是,用MFC开发的应用程序一般都只能显示16色的工具栏图像和列表视图(如CListView)图像,而无法显示在资源中创建的256色图标和位图。这是为什么? 解答: 工具栏和列表视图都是把自己的图像存储在图...
目前,不少流行软件都提供有对外挂插件的支持功能,如Winamp、Realplay等等。这些软件通过对插件技术的使用为日后的软件升级和功能扩展提供了相当的便利条件。尤为重要的是,通过使用插件技术,使得对软件的功能扩展将不再完全受限于软件厂商,任何第三方开发商或是程序员个人只要遵循了软件提供的插件接口标准去开发插件就完全可以同主体...
VC++的Unicode编程 作者:韩耀旭 下载源代码 一、什么是Unicode 先从ASCII说起,ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H—FFH)。其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符、数...

经验教程

231

收藏

41
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部