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