2013-03-17 72 views
1

我有游戏类在某些时候都会有自己的私人HWND成员m_hWnd获得的值:这是将班级的私人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->初始化(m_hWnd)一个渲染目标被创建:

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。在我上面的代码中,渲染目标会将其顺序发布到创建到Game对象中的HWND中,还是作为副本?我得到一些错误,也许这是因为命令发给错误的HWND,我不知道。

所以,上面的代码是否会工作(渲染目标是否将它的命令发布到Game对象的m_hWnd中)?如果它不起作用,解决方案是什么?谢谢。

回答

3

这是一样的。将HWND看作是底层操作系统资源的“指针”。复制HWND时,您正在将“指针”复制到资源,而不是资源本身。