10.7 自定义wxWidgets提供的小图片

wxArtProvider这个类允许你更改wxWidgets默认提供的那些小图片,比如wxWidgets HTML帮助阅读器中或者默认的Log对话框中使用的图片.

wxWidgets提供了一个标准的wxArtProvider对象,并且体系内的一些需要使用图标和小图片的地方都调用了这个类的wxArtProvider::GetBitmap和wxArtProvider::GetIcon函数.

小图片是由两个标识符决定的:主标识符(wxArtID)和客户区标识符(wxArtClient).其中客户区标识符只在同一个主标识符在不同的窗口中需要不同的图片的时候才使用,比如,wxHTML帮助窗口使用的图标使用下面的代码取得的:

wxBitmap bmp = wxArtProvider::GetBitmap(wxART_GO_BACK,wxART_TOOLBAR);

如果你想浏览所有wxWidgets提供的小图片以及它们的标识符,你可以编译和运行wxWidgets自带的samples/artprov中的例子,它的外观如下图所示:

要替换wxWidgets提供的这些小图片,你需要实现一个wxArtProvider的派生类,重载其中的CreateBitmap函数,然后在 OnInit函数中调用wxArtProvider::PushProvider以便让wxWidgets知道.下面的这个例子替换了wxHTML帮助窗口中的大部分默认的图标:

// 新的图标
#include "bitmaps/helpbook.xpm"
#include "bitmaps/helppage.xpm"
#include "bitmaps/helpback.xpm"
#include "bitmaps/helpdown.xpm"
#include "bitmaps/helpforward.xpm"
#include "bitmaps/helpoptions.xpm"
#include "bitmaps/helpsidepanel.xpm"
#include "bitmaps/helpup.xpm"
#include "bitmaps/helpuplevel.xpm"
#include "bitmaps/helpicon.xpm"
#include "wx/artprov.h"
class MyArtProvider : public wxArtProvider
{
protected:
    virtual wxBitmap CreateBitmap(const wxArtID& id,
                                  const wxArtClient& client,
                                  const wxSize& size);
};
// 新的CreateBitmap函数
wxBitmap MyArtProvider::CreateBitmap(const wxArtID& id,
                                     const wxArtClient& client,
                                     const wxSize& size)
{
    if (id == wxART_HELP_SIDE_PANEL)
        return wxBitmap(helpsidepanel_xpm);
    if (id == wxART_HELP_SETTINGS)
        return wxBitmap(helpoptions_xpm);
    if (id == wxART_HELP_BOOK)
        return wxBitmap(helpbook_xpm);
    if (id == wxART_HELP_FOLDER)
        return wxBitmap(helpbook_xpm);
    if (id == wxART_HELP_PAGE)
        return wxBitmap(helppage_xpm);
    if (id == wxART_GO_BACK)
        return wxBitmap(helpback_xpm);
    if (id == wxART_GO_FORWARD)
        return wxBitmap(helpforward_xpm);
    if (id == wxART_GO_UP)
        return wxBitmap(helpup_xpm);
    if (id == wxART_GO_DOWN)
        return wxBitmap(helpdown_xpm);
    if (id == wxART_GO_TO_PARENT)
        return wxBitmap(helpuplevel_xpm);
    if (id == wxART_FRAME_ICON)
        return wxBitmap(helpicon_xpm);
    if (id == wxART_HELP)
        return wxBitmap(helpicon_xpm);

    // Any wxWidgets icons not implemented here
    // will be provided by the default art provider.
    return wxNullBitmap;
}
// 你的初始化函数
bool MyApp::OnInit()
{
    ...
    wxArtProvider::PushProvider(new MyArtProvider);
    ...
    return true;
}