'BeginDraw' 与 D2D1 结合导致错误

问题描述

我正在尝试使用 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 的图形对象与初始化的对象不同。它必须是同一个对象。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...