初学VC,接触最多的自然是Dialog Based了。我知道每个对话框模版都是一个控件容器,既然是容器,就应该有经典的for-each操作吧。比如,我如果想让对话框中所有控件都失效,那么这个“所有”怎么表示呢?怎么编程实现呢?
查CDialog类的MSDN, 貌似没有这样的成员函数可以得到一个“控件容器”的句柄。是真的没有呢,还是我没找到?
换个方式,如果像经典的windows查找文件的方法一样:找到First,又能有Next,一种迭代器思路的遍历方法,也是不错的。但我还是没有找到直接的方式。只有一个类似的——NextDlgCtrl函数,作用是将焦点移至“下一个”控件。哦,那就再调用一次GetFocus函数获得控件的窗口句柄了——很不优雅,但可能有用。
忍不住还是要用STL的list,呵呵,没关系了。我用一个while循环创立一个list<CWnd*>,用来作为真正的“控件容器”,看看下面这段代码:
void
CMLaunchDlgDlg::OnDisableAll()
... {
// TODO: Add your control notification handler code here
static BOOL bEnable = TRUE;
bEnable = !bEnable;
CWnd* pCtrlMe = GetDlgItem( IDC_DISABLE_ALL );
if( !bEnable )
...{
NextDlgCtrl();
CWnd* pCtrlNext = GetFocus();
while( pCtrlNext != pCtrlMe )
...{
m_pWndList.push_back( pCtrlNext );
pCtrlNext -> EnableWindow( bEnable );
NextDlgCtrl();
pCtrlNext = GetFocus();
}
}//End if
else
...{
while( !m_pWndList.empty() )
...{
( *( m_pWndList.begin() ) ) -> EnableWindow( bEnable );
m_pWndList.pop_front();
}
}
pCtrlMe->SetWindowText( bEnable ? "Disable All" : "Enable All" );
}
... {
// TODO: Add your control notification handler code here
static BOOL bEnable = TRUE;
bEnable = !bEnable;
CWnd* pCtrlMe = GetDlgItem( IDC_DISABLE_ALL );
if( !bEnable )
...{
NextDlgCtrl();
CWnd* pCtrlNext = GetFocus();
while( pCtrlNext != pCtrlMe )
...{
m_pWndList.push_back( pCtrlNext );
pCtrlNext -> EnableWindow( bEnable );
NextDlgCtrl();
pCtrlNext = GetFocus();
}
}//End if
else
...{
while( !m_pWndList.empty() )
...{
( *( m_pWndList.begin() ) ) -> EnableWindow( bEnable );
m_pWndList.pop_front();
}
}
pCtrlMe->SetWindowText( bEnable ? "Disable All" : "Enable All" );
}
虽说这样获得的控件指针不能保存起来长久使用,但我想在一个函数里的局部保存还是没关系的。毕竟,窗口连重画都没有进行。
呵呵,菜鸟一只,对MFC内部机制知之甚少。用这样的方法我自己都觉得很不爽。看到这篇文章的人如果有Professional的方法,一定要告诉我啊。