【问题标题】:Retrieve WTL object from handle从句柄中检索 WTL 对象
【发布时间】:2013-09-18 03:34:53
【问题描述】:

我不得不将自定义文件对话框(源自 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?你不能简单地使用BEGIN_MSG_MAP吗?

标签: c++ casting atl wtl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您始终可以将SetWindowLongPtr 与您的“this”指针一起使用,然后将指针提取到您的 CMyFileDialog 将相当容易。

    【讨论】:

    • 谢谢你,但我发现我在更改窗口 proc 时出错了,所以我会先尝试。
    • 我认为这个答案将是我的选择。我忘记了我使用这个 wndproc 覆盖的原因......我必须覆盖默认隐藏的对话框中的选择按钮的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多