我定义了一个类(从类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后发生的)
需要实现类似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后发生的)
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;
}
AfxAssertValidObject(const CObject*,const char*,
CWnd::GetTopLevelParent()
CWinThread::PreTranslateMessage(tagMsg*)
CWinThread::PumpMessage()
CWinThread::Run()
CWinApp::Run()
AfxWinMain(HINSTANCE *, HINSTANCE *,
YunLion(静静的想) 不对啊,我通过设置断点发现程序 在函数CMyView::OnEndlabeledit
运行到strNewName(pTVDispInfo->item.pszText); strNewName 为空,运行后,正常退出该函数时,出现上述错误的请高人支招啊!
theCtrl.GetEditControl()->GetWindowText(sNewText);
用这个试试。
[email protected]
{
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;
}