Direct2D中的2D显示

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();  
}  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值