getdlgitem,解释一下MFC中的GetDlgItem是什么意思
本文目录索引
- 1,解释一下MFC中的GetDlgItem是什么意思
- 2,MFC 中GetDlgItem(ID)函数的问题!
- 3,如何正确使用((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(NAME);??
- 4,GetDlgItem为什么有时候需要两个参数
1,解释一下MFC中的GetDlgItem是什么意思
Dlg -- 对话窗,一个控件。
根据一个对话窗或一个控件的ID, 返回一个指向这个对话窗或控件的对象的指针。
例如,IDC_EDIT1 是 控件的ID
CEdit* pBoxOne;
pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT1);
用 GetDlgItem(IDC_EDIT1); 返回一个指向这个控件的指针, CEdit* ,存入 pBoxOne。
接下来,就可以用它了,例如:
GotoDlgCtrl(pBoxOne);
2,MFC 中GetDlgItem(ID)函数的问题!
“用哪个控件的指针指向GetDlgItem(IDC_LIST1)” 这个说法不准确。
GetDlgItem(IDC_LIST1) 这个函数获得的,是一个CWnd* 的窗口类指针,如果需要使用这个指针对控件进行操作,那么标准窗口操作(如:GetWindowText)是不需要强制类型转换的。如果操作是控件专有方法(如AddString),就要对指针进行强制转换,成为CListBox* 才能使用列表框类的专有方法(函数)。
3,如何正确使用((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(NAME);??
GetArea不是继承CWnd的吧,那当然不能只用一个参数了
还得加一个窗口句柄参数,例如HWND hDlg;给hDlg赋值IDC_COMBO1所在窗口的句柄,函数就改成
((CComboBox*)GetDlgItem(hDlg,IDC_COMBO1))
HWND hDlg;//在头文件里申明一个变量
hDlg = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetSafeHwnd();//在cpp文件里赋值
然后就是两个类之间传递值的问题了。可以在GetProvinceToListBox()函数上加个参数用来传递如GetProvinceToListBox(HWND hDlg);也可以在GetArea类里面定义一个全局变量
在列表框中必须添加新数字序列时, 必须先清除列表框中原有数据,所以必须调用清除原有数据的函数。。。
int classNum=ChooseClass.GetCurSel();
CString studentID;
((CComboBox*)GetDlgItem(IDC_COMBO2))->ResetContent(); // 使用ResetContent()函数清除原有数据
for (int i=1;i<stuNumChoose[classNum];i++)
{
studentID.Format(_T("%d"),i);
((CComboBox*)GetDlgItem(IDC_COMBO2))->AddString(studentID);
}
修改后,发现列表框中数据有了变化,但是还是达不到想象中的效果。
4,GetDlgItem为什么有时候需要两个参数
GetDlgItem的用法
基本用法(得到当前对话框中的控件):
CButton* btn = (CButton*)GetDlgItem(IDC_BUTTON_SEND);
btn->SetWindowTextW(_T("hello"));
如果想得到其他对话框中的控件,用GetDlgItem(hwnd,IDD);
CWnd::GetDlgItem(int nID)
这个是一个类成员函数,可使用CWnd* pWnd = GetDlgItem(ID_XXX);
而HWND GetDlgItem(
HWND hDlg, // handle of dialog box
int nIDDlgItem // identifier of control
);
是一个sdk的函数
两个的主要区别是用的地方不一样
一个参数的是在窗口中调用的函数,两个参数的是在平台SDK中调用的
你在对话框类里面调用GetDlgItem(IDC_BOARD_SIZE),就是调用的类成员函数CWnd::GetDlgItem
获得某个控件的句柄GetDlgItem(IDC_BOARD_SIZE)->m_hWnd就可以了
如果要用到第二种用法,要这样
::GetDlgItem(this-> m_hWnd,IDC_BOARD_SIZE);
效果一样的
那个IDC_BOARD_SIZE是你某个控件的id,
如果HWND GetDlgItem(
HWND hDlg, // handle of dialog box
int nIDDlgItem // identifier of control
);的话,
第一个参数是窗体的句柄,第二个参数是某个控件的ID,和IDC_BOARD_SIZE是一个意思
GetDlgItem(IDC_..),GetDlgItem(HWND hWnd, IDC_..)该如何使用,我在使用前者时老报错,提示应使用后者,但后者的hWnd不知如何获取。
GetDlgItem(IDC_..)是一个非静态方法,意思是你对话框内获取该控件指针,所以这里不需要获取对话框句柄,也就是说你如果在非对话框窗口里面调用这个方法就肯定会出错
GetDlgItem(HWND hWnd, IDC_..)是一个静态方法,它是一个让你指定从哪个对话框里获取控件指针
举个例子:你调用了上厕所这个函数,如果你在家里的话肯定是在自己家里上厕所,所以不需要知道在哪里上厕所(hwnd)
如果你在室外那么上厕所就一定要选一个地方(hwnd)。
如果说你上厕所的地方都不是一个房间,那么肯定会报错嘛,因为你在随地大小便,哈哈
所以你先搞清楚这两个函数的使用环境区别
再者,你问这个问题说明了你还没有搞清楚对话框是一个什么东西,建议学习一下深入浅出MFC