当前位置: 首页 > 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_WICPixelFormat32bppPBGRAm_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;
}

http://www.mrgr.cn/news/94972.html

相关文章:

  • LeetCode[42] 接雨水
  • Opencv之计算机视觉一
  • 《深度学习》—— 模型部署
  • 导出的使用
  • PHP转GO Go语言环境搭建(Day1) 常见问题及解决方案指南
  • 8. Merge Sorted Array
  • 【数据结构】LinkedList与链表(1) + 经典面试OJ题解析 —— 有码有图有真相
  • Mysql:关于命名
  • 五、面向对象
  • 大模型知识蒸馏:技术演进与未来展望
  • Pydoll:告别WebDriver!Python异步Web自动化测试工具
  • Linux上的`i2c-tools`工具集的详细介绍;并利用它操作IMX6ULL的I2C控制器进而控制芯片AP3216C读取光照值和距离值
  • 使用Azure CDN进行子域名接管
  • 网络爬虫【爬虫库urllib】
  • 前端剪贴板操作:从传统方法到现代方案
  • 3D标定中的平面约束-平面方程的几何意义
  • OpenHarmony 开源鸿蒙北向开发——hdc工具安装
  • 自动驾驶背后的数学:特征提取中的线性变换与非线性激活
  • 搞定python之九----常用内置模块
  • 1~2 课程简介+ESP32-IDF环境搭建(虚拟机Linux环境下)