当前位置: 首页 > news >正文

Direct2D 极速教程(3) —— 画动态淳平

淳平接受采访

极速导航

    • 创建新项目:003-DrawDynamicJunpei
    • 画动态淳平

创建新项目:003-DrawDynamicJunpei


新建项目 “003-DrawDynamicJunpei”,将上面的 " 淳平接受采访.gif " 添加进上面文件夹即可。


在这里插入图片描述
在这里插入图片描述


画动态淳平


#include<Windows.h>
#include<wincodec.h>
#include<wrl.h>
#include<d2d1.h>
#include<vector>

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

using namespace Microsoft::WRL;

LRESULT CALLBACK callBackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

ComPtr<ID2D1Factory> m_D2DFactory;				// D2D 工厂
ComPtr<ID2D1HwndRenderTarget> m_RenderTarget;	// 窗口渲染目标
ComPtr<ID2D1SolidColorBrush> m_Brush;			// 纯色画刷
ComPtr<ID2D1Bitmap> m_Bitmap;					// D2D 位图

ComPtr<IWICImagingFactory> m_WICFactory;		// WIC 工厂
ComPtr<IWICBitmapDecoder> m_BitmapDecoder;		// 位图解码器
ComPtr<IWICBitmapFrameDecode> m_DecodeFrame;	// 位图解码帧
ComPtr<IWICFormatConverter> m_Converter;		// 位图转换器

UINT FrameCount = 0;	// 图片帧数
UINT NowPlayFrame = 0;	// 当前播放帧

const UINT width = 1080;
const UINT height = 720;

D2D1_RECT_F rect = {};

std::vector<ComPtr<ID2D1Bitmap>> bitmaps;	// 图片集合

int WINAPI WinMain(HINSTANCE hins, HINSTANCE hPrev, LPSTR lpstr, int cmdShow)
{
	WNDCLASS wc = {};
	wc.hInstance = hins;
	wc.lpszClassName = L"D2D";
	wc.lpfnWndProc = callBackFunc;
	wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);

	RegisterClass(&wc);

	HWND hwnd = CreateWindow(wc.lpszClassName, L"淳平", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hins, NULL);

	MSG msg = {};
	while (GetMessage(&msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}


LRESULT CALLBACK callBackFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
	case WM_CREATE: {	// 在这里创建 D2D 设备

		CoInitialize(nullptr);

		// 创建 D2D 工厂
		D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, m_D2DFactory.GetAddressOf());

		D2D1_RENDER_TARGET_PROPERTIES properties = D2D1::RenderTargetProperties();

		RECT rc = {};
		GetClientRect(hwnd, &rc);

		rect = D2D1::Rect(rc.left, rc.top, rc.right, rc.bottom);
		
		D2D1_HWND_RENDER_TARGET_PROPERTIES Hwndproperties = {};
		Hwndproperties.hwnd = hwnd;											// 窗口句柄
		Hwndproperties.pixelSize.width = rc.right - rc.left;				// 渲染目标宽度
		Hwndproperties.pixelSize.height = rc.bottom - rc.top;				// 渲染目标高度
		Hwndproperties.presentOptions = D2D1_PRESENT_OPTIONS_NONE;			// 自动选择呈现模式

		// 创建窗口渲染目标
		m_D2DFactory->CreateHwndRenderTarget(properties, Hwndproperties, &m_RenderTarget);

		

		// 创建纯色画刷
		m_RenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Blue), &m_Brush);


		// 创建 WIC 工厂
		CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_WICFactory));

		// 读取图片数据并创建解码器
		m_WICFactory->CreateDecoderFromFilename(L"淳平接受采访.gif", nullptr, GENERIC_READ,
			WICDecodeMetadataCacheOnDemand, &m_BitmapDecoder);

		// 读取图片数量
		m_BitmapDecoder->GetFrameCount(&FrameCount);

		// 一页一页,这样就和普通的图片没区别了
		for (UINT i = 0; i < FrameCount; i++)
		{
			// 获取每一帧图片
			m_BitmapDecoder->GetFrame(i, &m_DecodeFrame);

			// 创建转换器
			m_WICFactory->CreateFormatConverter(&m_Converter);

			// 将图片进行转换,注意 D2D 位图格式都是 GUID_WICPixelFormat32bppPBGRA
			m_Converter->Initialize(m_DecodeFrame.Get(), GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone,
				nullptr, 0, WICBitmapPaletteTypeCustom);

			// 将 WIC 位图转换成 D2D 位图
			m_RenderTarget->CreateBitmapFromWicBitmap(m_Converter.Get(), &m_Bitmap);

			// 把转换后的每一帧位图都加进 vector 里
			bitmaps.push_back(m_Bitmap);
		}

	} break;

	case WM_PAINT: {	// 在这里进行绘制操作

		m_RenderTarget->BeginDraw();

		// 一个一个一个一个一个读啊,啊啊啊啊啊啊啊啊啊啊啊啊啊
		m_RenderTarget->DrawBitmap(bitmaps[NowPlayFrame].Get(), rect);

		m_RenderTarget->EndDraw();

		Sleep(60);

		NowPlayFrame++;
		NowPlayFrame %= FrameCount;

	} break;

	case WM_DESTROY: {
		PostQuitMessage(0);
	} break;

	default: return DefWindowProc(hwnd, msg, wParam, lParam);
	}

	return 0;
}

相关文章:

  • STM32F030通过DMA方式读取ADC及芯片内部温度程序
  • 基于srpingboot高校智慧校园教学管理服务平台的设计与实现(源码+文档+部署讲解)
  • 折叠树展示树状层级数据
  • WEB安全--SQL注入--DNSlog外带
  • c# 正则表达式基础知识
  • Hard Disk Sentinel:您的硬盘健康“全科医生”,守护数据安全的智能管家
  • STT-MRAM CIM 赋能边缘 AI:高性能噪声鲁棒贝叶斯神经网络宏架构详解
  • 进行交通流预测,使用KAN+Transformer模型
  • 好的服务设计怎么做?15个原则.服务的归一化设计原则是什么?
  • VMware Tools 安装详细教程(Ubuntu 虚拟机)
  • 堆(heap)
  • Shell 语法基础学习(二)
  • vue 获取当前时间并自动刷新
  • 解决 ECharts 切换图表时的 Resize 问题
  • STL---set常用函数
  • c语言笔记 结构体基础
  • QT QML实现音频波形图进度条,可点击定位或拖动进度
  • 单目3d detection算法记录
  • 24集《不负美食不负卿》联合出品制作签约仪式成功举行
  • 【运维自动化-标准运维】如何实现一个最简单的流程编排
  • 图忆|红场阅兵:俄罗斯30年来的卫国战争胜利日阅兵式
  • 丰田汽车:美国关税或导致4、5月损失1800亿日元,新财年净利润下滑三成
  • 明查|这是“C919迫降在农田”?实为飞机模型将用于科普体验
  • 两国战机均未侵入对方领空,巴方公布对印回击细节
  • 国新办将于5月8日10时就《民营经济促进法》有关情况举行新闻发布会
  • 消费者在天猫一旗舰店换手机电池疑遭套路致手机损坏,平台已介入