创建ID2D1RenderTarget遇编译错误(Direct2D新手求助)
解决Direct2D外部函数创建HwndRenderTarget的编译错误
嘿,我帮你定位到问题所在了!你遇到的编译错误是两个类型不匹配的小问题导致的,咱们一步步来解决:
问题1:RenderTarget参数类型不兼容
你在test函数里定义的参数ID2D1RenderTarget* rendertarget和CreateHwndRenderTarget要求的输出类型不匹配:
CreateHwndRenderTarget的第三个参数需要**ID2D1HwndRenderTarget****类型(指向渲染目标指针的指针)- 你当前传入的
&rendertarget是ID2D1RenderTarget**类型,和函数要求的类型不兼容,这会让编译器找不到正确的重载函数,进而误报参数1的转换错误
问题2:全局变量的不必要传参
你的全局变量rendertarget已经是ID2D1HwndRenderTarget*类型,不需要再把它作为test函数的参数传入。如果一定要通过参数传递,应该传递指针的指针(ID2D1HwndRenderTarget**),而不是普通指针。
修正后的test函数代码
void test(ID2D1Factory* factory, HWND hwnd) { RECT rc; GetClientRect(hwnd, &rc); D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top); // 直接使用全局的rendertarget指针,类型完全匹配 HRESULT hr = factory->CreateHwndRenderTarget( D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(hwnd, size), &rendertarget); // 建议添加错误检查,方便调试运行时问题 if (FAILED(hr)) { // 这里可以添加错误处理逻辑,比如输出错误码提示 } }
额外优化建议
- 添加错误检查:在创建Direct2D对象的步骤中加入
FAILED(hr)判断,能帮你快速定位运行时的资源创建失败问题 - 减少全局变量依赖:全局变量不利于代码维护,建议把
factory和rendertarget封装到类或结构体中,通过参数传递管理 - 资源清理:程序退出时记得释放Direct2D对象,避免内存泄漏,可在
WM_DESTROY消息中添加:
if (rendertarget) rendertarget->Release(); if (factory) factory->Release();
内容的提问来源于stack exchange,提问作者Olexy
相关产品推荐
相关产品推荐

