Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从句柄中检索WTL对象_C++_Casting_Atl_Wtl - Fatal编程技术网

C++ 从句柄中检索WTL对象

C++ 从句柄中检索WTL对象,c++,casting,atl,wtl,C++,Casting,Atl,Wtl,我不得不将一个自定义文件对话框(源自MFC的CFileDialog)重写为WTL的CFileDialog。当我无法访问对话框对象本身时,检索数据有点问题。想象一下下面的情景 我班上有一名成员 static WNDPROC m_wndProc; 我在下面的静态成员fnct中初始化它 void CMyFileDialog::OnInitDone(LPOFNOTIFY lpon) { m_wndProc = (WNDPROC)::SetWindowLong(thisHWND, GWL_WNDPR

我不得不将一个自定义文件对话框(源自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转换为我的CMyFileDialog的真正方法。正如我所想,这个CWindow类只是以某种方式连接到句柄本身,但与之前创建的对象不同。例如,如果我的CMyFileDialog中有一个CString或其他成员,它将无法访问其状态,因为它是在另一个对象中创建的。

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

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

例如,请参见

BEGIN_MSG_MAP(CMyFileDialog)
   CHAIN_MSG_MAP(CFileDialogImpl<CMyFileDialog>)
END_MSG_MAP()
BEGIN\u MSG\u映射(CMyFileDialog)
链消息映射(CFileDialogImpl)
END_MSG_MAP()

为什么要更改WNDPROC?你不能简单地使用
BEGIN\u MSG\u MAP
?谢谢,但是我发现我在更改窗口过程时出错了,所以我会先试试。我想这个答案将是我的选择。我忘记了我使用wndproc覆盖的原因。。。我必须在默认情况下隐藏的对话框中覆盖选择按钮的功能。
BEGIN_MSG_MAP(CMyFileDialog)
   CHAIN_MSG_MAP(CFileDialogImpl<CMyFileDialog>)
END_MSG_MAP()