2

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

4

2 回答 2

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()
于 2013-09-13T12:48:42.067 回答
1

您总是可以使用SetWindowLongPtr“this”指针,然后将指针提取到您的 CMyFileDialog 将相当容易。

于 2013-09-13T12:45:02.810 回答