2013-03-15 77 views
3

在某些時候,我有這個如何讓WinProc有權訪問由它創建的對象?

LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    if(msg==WM_CREATE) 
    { 
     LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam; 
      D2DResources* pD2DResources = (D2DResources*)pcs->lpCreateParams; 

      ::SetWindowLongPtrW(
       hWnd, 
       GWLP_USERDATA, 
       PtrToUlong(pD2DResources) 
       ); 
    } 
    else 
    { 
     D2DResources* pD2DResources = reinterpret_cast<D2DResources*>(static_cast<LONG_PTR>(
      ::GetWindowLongPtrW(
       hWnd, 
       GWLP_USERDATA 
       ))); 

     switch(msg) 
     { 

    case WM_PAINT: 
     { 
      pD2DResources->OnRender(); 
      ValidateRect(hWnd, NULL); 
     } 
     break; 

    case WM_SIZE: 
     { 
      UINT width = LOWORD(lParam); 
      UINT height = HIWORD(lParam); 
      pD2DResources->OnResize(width, height); 
     } 
     break; 

所以我Winproc傳訪問先前創建的D2DResources。現在我希望它可以訪問另一個以前創建的對象。我怎麼做?我的意思是,它可以訪問多個以前創建的對象嗎?如果是這樣,怎麼樣?

編輯:雷蒙德陳說:「傳遞一個指向結構的指針作爲lpCreateParams,你可以在結構中放入任何你想要的東西。」 我該怎麼做?任何人都可以給我一個例子嗎?

+0

將指針傳遞給一個結構體作爲lpCreateParams。你可以把任何你想要的結構。 – 2013-03-15 01:38:17

+0

我不明白。我怎麼做? – 2013-03-15 01:39:23

+0

@MickaelBergeronNéron:你已經這樣做了,將一個指針傳遞給一個'D2DResources'結構。相反,請構建一個包含「D2DResources」和任何其他您需要的數據的結構,並傳遞其地址。 – 2013-03-15 01:58:10

回答

2

創建自己的結構並在創建時將其傳遞給窗口。你可以在其中放入任何你喜歡的東西,包括指向其他​​東西的指針。

例如

struct MyWindowData 
{ 
    D2DResources* pD2DResources; 
    void*  pMyOtherData; 
    int  iSomethingElse; 
}; 


// on window creation 
MyWindowData* pData = new MyWindowData(...); 
HWND hWnd = CreateWindowEx(..., pData); // window will own the data and destroy it itself 

// in the window procedure 
if (msg == WM_CREATE) 
{ 
    MyWindowData* pData = ((LPCREATESTRUCT)lParam)->lpCreateParams; 
    SetWindowLongPtr(hWnd, GWLP_USERDATA, (ULONG_PTR)pData); 
} 
else 
{ 
    MyWindowData* pData = (MyWindowData*)GetWindowLongPtr(hWnd, GWLP_USERDATA); 
    switch (msg) 
    { 
     case WM_PAINT: 
      pData->pD2DResources->OnRender(); 
      break; 

     case WM_NCDESTROY: 
      delete pData; // delete data on destroy 
      break; 
    } 

    ... 
} 
+0

謝謝!我現在明白了。 – 2013-03-15 02:03:46

相關問題