这在主“example 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);
}

两个源文件都在同一个项目中,使用相同的头,但是test()的GetDlgItem显然是Win32 API函数,在MFC中不起作用。
如何在test.cpp文件中使用GetDlgItem()?

最佳答案

您不了解C++范围规则。

第一次使用时,您最终会调用CWnd::GetDlgItem(),因为您是从CHelixV3Dlg进行调用的。您的对话框类是从CDialog派生的,而CDialog是从CWnd派生的。使用普通的C++范围规则,如果有一个成员函数以GetDlgItem作为其名称,则将使用该成员函数。

在第二种用法中,您最终按照WINAPI header 中的定义调​​用GetDlgItem()。这是因为CWnd::GetDlgItem()不在您的范围内。

如果要在第二次使用中调用CWnd版本,则将不得不以某种方式获取指向已创建并具有有效HWND的CHelixV3Dlg实例的指针或引用。一旦有了该指针:

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

08-20 01:47