int CTEXTView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1; // TODO:  在此添加您专用的创建代码
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();

return 0;
}
void CTEXTView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCaretPos(point);
m_strLine.Empty();    //保存输入的内容
m_ptOrigin=point;    //光标的开始位置 CView::OnLButtonDown(nFlags, point);
}void CTEXTView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
//设置字体
CFont font;
font.CreatePointFont(200,_T("华文行楷"),NULL);
CFont *pOldfont=dc.SelectObject(&font); TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar)
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight; }
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine+=static_cast<char>(nChar);
}

CSize sz=dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt); dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine); dc.SelectObject(pOldfont);
CView::OnChar(nChar, nRepCnt, nFlags);
}以上为部分代码,每次删除时 光标就好像滞留一样,
如下面的“|”代表光标,分别代表原来的文字,删除一个后的显示,删除两个后的显示。每次删除一个字母光标虽然向前移动,但是原来的光标位置的光标仍然存在。 
abcabc
abcab|
abca||
abc|||初学MFC  请各位帮帮忙。只在view类中定义了m_ptOrigin 和 m_strLine 两个变量,其余的改变内容全部提现在上面的代码
再次感谢各位

解决方案 »

  1.   

    else if(0x08==nChar)
        {
            COLORREF clr=dc.SetTextColor(dc.GetBkColor());
            dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);//原长度字串?        m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
            dc.SetTextColor(clr);
        }
    //改
    else if(0x08==nChar)
        {
            COLORREF clr=dc.SetTextColor(dc.GetBkColor());
            m_strLine=m_strLine.Left(m_strLine.GetLength()-1);//少一个
            dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
            dc.SetTextColor(clr);
        }
      

  2.   

    在OnChar()里面加个UpdateWindow试试刷新
      

  3.   

    要不你在  SetCaretPos之前先HideCaret,在之后ShowCaret试试
      

  4.   

    在OnChar()函数中加上:UpdateAllViews(NULL);试试看.
      

  5.   

    HideCaret();          //退格时先隐藏下光标
    else if(0x08==nChar) 
    {
    HideCaret();     
    COLORREF clr=dc.SetTextColor(dc.GetBkColor());
    dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
    m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
    dc.SetTextColor(clr);
    }
    然后在显示
      

  6.   

    楼主的问题我也遇到,解决办法如下:在每条TextOut函数之前隐藏光标,TextOut之后显示光标HideCaret();
    dc.TextOut(******************);
    ShowCaret();问题原因猜测是程序中只有一个ShowCaret()函数,所以如果没有TextOut函数来重写原来的位置,那么原来输出光标的位置显示的光标就无法更新显示了。