C++ MFC 如何使用 GetDlgItem()
C++ MFC how to use GetDlgItem()
这在主 "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中不起作用...
我怎样才能让 GetDlgItem() 在 test.cpp 文件中工作?
GetDlgItem 的 MFC 版本使用调用 class 的 HWND。在您的 CHelixV3Dlg 示例中,它使用对话框 HWND 并访问该 window 的子控件。此函数仅用于访问子 windows。
你不了解 C++ 作用域规则。
在您的第一次使用中,您最终调用了 CWnd::GetDlgItem(),因为您是从 CHelixV3Dlg 进行调用的。您的对话框 class 是从 CWnd 派生的 CDialog 派生的。使用普通的 C++ 范围规则,如果有一个成员函数以 GetDlgItem 作为其名称,它将被使用。
在第二次使用中,您最终调用了 WINAPI headers 中定义的 GetDlgItem()。那是因为 CWnd::GetDlgItem() 不在你的范围内。
如果您想在第二次使用时调用 CWnd 版本,您将不得不以某种方式获取指向已创建且具有有效 HWND 的 CHelixV3Dlg 实例的指针或引用。一旦你有了那个指针:
void test(CHelixV3Dlg* pDlg)
{
CEdit* editbox = (CEdit*)pDlg->GetDlgItem(IDC_EDIT1);
// do some stuff with editbox...
}
这在主 "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中不起作用... 我怎样才能让 GetDlgItem() 在 test.cpp 文件中工作?
GetDlgItem 的 MFC 版本使用调用 class 的 HWND。在您的 CHelixV3Dlg 示例中,它使用对话框 HWND 并访问该 window 的子控件。此函数仅用于访问子 windows。
你不了解 C++ 作用域规则。
在您的第一次使用中,您最终调用了 CWnd::GetDlgItem(),因为您是从 CHelixV3Dlg 进行调用的。您的对话框 class 是从 CWnd 派生的 CDialog 派生的。使用普通的 C++ 范围规则,如果有一个成员函数以 GetDlgItem 作为其名称,它将被使用。
在第二次使用中,您最终调用了 WINAPI headers 中定义的 GetDlgItem()。那是因为 CWnd::GetDlgItem() 不在你的范围内。
如果您想在第二次使用时调用 CWnd 版本,您将不得不以某种方式获取指向已创建且具有有效 HWND 的 CHelixV3Dlg 实例的指针或引用。一旦你有了那个指针:
void test(CHelixV3Dlg* pDlg)
{
CEdit* editbox = (CEdit*)pDlg->GetDlgItem(IDC_EDIT1);
// do some stuff with editbox...
}