问题描述
我正在尝试使用 D2D1 清除使用 CreateWindowEx
创建的窗口的背景,并将代码分成单独的类。这是代码。
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WParaM wparam,LParaM lparam) {
switch (msg) {
case WM_PAINT:
graphics->BeginDraw();
graphics->EndDraw();
break;
case WM_CREATE:
window->onCreate();
break;
case WM_DESTROY:
window->onDestroy();
::PostQuitMessage(0);
break;
default:
return ::DefWindowProc(hwnd,msg,wparam,lparam);
}
return NULL;
}
^ Window.cpp
bool Graphics::init(HWND windowHandle) {
HRESULT hRes = D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED,&factory
);
if (hRes != S_OK) return false;
RECT wCS;
GetClientRect(windowHandle,&wCS);
hRes = factory->CreateHwndrendertarget(
D2D1::rendertargetProperties(),D2D1::HwndrendertargetProperties(windowHandle,D2D1::SizeU(wCS.right,wCS.bottom)),&rendertarget
);
if (hRes != S_OK) return -1;
return true;
}
void Graphics::ClearScreen(float r,float g,float b) {
rendertarget->Clear(D2D1::ColorF(r,g,b));
}
^ Graphics.cpp
void BeginDraw() { rendertarget->BeginDraw(); }
void EndDraw() { rendertarget->EndDraw(); }
^ Graphics.h
我的错误在窗口打开后立即发生,就在它崩溃之前。 BeginDraw()
对此负责,因为将其从 WM_PAINT
中删除可以解决问题,但这不是一个可行的选择。
错误:
抛出异常:读取访问冲突。 this 是 nullptr。
它被指定在void BeginDraw() { ... }
中的Graphics.h
行上。
值得注意的事情(不重要):
过去几天我一直在尝试解决这个问题,但我不知道我阅读的大部分代码是什么意思,所以我为我的知识不足表示歉意。
我认为问题是在图形初始化之前调用了 BeginDraw()
,但我不确定如何防止这种情况发生。
感谢您的任何建议。
解决方法
问题是用于 BeginDraw
的图形对象与初始化的对象不同。它必须是同一个对象。