10.3 使用wxIcon编程

一个wxIcon代表一个小的位图,它总有一个透明遮罩,它的用途包括:

  • 设置frame窗口或者对话框的图标
  • 通过wxImageList类给wxTreeCtrl, wxListCtrl或者wxNotebook提供图标 (更多信息请参考最后一章)
  • 使用wxDC::DrawIcon函数在设备上下文中绘制一个图标

下表列出了图标类的主要成员函数

wxIcon 图标类可以通过指定另外一个图标类的方式,指定XPM数据(char**)的方式, 原始数据(char[])的方式,或者文件名及文件类型的方式创建.
CopyFromBitmap 从wxBitmap类创建一个图标.
GetWidth, GetHeight 返回图标的大小.
Getdepth 返回图标的颜色深度.
LoadFile 从文件加载图标.
Ok 在图标数据已经具备的时候返回True.

创建一个wxIcon

wxIcon可以使用XPM数据创建,或者从一个wxBitmap对象中创建,或者从文件(比如一个Xpm文件)中读取.wxWidgets也提供了类似于前一小节提到的wxBITMAP类似的宏,用来从一个平台相关的资源中获取图标.

在windows平台上,LoadFile以及同等性质的操作可以使用的文件类型包括BMP图片和ICO文件,如果你要从其它图片格式中创建图标,可以先将其读入一个wxBitmap对象中,然后再将其转换为一个图标.

而在Mac OSX和 Unix/Linux的GTK+版本中,wxIcon可以识别的图片类型和wxBitmap可以识别的图片类型是一样的.

下面代码演示了创建一个wxIcon对象的几种方法:

// 方法1: 从XPM数据创建
#include "icon1.xpm"
wxIcon icon1(icon1_xpm);
// 方法2: 从一个ICO资源中创建(Window and OS/2 only)
wxIcon icon2(wxT("icon2"));
// 方法3: 从一个图片文件中 (Windows and OS/2 only)
// 如果你的图片包含多个图标你可以指定单个图标的宽度
wxIcon icon3(wxT("icon3.ico"), wxBITMAP_TYPE_ICO, 16, 16);
// 方法4: 从位图创建
wxIcon icon4;
wxBitmap bitmap(wxT("icon4.png"), wxBITMAP_TYPE_PNG);
icon4.CopyFromBitmap(bitmap);

使用wxIcon

下面的代码演示了wxIcon的三种使用方法:设置窗口图标,增加到一个图片列表或者绘制在某个设备上下文上

#include "myicon.xpm"
wxIcon icon(myicon_xpm);
// 1: 设置窗口图标
frame->SetIcon(icon);
// 2: 增加到wxImageList
wxImageList* imageList = new wxImageList(16, 16);
imageList->Add(icon);
// 3: 在(10, 10)的位置绘制
wxClientDC dc(window);
dc.DrawIcon(icon, 10, 10);

将某个图标绑定到应用程序

将某个图标绑定到应用程序,以便系统可以显示这个图标在合适的位置使得用户可以通过点击图标的方式打开应用程序,这个工作wxWidgets是做不到的.这是极少的你需要在不同的平台使用不同的技术的领域中的一个.

在windows平台上,你需要在makefile中增加一个资源文件(扩展名是.rc),并且在这个资源文件中指定一个图标区域,如下所示:

aardvarkpro ICON aardvarkpro.ico
#include "wx/msw/wx.rc"

在这里, aardvarkpro.ico就是这个和应用程序绑定的图标的名称,它可以有多种分辨率和颜色深度(典型的大小包括48x48,32x32和 16x16).当windows的资源管理器需要显示某个图标的时候,它将使用子母顺序排在第一个的那个图标,因此你最好给确定要作为应用程序图标的那个图标的名称前面加几个a子母以便按照子母顺序它排在前面,否则你的应用程序可能绑定的是你不期望的图标.

在Mac系统上,你需要准备一个应用程序包,其中包含一些ICNS文件.参考第20章"让你的程序更完美",来获得关于程序包更多的信息,其中的主要文件Info.plist文件看上去应该象下面的额样子:

<key>CFBundleDocumentTypes</key>
<array>
     <dict>
           <key>CFBundleTypeExtensions</key>
           <array>
                    <string>pjd</string>
             </array>
             <key>CFBundleTypeIconFile</key>
             <string>dialogblocks-doc.icns</string>
             <key>CFBundleTypeName</key>
             <string>pjdfile</string>
             <key>CFBundleTypeRole</key>
             <string>Editor</string>
       </dict>
</array>
<key>CFBundleIconFile</key>
<string>dialogblocks-app.icns</string>
...

应用程序图标和应用程序相关的文档类型图标是由CFBundleIconFile和CFBundleTypeIconFile属性指定的.你可以直接用Apple提供图标编辑器编辑ICNS文件,不过如果你希望所有的平台使用同样的图标,你最好现用PNG图片创建各种大小的图标,然后再将它粘贴到各个平台上的图标编辑器中,要确保PNG使用的透明遮罩颜色和各个工具使用的透明颜色相一致.

而在linux平台上,Gnome桌面系统和KDE桌面系统则各自拥有自己的图标提供体系,我们将在第20章进行简要的描述.