从句柄中检索WTL对象

时间:2013-09-13 12:33:04

标签: c++ casting atl wtl

我不得不将自定义文件对话框(从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或其他成员,它将无法访问其状态,因为它是在另一个对象中创建的。

2 个答案:

答案 0 :(得分:2)

我认为你在这里做错了什么。您无需修改​​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()

答案 1 :(得分:1)

你可以随时使用SetWindowLongPtr和你的#34;这个&#34;指针,然后提取指向CMyFileDialog的指针相当容易。