多视图结构的程序,其中有一个继承于TreeView的视图,在其中的OnInitialUpdate()添加了如下代码
CTreeView::OnInitialUpdate();CTreeCtrl& trCtrl = GetTreeCtrl();
HTREEITEM hItem;
hItem = trCtrl.InsertItem( "aaa", 0, 2 ); 
trCtrl.InsertItem( "bbb", 1, 3, hItem );
trCtrl.InsertItem( "ccc", 1, 3, hItem );
却发现OnInitialUpdate()函数被调用了两次??也就是说在树中会出现两个aaa bbb ccc,这是怎么一回事??

解决方案 »

  1.   

    却发现OnInitialUpdate()函数被调用了两次??
    设置一个断点,看一下调用堆栈?
      

  2.   

    在OnInitUpdate函数中增加断点。当程序停在断点的时候,看看Call Stack中的函数都是些什么
      

  3.   

    逐过程跟踪了一下,发现第一次调用是系统正常调用
    然后在转到AfxWndProcBase()函数,在这个函数末尾,系统提示“没有可用于当前位置的源代码”,这样反复了几次之后就又会去调用OnInitialUpdate()函数?
      

  4.   

    调用堆栈里,两次调用下面都是CWnd::OnWndMsg()和CWnd::WindowProc()函数,但第二次调用时堆栈里面东西少很多
      

  5.   

    第一次调用应该是CSplitterWnd在CreateView时产生的,第二次调用不知道是哪里来得
      

  6.   

    要么你创建了两个对象,要么你是用SDI
      

  7.   

    你不是不多点了一次File/New菜单??
      

  8.   

    SDJ在处理ID_FILE_NEW的时候会重复使用现有View对象,所以OnInitialUpdate可能被调用多次。
      

  9.   

    每次CDocument::NewDocument都要调用,因为你是多视图,所以...
      

  10.   

    程序代码里已经去掉了文档部分的代码,只有视图结构,这样应该不会产生CDocument::NewDocument调用吧??那应该就是多视图引起OnInitialUpdate被多次调用了。