在wxWidgets中使用PNG图像 Topic is solved

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
rx93v2
Knows some wx things
Knows some wx things
Posts: 49
Joined: Mon Sep 22, 2008 2:24 pm

在wxWidgets中使用PNG图像

Post by rx93v2 » Sun Mar 08, 2009 4:37 am

转自
中国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);
}

Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil » Mon Mar 09, 2009 12:24 am

谢谢分享 :)

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

-Utensil
In fascination of creating worlds by words, and in pursuit of words behind the world.

On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/

Loaden
I live to help wx-kind
I live to help wx-kind
Posts: 177
Joined: Tue Feb 19, 2008 10:21 am
Location: China

Post by Loaden » Mon Mar 09, 2009 6:02 am

:D 我写的代码。qpLoad...函数是从C::B中提取。
不过后来发现wxFormBuilder根本不需要自己写代码,直接就支持图像的读取了。
Life is not fair, get used to it.

rx93v2
Knows some wx things
Knows some wx things
Posts: 49
Joined: Mon Sep 22, 2008 2:24 pm

Post by rx93v2 » Thu Mar 12, 2009 6:57 pm

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

murusu
Earned a small fee
Earned a small fee
Posts: 13
Joined: Thu Mar 12, 2009 9:38 am

Post by murusu » Fri Mar 13, 2009 8:08 am

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

Post Reply