根据网上别人的代码,我加进了自己的项目中,但是运行缺出现错误。我贴一部分源码,请高手看看是什么错误具体源码:http://blog.csdn.net/lxspine/archive/2007/04/05/1553149.aspx
通过定义一个继承CTreeCtrl的类来实现改变子项字体和颜色:
首先定义一个字体、颜色的结构体:
protected:
 struct Color_Font
 {
  COLORREF color;
  LOGFONT  logfont;
 };
使用CMap来保存各个Item对应的字体、颜色信息
 CMap< void*, void*, Color_Font, Color_Font& > m_mapColorFont ;void CTreeCtrlX::SetItemColor(HTREEITEM hItem, COLORREF color)
{
 Color_Font cf;
 if( !m_mapColorFont.Lookup( hItem, cf ) )
  cf.logfont.lfFaceName[0] = '\0';
 cf.color = color;
 m_mapColorFont[hItem] = cf;
}
调用:
CMyTree *tree=(CMyTree*)GetDlgItem(IDC_TREE);
                    .
                    .
                    .
tree->SetItemColor(Item,RGB(255,255,255));我主要就是用这个SetItemColor函数,然后调用这个函数运行至if( !m_mapColorFont.Lookup( hItem, cf ) )这一句就会报
myprogramme.exe 中的 0x003f7f69 处未处理的异常: 0xC0000005: 读取位置 0xffffffff 时发生访问冲突
点击中断,跳至代码
if (!AfxIsValidAddress(pOb, pOb->GetRuntimeClass()->m_nObjectSize, FALSE))
{
TRACE(traceAppMsg, 0, "ASSERT_VALID fails with illegal pointer.\n");
if (AfxAssertFailedLine(lpszFileName, nLine))
AfxDebugBreak();
return;     // quick escape
}
这是什么问题啊?请高手指教

解决方案 »

  1.   

    CMyTree *tree=(CMyTree*)GetDlgItem(IDC_TREE);
    如果你的程序中没有定义一个CMyTree对象来子类化IDC_TREE控件,上面这行代码得到的tree只是MFC临时构造的一个CWnd对象,不能用该对象来访问CMyTree类特有的数据。你可以在对话框类中定义一个CMyTree对象例如m_MyTree,在对话框可的OnInitDialog函数中执行m_MyTree.SubclassDlgItem(IDC_TREE, this)。
      

  2.   

    我的树不是建在对话框上的,是在MainFrm的一个DialogBar上面的,我在MainFrm的OnCreate函数中建立了这个DialogBar,用你的方法好像不行
      

  3.   

    就是CMainFrm中定义一个CDialogBar dlgbar;然后在OnCreate函数中调用dlgbar.Create();在资源中建立一个DialogBar,上面拖一个树控件IDC_TREE,本来我是CMyTree *tree=(CMyTree*)GetDlgItem(IDC_TREE); 这样关联树控件的,但是出现上面我说的问题,请教!
      

  4.   

    CMyTree  绑定到IDC_TREE没
      

  5.   

    tree->SetItemColor(Item,RGB(255,255,255)); 
    这个Item是啥?可能没初始化
      

  6.   

    Cmap没用过
    但是map是要实例化的
    你看是不是这个原因