转载请注明出处:http://www.cnblogs.com/ye-ming

0X01 概述:

相对于GDI处理界面,Direct2D有得天独厚的优势,下图就是Direct2D与GDI的效果对比,win32Direct2D开发有很多,但是到了mfc下,基本上就很少了,下的今天来讲一下在资源文件下加载图片的方法。

0X02 从资源加载位图:

1. 在资源文件下加载一张png或jpg。

#define IDB_PNG1                        101

Bitmp不行,Bitmp是二进制文件,无法转换,是否可以直接用有待考证。我遇到的问题和他一样。http://stackoverflow.com/questions/9979848/iwicimagingfactorycreatedecoderfromstream-fails-error-message-message-is-no

2.添加Direct2D对象,第一篇文章提到,不在这里重复http://www.cnblogs.com/ye-ming/articles/6170289.html

在OnInitDialog函数中添加代码,没有这一句AFX_WM_DRAW2D消息不执行。

this->EnableD2DSupport(TRUE);

3. 从应用程序资源文件中加载图像

HRESULT LoadResourceBitmap(

    ID2D1RenderTarget *pRenderTarget,

    IWICImagingFactory *pIWICFactory,

    PCWSTR resourceName,

    PCWSTR resourceType,

    UINT destinationWidth,

    UINT destinationHeight,

    ID2D1Bitmap **ppBitmap)

{

    IWICBitmapDecoder *pDecoder = NULL;

    IWICBitmapFrameDecode *pSource = NULL;

    IWICStream *pStream = NULL;

    IWICFormatConverter *pConverter = NULL;

    IWICBitmapScaler *pScaler = NULL;

    HRSRC imageResHandle = NULL;

    HGLOBAL imageResDataHandle = NULL;

    void *pImageFile = NULL;

    DWORD imageFileSize = ;

    // Locate the resource.

    imageResHandle = FindResourceW(HINST_THISCOMPONENT, resourceName, resourceType);

    HRESULT hr = imageResHandle ? S_OK : E_FAIL;

    if (SUCCEEDED(hr))

    {

        // Load the resource.

        imageResDataHandle = LoadResource(HINST_THISCOMPONENT, imageResHandle);

        hr = imageResDataHandle ? S_OK : E_FAIL;

    }

4.锁定资源并计算图像的大小。

if (SUCCEEDED(hr))

{

    // Lock it to get a system memory pointer.

    pImageFile = LockResource(imageResDataHandle);

    hr = pImageFile ? S_OK : E_FAIL;

}

if (SUCCEEDED(hr))

{

    // Calculate the size.

    imageFileSize = SizeofResource(HINST_THISCOMPONENT, imageResHandle);

    hr = imageFileSize ? S_OK : E_FAIL;

}

5.使用 IWICImagingFactory::CreateStream 方法创建 IWICStream 对象。

if (SUCCEEDED(hr))

{

    // Create a WIC stream to map onto the memory.

    hr = pIWICFactory->CreateStream(&pStream);

}

if (SUCCEEDED(hr))

{

    // Initialize the stream with the memory pointer and size.

    hr = pStream->InitializeFromMemory(

        reinterpret_cast<BYTE*>(pImageFile),

        imageFileSize

        );

}

6.使用 IWICImagingFactory::CreateDecoderFromStream 方法创建 IWICBitmapDecoder。

if (SUCCEEDED(hr))

{

    // Create a decoder for the stream.

    hr = pIWICFactory->CreateDecoderFromStream(

        pStream,

        NULL,

        WICDecodeMetadataCacheOnLoad,

        &pDecoder

        );

}

7.从图像中检索某一帧并将该帧存储在 IWICBitmapFrameDecode 对象中。

if (SUCCEEDED(hr))

{

    // Create the initial frame.

    hr = pDecoder->GetFrame(, &pSource);

}

8.必须先将图像转换为 32bppPBGRA 像素格式,然后 Direct2D 才能使用该图像。若要转换图像格式,请使用IWICImagingFactory::CreateFormatConverter 方法创IWICFormatConverter 对象,然后使用 IWICFormatConverter 对象的Initialize 方法执行转换。

if (SUCCEEDED(hr))

{

    // Convert the image format to 32bppPBGRA

    // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).

    hr = pIWICFactory->CreateFormatConverter(&pConverter);

}

if (SUCCEEDED(hr))

{

    hr = pConverter->Initialize(

        pSource,

        GUID_WICPixelFormat32bppPBGRA,

        WICBitmapDitherTypeNone,

        NULL,

        .f,

        WICBitmapPaletteTypeMedianCut

        );

}

9.最后,使用 CreateBitmapFromWicBitmap 方法创建 ID2D1Bitmap 对象,该对象可通过呈现器目标绘制并与其他 Direct2D 对象一起使用。

  if (SUCCEEDED(hr))

    {

        //create a Direct2D bitmap from the WIC bitmap.

        hr = pRenderTarget->CreateBitmapFromWicBitmap(

            pConverter,

            NULL,

            ppBitmap

            );

    }

    SafeRelease(&pDecoder);

    SafeRelease(&pSource);

    SafeRelease(&pStream);

    SafeRelease(&pConverter);

    SafeRelease(&pScaler);

    return hr;

}

10.创建工厂,开始初始化

