Direct2D快速入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q158805972/article/details/47681015

Direct2D QuickStart

Direct2d是原生 代码, 即时模式 API 为了创建 2D 图像。

 

·        Drawing a SimpleRectangle

·        Step 1: IncludeDirect2D Header

·        Step 2: Createan ID2D1Factory

·        Step 3: Createan ID2D1HwndRenderTarget

·        Step 4: Create aBrush

·        Step 5: Draw theRectangle

·        Step 6: ReleaseResources

·        Create a SimpleDirect2D Application

·        Related topics

 

Drawing a Simple Rectangle

画一个矩形 使用GDI, 你可以 处理WM_PAINT message, as shown in the following code.

C++

 

 

switch(message)

{

 

    case WM_PAINT:

       {

           PAINTSTRUCT ps;

           BeginPaint(hwnd, &ps);

 

           // Obtain the size ofthe drawing area.

           RECT rc;

           GetClientRect(

               hwnd,

                &rc

           );                           

 

           // Save the originalobject

           HGDIOBJ original = NULL;

           original = SelectObject(

                ps.hdc,

                GetStockObject(DC_PEN)

           );

 

           // Create a pen.           

           HPEN blackPen = CreatePen(PS_SOLID, 3, 0);

 

           // Select the pen.

           SelectObject(ps.hdc, blackPen);

 

           // Draw a rectangle.

           Rectangle(

                ps.hdc,

                rc.left + 100,

                rc.top + 100,

                rc.right - 100,

                rc.bottom - 100);       

 

           DeleteObject(blackPen);

 

           // Restore theoriginal object

           SelectObject(ps.hdc, original);

 

           EndPaint(hwnd, &ps);

       }

       return 0;

 

// Code for handling other messages.

使用Direct2D 绘制是相同的,。

 

Step 1: Include Direct2D Header

included2d1.h 头文件

 

Step 2: Create an ID2D1Factory

创建ID2D1Factory.

ID2D1Factory* pD2DFactory =NULL;

HRESULT hr =D2D1CreateFactory(

    D2D1_FACTORY_TYPE_SINGLE_THREADED,

    &pD2DFactory

    );

ID2D1Factory 接口是使用direct2D 的起点。 使用ID2D1Factory 创建Direct2D 资源。

本例子创建的是 单线程 的 Factory

一般来说,你的程序一旦创建工厂 并留住它为程序的生命。

Step 3: Create an ID2D1HwndRenderTarget

在你创建工厂之后,使用 它 去 创建 渲染目标。

// Obtain the size of the drawing area.

RECT rc;

GetClientRect(hwnd, &rc);

 

// Create a Direct2D render target              

ID2D1HwndRenderTarget* pRT = NULL;            

HRESULT hr =pD2DFactory->CreateHwndRenderTarget(

   D2D1::RenderTargetProperties(),

   D2D1::HwndRenderTargetProperties(

        hwnd,

       D2D1::SizeU(

           rc.right - rc.left,

           rc.bottom - rc.top)

    ),

    &pRT

);

 

前面的示例使用ID2D1HwndRenderTarget,呈现到屏幕的部分。

对你可以修改该 行为  使用 D2D1_RENDER_TARGET_TYPE 标记当你创建 渲染目标时。

 

CreateHwndRenderTarget 方法带着3参数。  

第一个参数D2D1_RENDER_TARGET_PROPERTIES 结构体。指定远程显示项目,是否强制渲染目标渲染软件或硬件, DPI代码在该例子使用D2D1::RenderTargetProperties帮助函数同意默认的渲染目标properties

 

第二个参数 ,  D2D1_HWND_RENDER_TARGET_PROPERTIES 结构体 指定 HWND ,给 渲染 内容 指定 HWDN 。 初始化 渲染目标 的大小(像素) ,它是 presentationoptions

本范例使用D2D1::HwndRenderTargetProperties  helper 函数  去指定一个HWDN,和初始化大小。

它是使用默认的呈现 选项。

 

第三个参数是  一个  指向  接收 渲染目标 引用 的指针的地址。

 

当你创建一个渲染目标和可用的硬件加速。你分配资源 在电脑的GPU 上。 使用创建 一次 渲染目标 和 尽可能保留它。 你获得性能上的优势。你的程序应该一次过 创建 渲染目标 并 保持 它们 为了 程序的生命, 或 直到 D2DERR_RECREATE_TARGET  收到错误。

当你收到该错误时, 你需要 重新创建 渲染目标(和它创建的 所有资源)。

 

Step 4: Create a Brush

就如  一个factory , 渲染 目标 可以创建 drawing 资源。 在本例子 ,渲染目标创建 一个画刷。


ID2D1SolidColorBrush* pBlackBrush = NULL;

if(SUCCEEDED(hr))

{

               

   pRT->CreateSolidColorBrush(

       D2D1::ColorF(D2D1::ColorF::Black),

       &pBlackBrush

        );

}

 

Direct2D同样提供了 其他 类型的画刷: 渐变的画刷 为了 画 线性或呈放射状的 渐变,

和 bitmap 画刷 为了使用 位图s 和样式 去画 。

 

一些绘图APIs 提供 钢笔绘制轮廓和画笔填充形状。 Direct2D是不同的:它不提供pen 对象使用画笔绘制轮廓和填充形状。 绘制轮廓时 ,使用 画笔ID2D1StrokeStyle接口控制路径stroking操作。

 

画笔只能用于创建它的 渲染目标,创建它 和 使用其他的渲染目标在同一个 资源域。

一般来说,你应该仅需创建一次画刷,和 保留他们为了创建它们的 渲染目标的生命,

ID2D1SolidColorBrush 是唯一的 异常;

因为它 是相当 廉价 去创建,当你想 画 一帧 时 你可以创建ID2D1SolidColorBrush 

没有任何显著的 优化 命中。每次你需要用它的时 你同样可以使用 单一的ID2D1SolidColorBrush 并 只是 改变它的 颜色。

猜你喜欢

转载自blog.csdn.net/q158805972/article/details/47681015