Direct2D 几何图形绘制基础
来源:互联网 发布:商品条形码数据库 编辑:程序博客网 时间:2024/04/29 22:35
之前说过,D2D主要为了绘制有三种类型的数据:几何图形,图片,文字。这几种对象也叫做资源,资源就是要D2D流水线中要被加工的对象。
几何图形包括:
- 简单几何图形
- 直线,DrawLine,由起点和终点构成,点用结构体:D2D1_POINT_2F描述。
- 矩形,ID2D1RectangleGeometry,DrawRectangle,由距四条边的距离表示,用结构体:D2D1_RECT_F描述。
- 圆角矩形,ID2D1RoundedRectangleGeometry ,DrawRoundedRectangle,同矩形,用结构体:D2D1_ROUNDED_RECT描述,另外还要加入圆角参数。
- 椭圆,包括圆,ID2D1EllipseGeometry ,DrawEllipse,用结构体:D2D1_ELLIPSE 描述。
- 路径,ID2D1PathGeometry
- 组合图形,
- 几何图形组合,ID2D1GeometryGroup
- 变幻几何图形,ID2D1TransformedGeometry
准备绘制:
在开始绘制之前,至少要准备好3样东西:
- D2D工厂对象,ID2D1Factory接口。用于创建绘制目标,用方法CreateHwndRenderTarget。
- 渲染窗口,ID2D1HwndRenderTarget接口。如果是Win32程序就是默认的HWND窗口,如果是商店应用则是一个绘制表面的控件。
渲染窗口同时还负责着绘制几何图形,文字和图片。 - 画刷,ID2D1SolidColorBrush接口。绘制几何图形时用于指定图形的样式。
- 绘制区域,如果是win32程序还需要指定渲染窗口中要绘制的区域。
首先要引入头文件和命名空间:
#include "windows.h"#include "D2D1.h"using namespace D2D1;
别忘了加要链接的Lib,要input的lib如下:
d2d1.lib;
dxgi.lib;
dwrite.lib;
dxguid.lib;
windowscodecs.lib;
// Direct2D factoryID2D1Factory* pD2DFactory; // Render targetID2D1HwndRenderTarget* pRenderTarget;// A black brush, reflect the line colorID2D1SolidColorBrush* pBlackBrush; // Render areaRECT rc ;初始化这些值的代码如下:
//create d2d factoryhr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory) ;//create render target (hwnd window)GetClientRect(hWnd, &rc);hr = pD2DFactory->CreateHwndRenderTarget( RenderTargetProperties(), HwndRenderTargetProperties(hWnd, SizeU(rc.right - rc.left, rc.bottom - rc.top)), &pRenderTarget);//create brushhr = pRenderTarget->CreateSolidColorBrush(ColorF(ColorF::Blue), &pBlackBrush);
然后就可以开始绘制了。笔者使用的程序是win32应用程序,绘制的代码都必须写在WndProc回调函数的case WM_PAINT:之后,并且要将所有绘制代码都包含在pRenderTarget->BeginDraw();和pRenderTarget->EndDraw();之间。例如:
pRenderTarget->BeginDraw();//clear screenpRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));//draw line with 2 pointsD2D1_POINT_2F ptStart = Point2F(0,0);D2D1_POINT_2F ptEnd = Point2F(100,100);pRenderTarget->DrawLine(ptStart,ptEnd,pBlackBrush);//draw rectangleD2D1_RECT_F rect = RectF(rc.left + 100.0f, rc.top + 100.0f, rc.right - 100.0f, rc.bottom - 100.0f);pRenderTarget->DrawRectangle(rect, pBlackBrush);//draw round rectD2D1_ROUNDED_RECT roundrect = RoundedRect(RectF(rc.left + 100.0f, rc.top + 100.0f, rc.right - 100.0f, rc.bottom - 100.0f), 30.0f, 50.0f);pRenderTarget->DrawRoundedRectangle(roundrect, pBlackBrush, 1.0f);pRenderTarget->EndDraw();
当然了,把代码都积压在WM_PAINT之后也太SB了,最好自己封装一个类,如下:
头文件如下:
#pragma once#include "stdafx.h"#include "windows.h"#include "D2D1.h"using namespace D2D1;class D2DRender{public:D2DRender(void);~D2DRender(void);HRESULT CreateDeviceIndependentResources();HRESULT CreateDeviceResources(HWND hWnd);void OnRender();void DiscardDeviceResources();void OnResize(UINT width, UINT height);private:// Direct2D factoryID2D1Factory* pD2DFactory; // Render targetID2D1HwndRenderTarget* pRenderTarget;// A black brush, reflect the line colorID2D1SolidColorBrush* pBlackBrush; // Render areaRECT rc ; //resultHRESULT hr;};实现如下:
#include "stdafx.h"#include "D2DRender.h"D2DRender::D2DRender(){// Direct2D factorypD2DFactory = NULL; // Render targetpRenderTarget = NULL;// A black brush, reflect the line colorpBlackBrush = NULL; }D2DRender::~D2DRender(){pD2DFactory->Release();pRenderTarget->Release();pBlackBrush->Release();}void D2DRender::DiscardDeviceResources(){pD2DFactory->Release();pRenderTarget->Release();pBlackBrush->Release();}void D2DRender::OnResize(UINT width, UINT height){if(pRenderTarget){pRenderTarget->Resize(SizeU(width,height));}}HRESULT D2DRender::CreateDeviceIndependentResources(){//create d2d factoryhr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory) ;return hr;}HRESULT D2DRender::CreateDeviceResources(HWND hWnd){//create render target (hwnd window)GetClientRect(hWnd, &rc);hr = pD2DFactory->CreateHwndRenderTarget( RenderTargetProperties(), HwndRenderTargetProperties(hWnd, SizeU(rc.right - rc.left, rc.bottom - rc.top)), &pRenderTarget);//create brushhr = pRenderTarget->CreateSolidColorBrush(ColorF(ColorF::Blue), &pBlackBrush);return hr;}void D2DRender::OnRender(){pRenderTarget->BeginDraw();//clear screenpRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));//draw line with 2 pointsD2D1_POINT_2F ptStart = Point2F(0,0);D2D1_POINT_2F ptEnd = Point2F(100,100);pRenderTarget->DrawLine(ptStart,ptEnd,pBlackBrush);//draw rectangleD2D1_RECT_F rect = RectF(rc.left + 100.0f, rc.top + 100.0f, rc.right - 100.0f, rc.bottom - 100.0f);pRenderTarget->DrawRectangle(rect, pBlackBrush);//draw round rectD2D1_ROUNDED_RECT roundrect = RoundedRect(RectF(rc.left + 100.0f, rc.top + 100.0f, rc.right - 100.0f, rc.bottom - 100.0f), 30.0f, 50.0f);pRenderTarget->DrawRoundedRectangle(roundrect, pBlackBrush, 1.0f);pRenderTarget->EndDraw();}
然后在WM_PANIT里调用,默认生成的gdi绘制用到的hdc相关代码可以删掉。
case WM_PAINT://hdc = BeginPaint(hWnd, &ps);D2DRender pRender;pRender.CreateDeviceIndependentResources();pRender.CreateDeviceResources(hWnd);pRender.OnRender();//EndPaint(hWnd, &ps);break;
还是比较简单。
- Direct2D 几何图形绘制基础
- Direct2D 几何图形
- 绘制几何图形
- 绘制几何图形
- Direct2D教程(三)简单几何图形
- Android 自定义控件之基础几何图形绘制详解
- Direct2D WIC绘制图片
- Direct2D DirectWrite绘制文字
- 第二课,绘制几何图形
- 第二课,绘制几何图形
- OpenGL 绘制几何图形
- OpenGL 绘制几何图形
- Canvas上绘制几何图形
- Android绘制几何图形
- 使用Canvas绘制几何图形
- 使用Canvas绘制几何图形
- android绘制几何图形
- Canvas类绘制几何图形
- Error: ORA-04062: timestamp of procedure has been changed
- C++库研究笔记——Linux 下高精度计时器
- 优先队列相关知识
- 匿名类
- 管理者的减负之道
- Direct2D 几何图形绘制基础
- Windows Message Queue((hdu1509))基础题
- Android自定义Button按钮显示样式
- hdu4006(优先队列)
- 有序链表和并的递归写法和非递归写法(c语言)
- 理解kobeject
- 那些年,写过的代码
- linux之creat函数解析
- Android访问https服务