HRESULT hr;

    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory);

    if (m_pWICFactory == NULL && SUCCEEDED(hr))
{
if (!SUCCEEDED(
CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&m_pWICFactory)
)
))
return FALSE;
} return hr;

11.创建位图

 HRESULT hr = S_OK;
// 创建位图
if (SUCCEEDED(hr))
{
LoadResourceBitmap(pTarget, m_pWICFactory, MAKEINTRESOURCEW(IDB_PNG1), L"PNG", , , &m_pBitmap);
} return hr;

12.开始画图

HRESULT hr;

    hr = CreateDeviceResources(pTarget);
if (SUCCEEDED(hr) && !(pTarget->CheckWindowState() & D2D1_WINDOW_STATE_OCCLUDED))
{ pTarget->SetTransform(D2D1::Matrix3x2F::Identity());
pTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); pTarget->DrawBitmap(
m_pBitmap,
D2D1::RectF(, ,
m_pBitmap->GetSize().width,
m_pBitmap->GetSize().height));
}
return hr;

13.在OnDraw2D()中创建Target并调用画图函数

  CRect  rect;
GetClientRect(&rect);
CHwndRenderTarget* m_pTarget = (CHwndRenderTarget*)lParam;
ID2D1HwndRenderTarget* m_pITarget = m_pTarget->GetHwndRenderTarget();
if (m_pITarget)
{
CreateDeviceIndependentResources();
OnRender(m_pITarget); }
return ;

14.PS:

Direct2D高版本与低版本不兼容,本人写的程序基于V7.x库,V8.0以上库不兼容(编程界的毒瘤)。

代码下载:点击下载

win32版本的代码请参考:http://www.cnblogs.com/Ray1024/p/6104368.html

Direct2D开发:MFC下从资源文件中加载位图的更多相关文章

  1. 下载某资源文件并加载其中的所有Prefab到场景中

    using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> / ...

  2. HTML页面处理以及资源文件的加载

    Javascript 异步加载详解 这篇文章很详细的介绍了HTML的页面处理以及资源文件的加载. 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading ...

  3. C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类

    在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...

  4. Django_在单独文件中加载Django环境临时调试

    创建Django环境后,每次在打印调试都需要基于项目有些麻烦. 如何在项目外的文件中加载项目环境进行便携的调试? 创建一个新的 orm.py import os if __name__ == '__m ...

  5. DirectUI界面编程(三)从XML文件中加载界面

    Duilib支持xml界面布局,使得界面设计与逻辑处理相分离,本节介绍如何从xml文件中加载界面元素. 我们需要以下几个步骤: 创建并初始化CPaintManagerUI对象. 创建CDialogBu ...

  6. 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...

  7. Android中加载位图的方法

    Android中加载位图的关键的代码: AssetManager assets =context.getAssets(); //用一个AssetManager 对象来从应用程序包的已编译资源中为工程加 ...

  8. vs下取得资源文件中的版本信息

    在Windows Mobile和Wince(Windows Embedded CE)下开发的产品,有时候需要显示当前产品的版本信息.一般来说,版本信息是保存在资源文件里面的,例如下图: 为了保持一致, ...

  9. java中根据key获取resource下properties资源文件中对应的参数

    properties资源文件是放在resource目录下的: 新建工具类: package com.demo.utils; import java.io.InputStream; import jav ...

随机推荐

  1. 在IIS中给某一个网站添加binding的坑

    以http为例, 假如ip地址从局域网的地址172.31.212.20改为127.0.0.1 但是网站没法访问了http://172.31.212.20/chile.backoffice/  必须通过 ...

  2. Mac OSX 平台安装 MongoDB

    Mac OSX 平台安装 MongoDB MongoDB 提供了 OSX 平台上 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download ...

  3. Sqoop 的优势

    1.sqoop可以高效的可控的利用资源,比如它可以通过调整任务数,来控制任务的并发度,另外还可以配置数据库的访问时间等等 2.sqoop能自动的完成数据类型的映射与转换 3.它支持多种数据库,比如my ...

  4. css3 实现加载滚动条效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 紫书 习题 10-16 UVa 1647 (高精度+递推)

    这道题我已经推出00和1过两步变成00了,可我没有继续做下去-- 后来看了博客发现自己已经做了90%了-- 可惜了,以后不要轻易放弃. 1的个数有个规律,就是每次都乘以2,因为0和1下一步都会变出1 ...

  6. 在hive执行创建表的命令,遇到异常com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes

    今天在练习hive的操作时,在创建数据表时,遇到了异常 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ex ...

  7. CSUOJ 1542 Flipping Parentheses

    ACM International Collegiate Programming Contest Asia Regional Contest, Tokyo, 2014–10–19 Problem G ...

  8. MySpring dataSource从配置文件获取

    大神就不看了.本篇是一个人笔记. 原来的数据库配置文件是写死的. 看代码:Mybatis的配置文件 <bean id="dataSource" class="org ...

  9. leetCode 82.Remove Duplicates from Sorted List II (删除排序链表的反复II) 解题思路和方法

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  10. ORA-06575: 程序包或函数 NO_VM_DROP_PROC 处于无效状态

    SQL> drop user aaa ;   drop user aaa   ORA-00604: 递归 SQL 级别 1 出现错误 ORA-06575: 程序包或函数 NO_VM_DROP_P ...