C ++ MFC如何使用GetDlgItem()

时间:2015-05-28 13:40:52

标签: c++ winapi mfc

这是主要的例子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()?

2 个答案:

答案 0 :(得分:6)

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

在您第一次使用时,您最终会调用CWnd :: GetDlgItem(),因为您正在通过CHelixV3Dlg进行调用。您的对话框类派生自CDialog,它源自CWnd。使用普通的C ++作用域规则,如果有一个以GetDlgItem作为名称的成员函数,它将是要使用的成员函数。

在第二次使用中,您最终调用WINDI头中定义的GetDlgItem()。那是因为CWnd :: GetDlgItem()不在您的范围内。

如果你想在你的第二次使用中调用CWnd版本,你将不得不获得一个指针或对已经创建并具有有效HWND的CHelixV3Dlg实例的引用。一旦你有了这个指针:

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

答案 1 :(得分:0)

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