Странное поведение CTreeViewCtrl и SetCheckState
От: ZealPack Россия  
Дата: 19.12.14 10:54
Оценка:
VS2008, 2010.

Есть примитивный WTL-диалог с деревом на нём. У дерева включено свойства "показывать чек-боксы".

class CMainDlg : public CDialogImpl<CMainDlg>
{
public:

    enum { IDD = IDD_MAINDLG };
    // разное....
    // ......


    HTREEITEM htiRoot;
};



при инициализации делаю так:
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    WTL::CTreeViewCtrl tree;
    tree.Attach( GetDlgItem(IDC_TREE1) );
    htiRoot = tree.InsertItem( L"All Items", TVI_ROOT, TVI_LAST);
    // добавляю ещё итемы
    tree.Expand( htiRoot );
    tree.SetCheckState( htiRoot, TRUE );
    tree.Detach();
    return TRUE;
}


по идее, должен выбраться корневой итем. Этого не происходит. А вот если отложить установку флажка на несколько миллисекунд, например, сделать так:
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    WTL::CTreeViewCtrl tree;
    tree.Attach( GetDlgItem(IDC_TREE1) );
    htiRoot = tree.InsertItem( L"All Items", TVI_ROOT, TVI_LAST);
    tree.Detach();

    // заводим будильник
    SetTimer(99, 250);

    return TRUE;
}

LRESULT CMainDlg::OnTimer(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    if( wParam != 99 ) return 0;
    KillTimer(99);
    WTL::CTreeViewCtrl tree;
    tree.Attach( GetDlgItem(IDC_TREE1) );
    tree.SetCheckState( htiRoot, TRUE );
    tree.Detach();
    return 0;
}


то итем выбирается. Почему итем не выбирается из OnInitDialog?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.