Page 1 of 1

在wxWidgets中使用PNG图像

Posted: Sun Mar 08, 2009 4:37 am
by rx93v2
转自
中国IT技术论坛 > 程序设计交流区 > C/C++ > 在wxWidgets中使用PNG图像

今天在wxWidgets中使用PNG图像:由文件载入,出现错误:Couldn't add an image to the image list.而此错误的前一个警告信息为:No image handler for type 15 defined.
经查资料,原来在使用图像之前,要先定义相应的Handler,查wxImage类,得知:
Available image handlers
The following image handlers are available. wxBMPHandler is always installed by default. To use other image formats, install the appropriate handler with wxImage::AddHandler or call wxInitAllImageHandlers.

例如我要使用PNG图像,则应该在使用之前的任一位置声明:
代码:

Code: Select all

wxImage::AddHandler(new wxPNGHandler);
注意:要包含wxImage.h头文件,要链接wxpng.lib和wxzlib.lib库。
加载PNG的函数如下:

代码:

Code: Select all

bool isCommonControls6()
{
    bool result = false;
    DWORD version = 0;
    HINSTANCE inst = LoadLibrary(L"comctl32.dll");
    if (inst)
    {
        DLLGETVERSIONPROC dgvp;
        dgvp = reinterpret_cast<DLLGETVERSIONPROC>(GetProcAddress(inst, "DllGetVersion"));

        if (dgvp)
        {
            DLLVERSIONINFO dvi = { 0 };
            dvi.cbSize = sizeof(dvi);

            HRESULT hr = (*dgvp)(&dvi);

            if (SUCCEEDED(hr))
            {
                version = MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);
                result = dvi.dwMajorVersion == 6;
            }
        }

        FreeLibrary(inst);
    }
    return result;
}

wxBitmap qpLoadBitmap(const wxString& fileName, wxBitmapType bitmapType)
{
    static bool oldCommonControls = !isCommonControls6();

    wxImage img;
    wxFileSystem* fs = new wxFileSystem;
    wxFSFile* f = fs->OpenFile(fileName);
    if (f)
    {
        wxInputStream* is = f->GetStream();
        img.LoadFile(*is, bitmapType);
        delete f;
    }
    delete fs;
    if (oldCommonControls && img.HasAlpha())
        img.ConvertAlphaToMask();

    return wxBitmap(img);
}

Posted: Mon Mar 09, 2009 12:24 am
by Utensil
谢谢分享 :)

我顺手将帖子中的代码惊醒了语法高亮。

-Utensil

Posted: Mon Mar 09, 2009 6:02 am
by Loaden
:D 我写的代码。qpLoad...函数是从C::B中提取。
不过后来发现wxFormBuilder根本不需要自己写代码,直接就支持图像的读取了。

Posted: Thu Mar 12, 2009 6:57 pm
by rx93v2
不会吧.我用wxPack这个wxWidgets库是可以用PING图片
但用自己编译的wxWidgets库是用不了PING图片.
还用就是用eclpise+wxWidgets库编译出来的程序没有可执行文件图标和版本号.
就算按官网讲的做都不可以有文图和版本号.
但用wxPack安装库用其他工具如C::B
dialogblocks这些工具编译出来是可以有PING图片
可执行文件图标和版本号一样是有的啊.
我想这个和我设置编译参数有关.
版主如果有时间试下吧.因为我用ECLPISE+wxWidgets设置和使用知到好多关于集成开发工具是如向做出来的.如VS2005+wxWidgets+Mingw这样都可以开发应用程序.还有关于编译器的设置.在高级软件开发时几有用.

Posted: Fri Mar 13, 2009 8:08 am
by murusu
rx93v2 wrote:不会吧.我用wxPack这个wxWidgets库是可以用PING图片
但用自己编译的wxWidgets库是用不了PING图片.
还用就是用eclpise+wxWidgets库编译出来的程序没有可执行文件图标和版本号.
就算按官网讲的做都不可以有文图和版本号.
但用wxPack安装库用其他工具如C::B
dialogblocks这些工具编译出来是可以有PING图片
可执行文件图标和版本号一样是有的啊.
我想这个和我设置编译参数有关.
版主如果有时间试下吧.因为我用ECLPISE+wxWidgets设置和使用知到好多关于集成开发工具是如向做出来的.如VS2005+wxWidgets+Mingw这样都可以开发应用程序.还有关于编译器的设置.在高级软件开发时几有用.
在windows下如果要添加可执行文件图标和版本号添加一个RC资源文件就可以了 :D