我的问题是,我编写的一个函数,用与读保存的设置,此设置读出后,应该在对应的树的结点前面的方框(我定义成checkbox风格的)打勾,或者置空,   
    
  本想让他在对话框的初始化函数OnInitDialog()中调用这个函数,以便在打开对话框后,看到上次的设置信息,明明本函数已经调用成功,为什么不出现响应的小勾呢,后来我添加了按钮,响应这个函数,结果是成功的,这证明该函数是正确的,   
  为什么在OnInitDialog()中响应,不行呢

解决方案 »

  1.   

    在OnInitDialog()设置,不行的话可能是因为窗口还没有完成初始化
      

  2.   

    那怎么解决???BOOL CMyDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog(); FixTipsStruct();//得到下面m_pStruTipsTree结构 
    InitTipsTree(m_pStruTipsTree, m_sFClsNum);//用结构初始化树,m_sFClsNum为根节点数 return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }
    void CMyDlg::InitTipsTree(StruTipsTree *pStruTipsTree, long nRootNum)
    {
    if (pStruTipsTree == NULL || nRootNum == 0)
    return; HTREEITEM hItem;
    for (int i=0; i<nRootNum; i++)
    {
    hItem = m_cTipsTree.InsertItem(pStruTipsTree[i].strBootName, TVI_ROOT);//我开始在这里SetCheck不行,就放到下面去了
    for (int j=0; j<pStruTipsTree[i].nAttFieldNum; j++)
    {
    m_cTipsTree.InsertItem(pStruTipsTree[i].pTipDispField[j].strFieldName, hItem);
    }
    }
    CString   strTemp = _T("");
    HTREEITEM hItem1, hItem2; for (i=0; i<nRootNum; i++)
    {
    strTemp = pStruTipsTree[i].strBootName;
    hItem1 = FindItem(m_cTipsTree.GetRootItem(), strTemp);//遍历数
    if (pStruTipsTree[i].bDispBoot)
    {
    m_cTipsTree.SetCheck(hItem1, TRUE);
    }

    for (int j=0; j<pStruTipsTree[i].nAttFieldNum; j++)
    {
    strTemp = pStruTipsTree[i].pTipDispField[j].strFieldName;
    hItem2 = FindItem(hItem1, strTemp);
    if (pStruTipsTree[i].pTipDispField[j].bDisp)
    {
    m_cTipsTree.SetCheck(hItem2, TRUE);
    }
    }
    }
    }都成功了,但就是树出来的时候不能显示check。 。
      

  3.   

    把它放到showwindow里去做试试。
      

  4.   

    raymonzhao(Raymon):把它放到showwindow里去做试了,也不行啊,奇怪了
      

  5.   

    自己定义一个消息处理函数试试
    即在
     BOOL CMyDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();
      PostMessage(....);//发送一条消息--引发你的处理函数
    }
      

  6.   

    to w1984721() :这样不行吧,你这是在OnInitDialog()建接的调用函数,一样的效果to raymonzhao(Raymon):发了
      

  7.   

    我试了下,SetCheck以后,树的状态值确实是改变了的.但显示出来后又改回去了.
    我现在是在初始化设一下定时器去改变的状态.这样可以实现需求,但还是不爽.
    我看看是不是有什么地方可以再弄一下.
      

  8.   

    If you want to use this style, you must set the TVS_CHECKBOXES style with SetWindowLong after you create the treeview control, and before you populate the tree. Otherwise, the checkboxes might appear unchecked, depending on timing issues.depending on timing issues.这是MSDN上的说明,看来是要在适当的时候去设置一下.你在插入结点的时候直接插入一个结构,注明它的状态试下看.如果不行的话,那只能定时刷新,或更改它的回调函数.
      

  9.   

    raymonzhao:"你在插入结点的时候直接插入一个结构,注明它的状态试下看"
    ====================================================================这个我一开始就试过了,不行,谢谢你啊,我再想想别的办法,我现在的处理方法就是外加一个按纽,这样每次别人都得点一下,这样很不爽
      

  10.   

    你setcheck后,getcheck看一下结果,还有你要从clistctrl的MSDN中仔细看一下,可能有什么特殊用法
      

  11.   

    刚好我在做熊猫病毒免疫程序用到了CtreeCtrl,希望能给你个帮助:
    在制造ROOT前加上:
    m_nDiskTree.ModifyStyle( TVS_CHECKBOXES, 0 ); 
    m_nDiskTree.ModifyStyle( 0, TVS_CHECKBOXES );
             HTREEITEM hRoot=m_nDiskTree.InsertItem ("我的电脑",2,2,0,0);
    就行了!
      

  12.   


    m_nDiskTree.ModifyStyle( TVS_CHECKBOXES, 0 ); 
    m_nDiskTree.ModifyStyle( 0, TVS_CHECKBOXES );
    ======================
    好了,谢谢大家了这是为什么呢?