转载请注明出处: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. ant安装配置问题:ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.

    项目用到ant 1.去官网下载:http://ant.apache.org/bindownload.cgi 2.解压至安装C盘 3.设置ANT_HOME.PATh.CLASSPATH ANT_HOME ...

  2. webpack02

    consumer-index.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  3. C# textBox控件只允许为数字和小数点并且提取出这个数字

    一. textBox控件实现只允许为数字和小数点 如下图所示,在textBox控件框内输入只能是 要在textBox控件属性设置按键按下的事件触发,如下图所示: 二.源代码 textBox控件只允许为 ...

  4. Safe and efficient allocation of memory

    Aspects of the present invention are directed at centrally managing the allocation of memory to exec ...

  5. 洛谷 P1239 计数器

    P1239 计数器 题目描述 一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是0005,只是5. 输入输出格式 ...

  6. 记VS2008初始化Microsoft Visual Sourcesafe源码管理提供程序时失败

    之前vs2008开发一直都好好,不知道为什么如今的vs2008打开和关闭都老是弹出这这个初始化Microsoft Visual Sourcesafe源码管理提供程序时失败的错误 解决方法非常easy: ...

  7. eXtremeDB相关问题解答(3)

    > 1.         Could our database support multi-database under one single instance? >   > 2. ...

  8. cocos2d-x的声音控制

    声音控制SimpleAudioEngine是单例.下面是其方法. [cpp] view plaincopy //获得SimpleAudioEngine的实例 static SimpleAudioEng ...

  9. 深入理解 GRE tunnel

    深入理解 GRE tunnel 时间 2012-11-08 19:05:22  A Geek's Page 原文  http://wangcong.org/blog/archives/2149 主题  ...

  10. Onvif开发之服务端成功对接Rtsp视频流篇

    前面篇介绍onvif服务端的发现功能,继续在之前的代码基础上完成一个RTSP流的工作,也就是客户端通过ONVIF协议来预览设备端在这个之前必须确定几个简单的条件1 设备端能被发现2 设备端支持RTSP ...