使用 devc++ 开发 easyx 实现 Direct2D 交互

代码为 codebus 另一先生的 文案 EasyX 的三种绘图抗锯齿方法 - CodeBus

这里移植到 devc++

移植操作如下:

调用dev++ 的链接库方式:

project -> project option -> 如图所示

稍作修改的代码。

cpp 复制代码
#include <graphics.h>
#include <d2d1.h>
#include <wincodec.h>

#include <stdio.h>

#pragma comment(lib, "d2d1.lib")
#pragma comment(lib, "dwrite.lib")

// D2D 对象的安全释放
template <class T> void DxObjectSafeRelease(T** ppT)
{
	if (*ppT)
	{
		(*ppT)->Release();
		*ppT = NULL;
	}
}

int main()
{
	// 创建 EasyX 窗口
	initgraph(340, 206);
	SetWindowText(GetHWnd(), "D2D 硬件加速抗锯齿演示");

	setlinestyle(PS_SOLID, 2);

	// 创建 D2D 工厂
	ID2D1Factory* Facotry = NULL;
	HRESULT ResultHandle = D2D1CreateFactory(
		D2D1_FACTORY_TYPE_SINGLE_THREADED,
		&Facotry
	);

	// 创建 DC Render 并指定硬件加速
	auto Property = D2D1::RenderTargetProperties(
		D2D1_RENDER_TARGET_TYPE::D2D1_RENDER_TARGET_TYPE_HARDWARE,
		D2D1::PixelFormat(
			DXGI_FORMAT_B8G8R8A8_UNORM,
			D2D1_ALPHA_MODE_IGNORE
		), 0.0, 0.0, D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, D2D1_FEATURE_LEVEL_DEFAULT
	);

	// 创建 EasyX 兼容的 DC Render Target
	ID2D1DCRenderTarget* DCRenderTarget;
	HRESULT Result = Facotry->CreateDCRenderTarget(
		&Property,
		&DCRenderTarget
	);

	// 绑定 EasyX DC
	RECT EasyXWindowRect = { 0, 0, 640, 480 };
	DCRenderTarget->BindDC(GetImageHDC(), &EasyXWindowRect);

	if (FAILED(Result))
	{
		printf("D2D Facotry Created Failed\n");

		return -1;
	}

	// 创建画笔
	ID2D1SolidColorBrush* WhiteBrush = NULL;
	DCRenderTarget->CreateSolidColorBrush(
		D2D1::ColorF(D2D1::ColorF::White),
		&WhiteBrush
	);

	if (!WhiteBrush)
	{
		printf("D2D Brush Created Failed\n");

		return -1;
	}

	BeginBatchDraw();

	// 设置抗锯齿
	DCRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE::D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);

	// 调用 D2D 进行绘图
	DCRenderTarget->BeginDraw();

	DCRenderTarget->Clear(D2D_COLOR_F(D3DCOLORVALUE{ 0, 0, 0 }));
	DCRenderTarget->DrawLine(D2D1_POINT_2F{ 200, 0 }, D2D1_POINT_2F{ 280, 80 }, WhiteBrush, 2.f);
	DCRenderTarget->DrawEllipse(D2D1_ELLIPSE{ D2D1_POINT_2F{ 240, 140 }, 40, 40 }, WhiteBrush, 2.f);

	DCRenderTarget->EndDraw();

	// EasyX 对比绘图
	line(0, 0, 80, 80);
	ellipse(0, 100, 80, 180);

	outtextxy(0, 80, "无抗锯齿画线");
	outtextxy(165, 80, "D2D 硬件加速抗锯齿画线");

	outtextxy(0, 184, "无抗锯齿画圆");
	outtextxy(165, 184, "D2D 硬件加速抗锯齿画圆");

	// 以约为 60fps 的帧率更新界面
	while (true)
	{
		FlushBatchDraw();

		Sleep(14);
	}

	EndBatchDraw();

	// 释放 D2D 对象
	DxObjectSafeRelease(&DCRenderTarget);
	DxObjectSafeRelease(&WhiteBrush);
	DxObjectSafeRelease(&Facotry);

	return 0;
}
相关推荐
Kisorge1 小时前
【电机控制】基于STM32F103C8T6的二轮平衡车设计——LQR线性二次线控制器(算法篇)
stm32·嵌入式硬件·算法
铭哥的编程日记2 小时前
深入浅出蓝桥杯:算法基础概念与实战应用(二)基础算法(下)
算法·职场和发展·蓝桥杯
Swift社区2 小时前
LeetCode 421 - 数组中两个数的最大异或值
算法·leetcode·职场和发展
cici158742 小时前
基于高光谱成像和偏最小二乘法(PLS)的苹果糖度检测MATLAB实现
算法·matlab·最小二乘法
StarPrayers.3 小时前
自蒸馏学习方法
人工智能·算法·学习方法
大锦终3 小时前
【动规】背包问题
c++·算法·动态规划
智者知已应修善业4 小时前
【c语言蓝桥杯计算卡片题】2023-2-12
c语言·c++·经验分享·笔记·算法·蓝桥杯
hansang_IR4 小时前
【题解】洛谷 P2330 [SCOI2005] 繁忙的都市 [生成树]
c++·算法·最小生成树
Croa-vo5 小时前
PayPal OA 全流程复盘|题型体验 + 成绩反馈 + 通关经验
数据结构·经验分享·算法·面试·职场和发展
AndrewHZ5 小时前
【图像处理基石】 怎么让图片变成波普风?
图像处理·算法·计算机视觉·风格迁移·cv