如题,不多话,直接贴Codevoid CHTMLHelperDlg::OnChangeEdit()
{
// TODO:  如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
m_EDIT.GetWindowTextW(m_strCurrText);
m_EDIT.GetSel(m_nSelIndex,m_nSelEnd); CFloatWnd * pFloatDlg = new CFloatWnd;//创建浮动窗口 if(IsInputCss())
{
m_bIsFloatWnd = true;
SetTimer(0,1,NULL);//控制窗口焦点
CFloatWnd * pFloatDlg = new CFloatWnd;//创建浮动窗口
pFloatDlg->m_nSelX = m_EDIT.GetCaretPos().x;//获取光标相对于编辑区的X坐标
pFloatDlg->m_nSelY = m_EDIT.GetCaretPos().y;//Y坐标
pFloatDlg->Create(IDD_DIALOG_FLOATWND,NULL);
m_hFloatWnd = pFloatDlg->GetSafeHwnd();//保存浮动窗口句柄,用于销毁
pFloatDlg->ShowWindow(SW_SHOW);//显示
}
else
{
return;
}

if(!pFloatDlg->HasString(m_strCurrText.Left(m_nSelIndex).Right(1)))//无匹配
{
m_bIsFloatWnd = false;
::DestroyWindow(m_hFloatWnd);
delete pFloatDlg;
}
else//更新浮动窗口位置
{
pFloatDlg->SetWindowPos(&wndTopMost,
m_EDIT.GetCaretPos().x+15,
m_EDIT.GetCaretPos().y+73,
0,0,SWP_NOSIZE);
}
}// 检索用户输入的字符串是否存在于ListBox
bool CFloatWnd::HasString(CString strInput)
{
CString strTemp;
int nListCount = m_ListFloat.GetCount();
if(nListCount<1)//空间中已无匹配内容
{
return false;
}
int nRemoveIndex[28];
for(int i = 0;i < nListCount;i++)//获取不匹配项的索引位置
{
m_ListFloat.GetText(i,strTemp);
if(strTemp.Left(strInput.GetLength()).Find(strInput) < 0)
{
nRemoveIndex[i] = 1;
}
}
for(int i = 0;i < nListCount;i++)//移除不匹配项
{
if(nRemoveIndex[i] == 1)
{
m_ListFloat.DeleteString(nRemoveIndex[i]);
}
}
return true;
}
BOOL CFloatWnd::OnInitDialog()
{
CDialogEx::OnInitDialog();
//ListBox的AddString()若干行
SetWindowPos(&wndTopMost,m_nSelX+15,m_nSelY+73,0,0,SWP_NOSIZE);
}现在的问题是运行到HasString()里m_ListFloat.GetCount();时,发生重绘(WM_PAINT)。
紧接着就是异常:afxwin2.inl——Line:752
我跟踪了一下,此行是_AFXWIN_INLINE int CListBox::GetCount() const
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0); }
并且此时m_hWnd 0x00000000 {unused=??? },
我想知道为什么ListBox的句柄会出错?有什么解决办法?