在使用VC/MFC编程时常碰到要对多个控件同时做同样的操作的情况,特别是你想使某些控件同时禁用或同时隐藏某些控件等。这时你一般可以有如下选择:
1. 你可以给每个控件映射控制类型的变量,然后逐个对它们进行操作,这显然会在对话框类实例化时多占用用来存放成员变量的内存;
2. 你也可以通过GetDlgItem函数得到来得到控件的窗体指针来逐个操作,而这除了占用指针内存外,遇到太多的控件时无疑会使代码量增加;
3. 你可采用指针数组来记录所有的控件,一般先要进行一个初始化动作在动话框开始显示时记录下要操作的控件,然后去对其操作。这种办法除了指针空间外,遇到不同类型的要进行太多的类型转化。
4. 当然,你要像VB那样使用控件数组的话在VC中也是可以通过映射控件的控制类型变量来实现的,但主要是它除了占用空间外还不太适合于不同类型的控件。
这里介绍的是如果使用对话框类自带的两个成员函数来实现这种操作,它们是:
l CWnd::GetNextDlgTabItem得到“下一个”TAB项控件
l CWnd::GetNextDlgGroupItem得到一组控件中的“下一个”
注意:
1. 这里的“下一个”都是相对的,你可以通过它们的参数让它变成“上一个”;
2. 在使用前者是要注意要操作控件的“TabStop”属性必须打上钩或者它要有WS_TABSTOP风格;
3. 使用后一个函数要使要操作的控件在一组,方法是在第一个控件的Group属性上打钩,后面的不打钩;
4. 当一批控件被Enable(false)(即Disable禁用后)下次就使用上述两个函数就不算在内了,所以要再次使用即恢复它们的话必须另外记下它们的指针;
5. 关于上面的两个函数的详细说明请参MSDN。
下面是一个应用它们的调用例子:
CWnd * pWndCtrl = GetDlgItem(IDC_STATIC1);
for(i=0;i < 11 && pWndCtrl != NULL;i++)
{
pWndCtrl->EnableWindow(FALSE);
pWndCtrl = GetNextDlgTabItem(pWndCtrl);
}
上面的代码将同时禁用11个控件,将GetNextDlgTabItem换成GetNextDlgGroupItem的话就是对一组控件进行操作啦。
当然,因为这两个函数是CWnd类的成员,对于非对话框上的控件或者动态创建的控件同样有效。