如何防止CTreeCtrl上的闪烁?

时间:2014-03-15 04:44:00

标签: c++ c windows user-interface mfc

我正在使用VS2010开发一个MFC项目。当我点击CTreeCtrl控件的一个项目时,它很奇怪,其他一些不相关的项目有时会闪烁。我尝试了很多电脑,这个问题依然存在。任何解决方案?

这是一个BCGControlBar项目,CTreeCtrl与CWorkSpaceBar2类(如VS中的工作区栏)链接。我认为这不是重点,因为许多其他纯CTreeList演示也会共享相同的闪烁问题。下面提供了一个演示,您可以在单击CTreeCtrl项目时找到闪烁问题。虽然这不是我的代码,但我们也有同样的问题。

http://www.verysource.com/testmytreectrl-59412.html

以下是我的一些代码。你可以发现我并没有做一些可能导致问题的奇怪事情。

initIcons()功能用于初始化项目的图标。

add2Tree(CTreeCtrl * pTree,AFDir * pDir,HTREEITEM hItemParent,bool bHead)功能用于添加项目。

OnSelchanged(NMHDR * pNMHDR,LRESULT * pResult)函数在单击某个项目时不执行任何操作。

void CWorkSpaceBar2::initIcons()
{
//  SHFILEINFO sfi;
//  SHGetFileInfo(m_strDataDir, 0, &sfi, sizeof(SHFILEINFO),  SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
//  m_iIconFolder = sfi.iIcon;
// 
//  SHFILEINFO sfi2;
//  SHGetFileInfo(m_strDataDir + _T("coloring_rules.txt"), 0, &sfi2, sizeof(SHFILEINFO),  SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
//  m_iIconScript = sfi2.iIcon;
// 
//  SHFILEINFO sfi3;
//  SHGetFileInfo(m_strDataDir + _T("color2.ini"), 0, &sfi3, sizeof(SHFILEINFO),  SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
//  m_iIconProperty = sfi3.iIcon;

//  HICON   hIcon;   
//  hIcon = AfxGetApp()->LoadIcon(IDB);   

/*  Cil1.Create(IDB_VSICON, 16, 1, RGB(255, 0, 255)); // 建立16 位图像控制*/

    m_imageList.Create(16, 16, ILC_COLOR32 | ILC_MASK, 10, 10);
    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_VSICON);
    m_imageList.Add(&bitmap, RGB(255, 0, 255));

//  int bbb = Cil1.Add(aaa.FromHandle((HBITMAP) aaa), RGB(0, 0, 0));
    //Cil1.Add(LoadIcon(NULL, (LPCTSTR) IDR_AffensicsTYPE));// 增加选中状态图像

    m_wndTree.SetImageList(&m_imageList, TVSIL_NORMAL); //LVSIL_SMALL
    m_iIconFolderClosed = LIST_ICON_FOLDER_CLOSED;
    m_iIconScript = LIST_ICON_SCRIPT;
    m_iIconProperty = LIST_ICON_PROPERTY;

// 
//  HTREEITEM root = m_wndTree.InsertItem(_T("root"), 0, 0);
//  int i,j;
//  for (i = 0; i < 4; i++)
//  {
//      HTREEITEM item = m_wndTree.InsertItem(_T("item"), 1, 1,root);
//      for (j = 0; j < 3; j++)
//      {
//          m_wndTree.InsertItem(_T("small"), 0, 1, item);
//      }
//  }
}

void CWorkSpaceBar2::add2Tree(CTreeCtrl* pTree, AFDir* pDir, HTREEITEM hItemParent, bool bHead)
{
    HTREEITEM hItem;

    int iIcon = pDir->is_dir? m_iIconFolderClosed : m_iIconScript;

    if (bHead)
    {
        hItem = pTree->InsertItem(pDir->name, iIcon, iIcon, TVI_ROOT);
        m_mapDirs[hItem] = pDir;
        m_mapDirs_R[pDir] = hItem;
    }
    else
    {
        hItem = pTree->InsertItem(pDir->name, iIcon, iIcon, hItemParent);
        m_mapDirs[hItem] = pDir;
        m_mapDirs_R[pDir] = hItem;
    }

    if (pDir->is_dir == TRUE)
    {
        for (size_t i = 0; i < pDir->dirs.size(); i ++)
        {
            add2Tree(pTree, pDir->dirs[i], hItem, FALSE);
        }

        for (size_t i = 0; i < pDir->files.size(); i ++)
        {
            add2Tree(pTree, pDir->files[i], hItem, FALSE);
        }
    }
    else
    {
        addScript2Tree(pTree, pDir, hItem);
    }
}

void CWorkSpaceBar2::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{

    *pResult = 0;
    return;
}

0 个答案:

没有答案