【问题标题】:Problen while creating ID2D1RenderTerget创建 ID2D1RenderTarget 时出现问题
【发布时间】:2020-04-19 20:17:17
【问题描述】:

我是 Direct2d 的新手,并试图创建创建渲染目标的函数(类似于 eigne 的一部分),但我对此有疑问。当我在 main 中创建渲染目标时,它可以工作,但不能在外部工作。 我尝试创建的功能:

{
    RECT rc;
    GetClientRect(hwnd, &rc);

    D2D1_SIZE_U size = D2D1::SizeU(
        rc.right - rc.left,
        rc.bottom - rc.top
    );

    // Create a Direct2D render target.
        factory->CreateHwndRenderTarget(
        D2D1::RenderTargetProperties(),
        D2D1::HwndRenderTargetProperties(hwnd, size),
        &rendertarget);

}

编译错误:

错误(活动)E0304 重载函数“ID2D1Factory::CreateHwndRenderTarget”的实例与参数列表不匹配

错误 C2664 'HRESULT ID2D1Factory::CreateHwndRenderTarget(const D2D1_RENDER_TARGET_PROPERTIES &,const D2D1_HWND_RENDER_TARGET_PROPERTIES &,ID2D1HwndRenderTarget **)': 无法将参数 1 从 'D2D1_RENDER_TARGET_PROPERTIES *'RENDER1>T

完整代码:

#include <d2d1.h>
#include <d2d1_1helper.h>
#include <wincodec.h>
#pragma comment(lib,"d2d1.lib")
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
    WPARAM wParam, LPARAM lParam);

ID2D1Factory* factory;
ID2D1HwndRenderTarget* rendertarget;

void test(ID2D1Factory* factory,ID2D1RenderTarget* rendertarget, HWND hwnd)
{
    RECT rc;
    GetClientRect(hwnd, &rc);

    D2D1_SIZE_U size = D2D1::SizeU(
        rc.right - rc.left,
        rc.bottom - rc.top
    );

    // Create a Direct2D render target.
        factory->CreateHwndRenderTarget(
        D2D1::RenderTargetProperties(),
        D2D1::HwndRenderTargetProperties(hwnd, size),
        &rendertarget);

}
int CALLBACK WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc;
    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"class";

    RegisterClass(&wc);
    HWND hwnd = CreateWindow(
        L"class",
        L"Direct2D init",
        WS_OVERLAPPEDWINDOW, 100, 100, 600, 600,
        NULL, NULL, hInstance, NULL);
    RECT clrc;
    GetClientRect(hwnd, &clrc);
    D2D1CreateFactory(D2D1_FACTORY_TYPE::D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory);
    HRESULT hr = factory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),
        D2D1::HwndRenderTargetProperties(
            hwnd, D2D1::SizeU(clrc.right - clrc.left, clrc.bottom - clrc.top))
        ,&rendertarget);
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    MSG msg;

    while (GetMessage(&msg, NULL, NULL, NULL))
    {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);

    }
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
    WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_PAINT:
        rendertarget->BeginDraw();
        rendertarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
        rendertarget->EndDraw();
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
}

【问题讨论】:

  • 我无法将您的代码与您所说的错误消息相匹配,这对我来说毫无意义。也许您应该发布一个包含此错误的完整程序。请在发布完整程序之前删除所有不相关的代码。
  • 使用minimal reproducible example 作为灵感,同时满足约翰的要求。
  • 确保rendertarget 是ID2D1HwndRenderTarget*
  • @sim:这不是必需的。要求是,表达式 &amp;rendertarget 必须是 ID2D1HwndRenderTarget** 类型,或者可以隐式转换为该类型。
  • @IInspectable - 当然,但我在考虑 1) 明显缺乏 OP 的能力(无意冒犯)和 2) Direct2D 没有定义 ID2D1HwndRenderTarget 的任何派生的事实

标签: c++ winapi direct2d


【解决方案1】:

正如我在评论中所说,您必须将 renderTarget 声明为 ID2D1HwndRenderTarget*,因为 CreateHwndRenderTarget method 需要这种类型,因此只需像这样更改您的 test 代码声明:

void test(ID2D1Factory* factory, ID2D1HwndRenderTarget* rendertarget, HWND hwnd)

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2021-04-09
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多