gpt4 book ai didi

c++ - 我怎样才能让 WinProc 访问由它创建的对象?

转载 作者:可可西里 更新时间:2023-11-01 09:29:57 25 4
gpt4 key购买 nike

在某些时候,我有这个

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。现在我希望它能够访问另一个先前创建的对象。我怎么做?我的意思是,它可以访问多个先前创建的对象吗?如果是,怎么办?

编辑: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;
}

...
}

关于c++ - 我怎样才能让 WinProc 访问由它创建的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15423255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com