MFC遍历/清空所有Edit控件内容

先贴代码

CWnd *pWnd = GetWindow(GW_CHILD);
TCHAR szBuf[256];

while(pWnd != NULL)
{
    GetClassName(pWnd->m_hWnd,szBuf,256);
    if ( _tcsicmp(szBuf,_T( "Edit")) == 0 ) 
        pWnd->SetWindowText(_T(""));

    pWnd=pWnd->GetNextWindow();
}

GetWindow()

GetGetWindow()函数的原型:

CWnd* GetWindow(
   UINT nCmd 
) const;

GetWindow()函数返回的是与调用函数的窗口符合指定关系(参数nCmd)的窗口指针,nCmd可选取值见MSDN。
我是在主窗口的事件处理函数内调用(this指针),nCmd为GW_CHILD,因此返回的是主窗口的第一个子窗口,即主对话框内第一个控件的指针。再配合后面的pWnd=pWnd->GetNextWindow();
即可遍历主窗口内所有控件。
遍历的顺序在对话框的资源编辑器中按Ctrl+D,编辑各控件的tab值,这样上面程序就会按照tab顺序遍历各个控件。
另外

GetNextWindow()和GetWindow(GW_HWNDNEXT)功能是一样的,不受tab stop属性影响
GetNextDlgTabItem()是查找具有Tab Stop属性的控件,按照顺序依次往下查找
其顺序可以在布局(layout)中:Tab 顺序(Tab Order)中查看到,也可以修改
详情可参考孙鑫VC++第七课之对话框(一)

GetClassName()

GetClassName函数原型:

int GetClassName(HWND hWnd,LPTSTR IpClassName, int nMaxCount); 
  • 函数功能:该函数获得指定窗口所属的类的类名。
  • 参数:
    • hWnd:窗口的句柄及间接给出的窗口所属的类。
    • IpClassName: 指向接收窗口类名字符串的缓冲区的指针。
    • nMaxCount:指定由参数lpClassName指示的缓冲区的字节数。如果类名字符串大于缓冲区的长度,则多出的部分被截断。
  • 返回值: 如果函数成功,返回值为拷贝到指定缓冲区的字符个数:如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。

需要注意的是:
第一个参数接收的是窗口的句柄HWND,而不是窗口类指针CWND*,两者的区别联系以及相互获取参考HWND和CWND的概念以及转换
按照上述方法,不仅可以遍历所有的Edit控件,根据IpClassName接收的窗口类名,可以遍历、筛选各类控件并进行相应的操作,详见VC控件—-如何根据句柄判断其类型

_tcsicmp()

忽略大小写比较字符串函数。
更多可参考 string的成员用法

另外还要注意的是,这段代码是通过控件窗口类指针来操作的,如果控件关联了成员变量,在后面千万不能再用UpdateData(FALSE),否则

pWnd->SetWindowText(_T(""));

执行的操作就白干了,因为控件的内容又恢复成成员变量的内容了。

你可能感兴趣的:(C++)