C++ Direct2D绘图、winapi创建窗口初探

1、

什么是Direct2D

一言以蔽之,就是Windows 7平台上的一个2D图形API,可以提供高性能,高质量的2D渲染。比直接使用WINDOWSAPI会先进和轻松一些。

D2D的架构

Direct2D是基于Direct3D 10.1 API构建的,这意味着Direct2D可以使用硬件加速,下图是Direct2D与Direct3D的一个关系图

由上图可以看出,Direct2D还自带了一个软件实现(Software rasterizer),这是因为如果显卡不支持硬件加速,那么Direct2D可以使用软件方式渲染,即使这样,效果还是要优于GDI的

测试代码:


/*
配置:C++附加包含目录D:\Windows Kits\10\Include\10.0.17763.0\um(D2d1.h
附加库目录D:\Windows Kits\10\Lib\10.0.17134.0\um\x86 (D2d1.lib
附加依赖项:D2d1.lib
子系统:窗口(/ SUBSYSTEM:WINDOWS) 
*/

#include <windows.h>
#include <D2D1.h>
#include <dwrite.h>//dwrite,DirectWrite实际上已经是一个独立的DirectX组件了 需要连接器输入lib
#define SAFE_RELEASE(P) if(P){P->Release() ; P = NULL ;}

ID2D1Factory*			g_pD2DFactory = NULL;	// Direct2D factory
ID2D1HwndRenderTarget*	g_pRenderTarget = NULL;	// Render target
ID2D1SolidColorBrush*	g_pBlackBrush = NULL;	// A black brush, reflect the line color
IDWriteFactory* g_pDWriteFactory = NULL;


VOID CreateD2DResource(HWND hWnd)
{
	if (!g_pRenderTarget)
	{
		HRESULT hr;
		//创建工厂 凭空创造  不需要对象 直接产生一个工厂
		hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &g_pD2DFactory);
		if (FAILED(hr))
		{
			MessageBox(hWnd, "Create D2D factory failed!", "Error", 0);
			return;
		}

		// Obtain the size of the drawing area
		RECT rc;
		GetClientRect(hWnd, &rc);

		// Create a Direct2D render target
		//通过工厂创建RenderTarget渲染对象
		hr = g_pD2DFactory->CreateHwndRenderTarget(
			D2D1::RenderTargetProperties(),
			D2D1::HwndRenderTargetProperties(
				hWnd,
				D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)
			),
			&g_pRenderTarget
		);
		if (FAILED(hr))
		{
			MessageBox(hWnd, "Create render target failed!", "Error", 0);
			return;
		}

		// Create a brush
		//通过渲染对象发 创建一个固定颜色的画刷
		hr = g_pRenderTarget->CreateSolidColorBrush(
			D2D1::ColorF(D2D1::ColorF::RoyalBlue),
			&g_pBlackBrush
		);
		if (FAILED(hr))
		{
			MessageBox(hWnd, "Create brush failed!", "Error", 0);
			return;
		}
	}
}
/*D2D1_COLOR_F使用sRGB编码,红色,绿色,蓝色以及Alpha(透明值)。范围是0.0-1.0。数值越大表示颜色越深,
0.0表示无此颜色,1.0表示满色。对于Alpha(透明值),0.0表示完全透明,1.0表示完全不透明*/

VOID DrawRectangle(HWND hwnd)
{
	CreateD2DResource(hwnd);
	//绘制的代码要放在BeginDraw和EndDraw函数之间
	g_pRenderTarget->BeginDraw();
	//调用Clear函数可以将Render target清除为指定的背景色
	// Clear background color to Whit
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值