我定义了一个类(从类CTreeCtrl中派生的)CMyTreeCtrl,
需要实现类似Windows资源管理器的树状结构(如:新建、删除、重命名等);现在重命名的功能不太稳定,主要是不能实现在重命名状态下(即:用户输入新的名称时,)再次按一下鼠标(左或右)键,(准备选择原来的部分名称进行copy操作时),程序便出现了异常:Debug Assertion Failed!   以及  “终止、重试、忽略”三个按钮;
     按忽略,程序还可以运行;
     按“重试”,程序进入以下异常处:#ifdef _DEBUG
void CWnd::AssertValid() const
{
if (m_hWnd == NULL)
return;     // null (unattached) windows are valid // check for special wnd??? values
ASSERT(HWND_TOP == NULL);       // same as desktop
if (m_hWnd == HWND_BOTTOM)
ASSERT(this == &CWnd::wndBottom);
else if (m_hWnd == HWND_TOPMOST)
ASSERT(this == &CWnd::wndTopMost);
else if (m_hWnd == HWND_NOTOPMOST)
ASSERT(this == &CWnd::wndNoTopMost);
else
{
// should be a normal window
ASSERT(::IsWindow(m_hWnd));
//程序停在了这儿!this 变量的成员大部分是0x000000;变量m_hWnd的Value有个地址,但是展开来,就变成了unused   -858993460;
请问高人是哪儿出了问题?如何去除该异常?
(附:我 重命名的主要代码是 通过调用函数 EditLabel  OnEndlabeledit OnEndlabeledit实现的;上述问题是在调用OnEndlabeledit后发生的)

解决方案 »

  1.   

    m_pCtrl 是定义好的CTreeCtrl 派生的变量
    void CMyTreeView::OnRename() 
    {
    HTREEITEM hti; hti = m_pCtrl->GetSelectedItem();
    m_pCtrl->EditLabel(hti);
    }
    void CMyTreeView::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; // Limit text to 30 characters
    CEdit *pEdit;
    pEdit = m_pCtrl->GetEditControl();
    pEdit->SetLimitText(30
    *pResult = 0;
    }void CMyView::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; // Called at exit from Edit Mode
    pTVDispInfo = (TV_DISPINFO *)pNMHDR;
    if (pTVDispInfo->item.pszText != NULL)
    {
    pTVDispInfo->item.mask = TVIF_TEXT;
    m_pCtrl->SetItem(&pTVDispInfo->item);
    }
    CString strNewName(pTVDispInfo->item.pszText);
    //以下是对新节点的名称strNewName的保存(略)
    *pResult = 0;
    }
      

  2.   

    堆栈的信息为:(从上倒下)CWnd::AssertValid()
                              AfxAssertValidObject(const CObject*,const char*,
                              CWnd::GetTopLevelParent()
                              CWinThread::PreTranslateMessage(tagMsg*)
                              CWinThread::PumpMessage()
                              CWinThread::Run()
                              CWinApp::Run() 
                              AfxWinMain(HINSTANCE *, HINSTANCE *,
      

  3.   

    对啊,就是没有只想我的代码啊!所以我一直搞不懂!是哪儿让变量m_hWnd(Value有个地址,但是展开来,就变成了unused   -858993460;)出了问题!我响应了鼠标的消息,分别为:OnLButtonDblClk ()和OnLButtonDown ()和OnLButtonUp难道要设个标记,屏蔽掉这些函数吗?
      

  4.   

    不是,只要在OnLButtonDown里面设置一个断点,应该是程序跑这里了,你再查查看是不是这出错了。
      

  5.   

    To:  
           YunLion(静静的想) 不对啊,我通过设置断点发现程序 在函数CMyView::OnEndlabeledit
    运行到strNewName(pTVDispInfo->item.pszText); strNewName 为空,运行后,正常退出该函数时,出现上述错误的请高人支招啊!
      

  6.   

    CString sNewText;
    theCtrl.GetEditControl()->GetWindowText(sNewText);
    用这个试试。
      

  7.   

    msn发送消息界面中的“隐藏窗口框架”和“更改窗口的配色方案”是怎么实现的,请大家谈谈呀
      

  8.   

    代码发给我看看。
    [email protected]
      

  9.   

    send your code [email protected]
      

  10.   

    void CMyTreeView::OnRename() 
    {
             HTREEITEM Hit = m_TreeView.GetSelectedItem();
    m_TreeView.EditLabel(Hit);
    m_TreeView.GetEditControl();
    }
    void CMyTreeView::OnEndlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
    // TODO: Add your control notification handler code here

    HTREEITEM Hit = m_TreeView.GetSelectedItem();
    CString S = m_TreeView.GetItemText(Hit);
    CString S1 = pTVDispInfo->item.pszText;
    if(S1!="")
    {
    m_TreeView.SetItemText(Hit,S1);
    }
    else
    {
    m_TreeView.SetItemText(Hit,S);
    }
    m_TreeView.Invalidate(true); *pResult = 0;
    }