这是将一个类的私有 HWND 分配给另一个类的正确方法吗?

Is this the correct way to assign a class' private HWND to another class?

本文关键字:分配 另一个 方法 HWND 一个      更新时间:2023-10-16

我有一个Game类,它在某些时候会有它的私有HWND成员m_hWnd获得一个值:

m_hWnd=CreateWindowEx(NULL,
            "Window Class",
            "Game", // Replace with gameName
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInst,
            this);

之后,创建一个D2DResources对象,其中必须传递游戏的m_hWnd。

void Game::CreateRessources(HINSTANCE hInst)
{   
    CreateWindowClass(hInst); //m_hWnd gains its value it this function
    pMessageLog=CreateMessageLog();
    pD2DResources=CreateD2DResources(m_hWnd);
    pD2DResources->Initialize(m_hWnd);
    pWinsock=CreateWinsock();
}

很快进入pD2DResources->Initialize(m_hWnd)一个RenderTarget被创建:

HRESULT D2DResources::Initialize(HWND hwnd)
{
    HRESULT hr;
    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory); // Create factory
    RECT rc;
    GetClientRect(hwnd,&rc);
    if(SUCCEEDED(hr)) // Creates render target
    {
        pD2DFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(
                hwnd,
                D2D1::SizeU(
                    rc.right - rc.left,
                    rc.bottom - rc.top)),
                &pRT);
    }

这一行是最重要的:

pD2DFactory->CreateHwndRenderTarget(
                D2D1::RenderTargetProperties(),
                D2D1::HwndRenderTargetProperties(
                    hwnd,
                    D2D1::SizeU(
                        rc.right - rc.left,
                        rc.bottom - rc.top)),
                    &pRT);

HwndRenderTargetProperties的第一个参数HWND,将是渲染目标从其绘制命令发出输出的HWND。在我上面的代码中,渲染目标是否会向创建到游戏对象中的HWND发出命令,或者它是一个副本?我得到了一些错误,也许是因为命令发出到错误的HWND,我不知道。

那么,上面的代码是否有效(渲染目标是否会向游戏对象发出m_hWnd的命令)?如果行不通,解决办法是什么?谢谢。

是一样的。可以将HWND看作是指向底层操作系统资源的"指针"。当你复制一个HWND时,你复制的是指向资源的"指针",而不是资源本身。

相关文章: