Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MFC如何将具有透明属性的PNG转换为HBITMAP_C++_Winapi_Visual Studio 2008_Mfc - Fatal编程技术网

C++ MFC如何将具有透明属性的PNG转换为HBITMAP

C++ MFC如何将具有透明属性的PNG转换为HBITMAP,c++,winapi,visual-studio-2008,mfc,C++,Winapi,Visual Studio 2008,Mfc,我使用GDI+加载了PNG文件 我的源代码使用HBITMAP,因此我将PNG转换为HBITMAP PNG文件具有透明背景,但HBITMAP具有背景 我想从HBITMAP中删除回传。我没有足够的信息。这是我加载透明PNG文件的方式: // Based on afxbutton.cpp's static function ButtonLoadBitmap HBITMAP __stdcall CMeetingScheduleAssistantApp::ButtonLoadBitmap(UINT uiB

我使用GDI+加载了
PNG
文件

我的源代码使用
HBITMAP
,因此我将
PNG
转换为
HBITMAP

PNG
文件具有透明背景,但
HBITMAP
具有背景


我想从
HBITMAP

中删除回传。我没有足够的信息。这是我加载透明PNG文件的方式:

// Based on afxbutton.cpp's static function ButtonLoadBitmap
HBITMAP __stdcall CMeetingScheduleAssistantApp::ButtonLoadBitmap(UINT uiBmpResId)
{
    if (uiBmpResId == 0)
    {
        return nullptr;
    }

    LPCTSTR lpszResourceName = MAKEINTRESOURCE(uiBmpResId);
    ENSURE(lpszResourceName != nullptr);

    HBITMAP hbmp = nullptr;

    // Try to load PNG image first:
    CPngImage pngImage;
    if (pngImage.Load(lpszResourceName))
    {
        hbmp = (HBITMAP)pngImage.Detach();
    }
    else
    {
        HINSTANCE hinstRes = AfxFindResourceHandle(lpszResourceName, RT_BITMAP);
        if (hinstRes == nullptr)
        {
            return nullptr;
        }

        UINT uiLoadImageFlags = LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS;

        hbmp = (HBITMAP) ::LoadImage(hinstRes, lpszResourceName, IMAGE_BITMAP, 0, 0, uiLoadImageFlags);
    }

    return hbmp;
}

我的代码设计用于加载资源,但您可以调整它以使用外部文件。

您是否查看了
CImage
类:?@andrewruckle我尝试了
CImage::TransparentBlt
,但我希望转换到
HBITMAP
,背景透明,因此您不能像这里一样加载它:?
CImage
类具有透明性。您应该能够显示透明图像。其他人可能会对您提供更多帮助,但我认为您可能需要提供更多的上下文和一些您当前正在做的事情的示例代码。加上当前结果的示例。
CImage
类实现,因此您可以轻松地将
CImage
传递到任何需要
HBITMAP
的地方。请注意,alpha透明度不是与
HBITMAP
一起存储的属性。根据您使用的API(例如vs),暗示使用alpha通道。它是什么类型的PNG文件?有两种,8位调色板带有透明颜色(如GIF),32位调色板带有alpha透明。您的
PNG
图像在不使用
GDI+
的情况下清晰可见?我的
PNG
图像带有alpha通道,因此当我使用您的代码时,加载的图像是32位的image@Davidseong首先调用CPngImage。它迎合了透明图像。