Это правильный способ присвоить частный HWND класса другому классу?

У меня есть класс 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, который был создан в объекте Game, или это копия? Я получаю некоторые ошибки, и, возможно, это происходит из-за того, что заказы выдаются не тому HWND, я не знаю.

Итак, сработает ли приведенный выше код (выдаст ли объект рендеринга свои заказы m_hWnd в объект Game) или нет? Если это не сработает, каким будет решение? Благодарю.

1

Решение

Это то же самое. Думайте о HWND как о «указателе» на базовый ресурс ОС. Когда вы копируете HWND, вы копируете «указатель» на ресурс, а не сам ресурс.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]