Direct2D中的2D显示

来源:互联网 发布:推荐等身大抱枕淘宝店 编辑:程序博客网 时间:2024/05/29 13:36

Dx11中的2D显示抛弃了Dx8和Dx9中的 ID3DxSprite 绘制精灵,也出乎意料的(出乎我的意料 :) )没有采用顶点方式而是返璞归真走向了表面。现在的Direct2D更像是GDI了~~~

 DX11上Direct2D的第一个例题就是绘制一个笔刷~~这在原来是不可能实现的;原来的ID3DxSprite 只能够绘制基于纹理的格式,比如我们要做一个效果,当选中一个Button的时候,这个Button边界线会高亮显示,这在原来必须依靠制作这样的纹理来实现,现在不同了,你可以定义一个线条笔刷,给他个范围,画一个矩形就完成了!~~

Creating a Simple Direct2D Application

 

这个立体绘制了一个矩形框,一个蓝色填充的矩形和网格的背景;这些都是Direct2D自己绘制的,没有用任何的纹理。 

我们这个程序使用的是一个标准的Win32API程序,和微软标准的例题不一样,要比那个简单。

1)头文件

// Windows Header Files:  #pragma once  // Windows 头文件:  #include <windows.h>  #include <tchar.h>  
这几个头文件是win32平台必须的头文件,外加Dx11的2D头文件,这里不用倒入Dx11的头文件,因为Direct2D和Dx11的3D库是相对独立的。

#include <d2d1.h>

与之相关的lib库是D2d1.lib,它的名字是D2d1,估计也是尝试性的一个库,以后还会出D2d2,D2d3.....

//-----------------全局变量------------------------------  HINSTANCE                   hInst;                // 当前实例  ID2D1Factory*               pD2DFactory = NULL;   // 2D工厂   ID2D1SolidColorBrush*       pBlackBrush = NULL;   // 实例笔刷  ID2D1HwndRenderTarget*      m_pRenderTarget = NULL; // 渲染面  

创建一个函数,初始化2D环境

LRESULT InItD2D(HWND hWnd)    {   //创建一个单线程irect2D资源指针   HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,&pD2DFactory);     // Obtain the size of the drawing area.   GetClientRect(hWnd, &rc);   // Create a Direct2D render target      //   根据窗口大小生成一个渲染表面   hr = pD2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),              D2D1::HwndRenderTargetProperties(hWnd,D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)),              &m_pRenderTarget);       //  在表面上加入3个笔刷      if (SUCCEEDED(hr))   {     m_pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::SteelBlue),&pBlackBrush);      m_pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Gray),&pSteelBlueBrush);      m_pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::GreenYellow),&pGreenBrush);  }     return hr;  } 

生成笔刷以后,就可以绘制表面了

VOID Rander()  {   if(!m_pRenderTarget)    return ;   m_pRenderTarget->BeginDraw();   m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());     m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));     // Draw a grid background     for (int x = 0; x < width; x += 10)   {   //画格子线    m_pRenderTarget->DrawLine(     D2D1::Point2F(static_cast<FLOAT>(x), 0.0f),     D2D1::Point2F(static_cast<FLOAT>(x), height),     pGreenBrush,     0.5f     );   }     for (int y = 0; y < height; y += 10)   {    m_pRenderTarget->DrawLine(     D2D1::Point2F(0.0f, static_cast<FLOAT>(y)),     D2D1::Point2F(width, static_cast<FLOAT>(y)),     pGreenBrush,     0.5f     );   }     // 画矩形线框   m_pRenderTarget->DrawRectangle( D2D1::RectF(rc.left + 200.0f,rc.top + 200.0f,rc.right - 200.0f,rc.bottom - 200.0f), pSteelBlueBrush);     // 画矩形区域   m_pRenderTarget->FillRectangle( D2D1::RectF(rc.left + 300.0f,rc.top + 300.0f,rc.right - 300.0f,rc.bottom - 300.0f), pBlackBrush);     m_pRenderTarget->EndDraw();  }