1

我正在尝试CreateWindowEx使用 D2D1 清除使用分隔为单独类的代码创建的窗口的背景。这是代码。

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;
}

^ 窗口.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));
}

^ 图形.cpp

void BeginDraw() { renderTarget->BeginDraw(); }
void EndDraw() { renderTarget->EndDraw(); }

^ 图形.h

我的错误在窗口打开后立即发生,就在它崩溃之前。对此BeginDraw()负责,因为将其删除可以WM_PAINT解决问题,但这不是一个可行的选择。

错误:

抛出异常:读取访问冲突。 是空指针。

它被指定在 中的行void BeginDraw() { ... }Graphics.h

值得注意的事情(不重要):

在过去的几天里,我一直在努力寻找解决方案,但我不知道我阅读的大部分代码是什么意思,所以我为我缺乏知识而道歉。

我认为这个问题是BeginDraw()在图形初始化之前被调用的,但我不知道如何防止这种情况。

谢谢你的任何建议。

4

1 回答 1

0

问题是所使用的图形对象BeginDraw与初始化的对象不同。它必须是同一个对象。

于 2021-01-06T06:24:37.563 回答