C ++ MFC如何使用函数GetDlgItem()(C++ MFC how to use GetD

2019-10-23 06:06发布

这是主要的“例如dlg.cpp”文件:

void CHelixV3Dlg::OnBnClickedCancel()
{
   CEdit* editbox = (CEdit*)GetDlgItem(IDC_EDIT1); 
  //works fine, defined as: *CWnd GetDlgItem(int nID); in this file
}

这是TEST.CPP源文件

void test()
{
   CEdit* editbox = (CEdit*)GetDlgItem(IDC_EDIT1);
   //does not work at all, seems to be a winAPI function instead of MFC...
   //defined as: HWND __stdcall GetDlgItem(HWND hDlg, int nIDDlgItem);
}

这两个源文件是在同一个项目,使用相同的标题,但测试()的函数GetDlgItem显然是一个Win32 API函数,它不会在MFC工作...我怎么能得到函数GetDlgItem()在TEST.CPP工作文件?

Answer 1:

你不明白C ++作用域规则。

在你第一次使用,你最终调用的CWnd ::函数GetDlgItem(),因为你正在从CHelixV3Dlg你的电话。 你的对话框类是从CDialog的是从CWnd派生的。 使用普通的C ++范围规则,如果存在具有函数GetDlgItem作为其名称的成员函数,这将是所使用的一个。

在你的第二个用途,你最终会调用函数GetDlgItem(),如WINAPI头文件中定义。 这是因为的CWnd ::函数GetDlgItem()是不是在你的范围。

如果你想调用CWnd版本在你的第二个用途,不知为何,你将获得一个指针或引用已创建并具有有效的HWND CHelixV3Dlg的一个实例。 一旦你有一个指针:

void test(CHelixV3Dlg* pDlg)
{
   CEdit* editbox = (CEdit*)pDlg->GetDlgItem(IDC_EDIT1);
   // do some stuff with editbox...
}


Answer 2:

函数GetDlgItem的MFC版本使用进行调用的类的HWND。 在您的CHelixV3Dlg例如,它使用对话框HWND和访问该窗口的子控件。 此功能仅用于访问的子窗口。



文章来源: C++ MFC how to use GetDlgItem()
标签: c++ winapi mfc