我怎么能让WinProc有访问对象创建出来

How can I have WinProc have access to objects created out of it?

本文关键字:对象 创建 访问 怎么能 WinProc      更新时间:2023-10-16

在某个地方,我有这个

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可以访问之前创建的d2d资源。现在我想让它访问另一个之前创建的对象。我怎么做呢?我的意思是,它能访问多个之前创建的对象吗?如果有,怎么做?

编辑:Raymond Chen说:"传递一个指针到一个结构作为lpCreateParams。你可以在里面放任何你想放的东西。"我怎么做呢?谁能给我举个例子?

创建自己的结构,并在创建时将其传递给窗口。你可以在里面放任何你喜欢的东西,包括指向其他东西的指针。

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;
    }
    ...
}