使用 ID2D1Device3 的 direct2d 快速入门

Posted

技术标签:

【中文标题】使用 ID2D1Device3 的 direct2d 快速入门【英文标题】:direct2d quickstart with ID2D1Device3 【发布时间】:2021-11-13 01:15:41 【问题描述】:

本教程是否有在任何地方使用 ID2D1Device3 的版本? 只是换掉所有的指针类型似乎不起作用

https://docs.microsoft.com/en-us/windows/win32/direct2d/direct2d-quickstart-with-device-context?redirectedfrom=MSDN 由于参数列表不匹配,此尝试在工厂失败->CreateDevice:

Microsoft::WRL::ComPtr<ID2D1DeviceContext3> devCon3;
Microsoft::WRL::ComPtr<IDXGIAdapter> dxgiAdapter;
Microsoft::WRL::ComPtr<ID2D1Factory3> factory;  
Microsoft::WRL::ComPtr<IDXGIFactory> dxgiFactory;
Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
Microsoft::WRL::ComPtr<ID3D11Device> dev;
Microsoft::WRL::ComPtr<ID3D11DeviceContext> devCon;
Microsoft::WRL::ComPtr<ID2D1Device3> dev3d; 
D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, 0, createDeviceFlags, NULL, 0, D3D11_SDK_VERSION, &dev, &featureLevel, &devCon);
Hres = dev.As(&dxgiDevice);
Hres = dxgiDevice->GetAdapter(dxgiAdapter.GetAddressOf());
Hres = dxgiAdapter->GetParent(__uuidof(IDXGIFactory), &dxgiFactory);
Hres = dxgiFactory->CreateSwapChain(dev.Get(), &scd, swapChain.GetAddressOf());
Hres = (D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, __uuidof(ID2D1Factory3), &options, &factory));
Hres =  (dev3d.Get()->QueryInterface(__uuidof(IDXGIDevice), &dxgiDevice));
Hres = factory->CreateDevice(dxgiDevice.Get(), &dev3d) ;
Hres = dev3d->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS, &devCon3);

【问题讨论】:

在 C++ 中,ID2D1Device3 引用 ID2D1Device 引用。或者显示一些代码、错误、你使用的编译器、重现项目等。 是的,MSDN 这么说,但它不起作用。添加了代码。 【参考方案1】:

您必须先获得一个 ID2D1Device2,然后再获得QueryInterface。使用 WRL 助手,这将是类似于以下的代码:

Microsoft::WRL::ComPtr<ID2D1Device2> dev2;
Hres = factory->CreateDevice(dxgiDevice.Get(), &dev2);

Microsoft::WRL::ComPtr<ID2D1Device3> dev3;
Hres = dev2.As(&dev3); // does QueryInterface

【讨论】:

OK 看起来我明白了,屏幕上显示了一些东西。快乐的时光。谢谢, 替代方案是使用 ID2D1Factory4 @bunglehead - 当然,但我坚持使用问题中的类型。 当然可以,这样也好。我的观点是,如果某些东西依赖于可用的 ID2D1Device3,它还不如使用更新的工厂接口,它也将可用。

以上是关于使用 ID2D1Device3 的 direct2d 快速入门的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用 Direct2D 实现斜角效果

在 WinForm 中使用 Direct2D

使用 Direct2D 和 DirectWrite(C++、DirectX)制作按钮

Direct2D 第6篇 绘制多种风格的线条

Direct2D坐标错误

如何使用 Direct2D 从窗口中获取像素