这是主要的"示例dlg.cpp"文件:
void CHelixV3Dlg::OnBnClickedCancel()
{
CEdit* editbox = (CEdit*)GetDlgItem(IDC_EDIT1);
//works fine, defined as: *CWnd GetDlgItem(int nID); in this file
}
Run Code Online (Sandbox Code Playgroud)
这是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);
}
Run Code Online (Sandbox Code Playgroud)
两个源文件都在同一个项目中,使用相同的头文件,但是test()的GetDlgItem显然是一个Win32 API函数,它在MFC中不起作用...我怎样才能在test.cpp中运行GetDlgItem()文件?
您不了解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...
}
Run Code Online (Sandbox Code Playgroud)