'BeginDraw' 与 D2D1 结合导致错误
'BeginDraw' in conjunction with D2D1 causes an error
我正在尝试使用 D2D1 清除使用 CreateWindowEx
创建的 window 的背景,并将代码分离到单独的 类 中。这是代码。
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
我的错误在 window 打开时就出现了,就在它崩溃之前。 BeginDraw()
对此负责,因为将其从 WM_PAINT
中删除可以解决问题,但这不是一个可行的选择。
错误:
Exception thrown: read access violation.
this was nullptr.
指定在Graphics.h
中的void BeginDraw() { ... }
行。
值得注意的事情(不重要):
这几天我一直在尝试解决这个问题,但我不知道我阅读的大部分代码是什么意思,所以我为我缺乏知识而道歉.
我认为问题是 BeginDraw()
在图形初始化之前被调用,但我不确定如何防止这种情况。
感谢您的任何建议。
问题是用于 BeginDraw
的图形对象与初始化的对象不同。它需要是同一个对象。
我正在尝试使用 D2D1 清除使用 CreateWindowEx
创建的 window 的背景,并将代码分离到单独的 类 中。这是代码。
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
我的错误在 window 打开时就出现了,就在它崩溃之前。 BeginDraw()
对此负责,因为将其从 WM_PAINT
中删除可以解决问题,但这不是一个可行的选择。
错误:
Exception thrown: read access violation. this was nullptr.
指定在Graphics.h
中的void BeginDraw() { ... }
行。
值得注意的事情(不重要):
这几天我一直在尝试解决这个问题,但我不知道我阅读的大部分代码是什么意思,所以我为我缺乏知识而道歉.
我认为问题是 BeginDraw()
在图形初始化之前被调用,但我不确定如何防止这种情况。
感谢您的任何建议。
问题是用于 BeginDraw
的图形对象与初始化的对象不同。它需要是同一个对象。