从句柄中检索 WTL 对象

Retrieve WTL object from handle

本文关键字:WTL 对象 检索 句柄      更新时间:2023-10-16

我不得不将自定义文件对话框(源自MFC的CFileDialog)重写为WTL的CFileDialog。当我无法访问对话框对象本身时,我在检索数据时遇到了一些问题。想象一下以下内容。

我在班上有一个成员

static WNDPROC m_wndProc;

我在以下静态成员fnct中初始化它。

void CMyFileDialog::OnInitDone(LPOFNOTIFY lpon)
{
  m_wndProc = (WNDPROC)::SetWindowLong(thisHWND, GWL_WNDPROC, reinterpret_cast<long>
                                       (&CMyFileDialog::WndProcSelect));
}

句柄进入回调方法没有问题,我可以使用 CWindow "连接"它

LRESULT CALLBACK CMyFileDialog::WndProcSelect(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  // ...
  CWindow callerWnd(hwnd);
}

在这里,我不知道将CWindow转换为我的CMyFileDialog的真正方法。正如我认为的那样,这个 CWindow 类只是以某种方式连接到句柄本身,但与之前创建的对象不同。例如,如果我的 CMyFileDialog 中有 CString 或其他成员,它不会访问其状态,因为它是在另一个对象中创建的。

我认为你在这里做错了什么。您可以访问消息映射,而无需修改 WndProc(这是CFileDialogImpl已经完成的操作)。

例如,请参阅 http://www.codeproject.com/Articles/12999/WTL-for-MFC-Programmers-Part-IX-GDI-Classes-Common#usingcfiledialog,他们只是

BEGIN_MSG_MAP(CMyFileDialog)
   CHAIN_MSG_MAP(CFileDialogImpl<CMyFileDialog>)
END_MSG_MAP()

你可以总是将SetWindowLongPtr与你的"this"指针一起使用,然后提取指向CMyFileDialog的指针会相当容易。