VC中对话框的“所有”控件?

初学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" );

}

虽说这样获得的控件指针不能保存起来长久使用,但我想在一个函数里的局部保存还是没关系的。毕竟,窗口连重画都没有进行。

呵呵,菜鸟一只,对MFC内部机制知之甚少。用这样的方法我自己都觉得很不爽。看到这篇文章的人如果有Professional的方法,一定要告诉我啊。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值