int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);

bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();

return 0;
}void CTextView::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
m_pOrigin=point;
m_strLine.Empty();
         SetCaretPos(m_pOrigin);


CView::OnLButtonDown(nFlags, point);
}void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CFont font;
font.CreatePointFont(200,"新宋体",NULL);
CFont *poldFont=dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);


if(0x0d==nChar)
{
m_strLine.Empty();
m_pOrigin.y+=tm.tmHeight;

}
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_pOrigin.x,m_pOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);

}
else
{
m_strLine+=nChar;
}
CSize sz=dc.GetTextExtent(m_strLine);
CPoint m_pCaretPos;

m_pCaretPos.x=m_pOrigin.x+sz.cx;
m_pCaretPos.y=m_pOrigin.y;
SetCaretPos(m_pCaretPos);
dc.TextOut(m_pOrigin.x,m_pOrigin.y,m_strLine);
dc.SelectObject(poldFont);


CView::OnChar(nChar, nRepCnt, nFlags);}
当按下退格键时,虽然原来的字删了,但是留下一些乱码,不知道怎么回事?请好心的高手指教!

解决方案 »

  1.   

    在你调用TextOut之间调用一下Invalidate试一试
      

  2.   

    是调用TextOut之前吗?
    呵呵,我刚学,请你说详细点……谢谢!
    else if(0x08==nChar) 

    COLORREF clr=dc.SetTextColor(dc.GetBkColor()); 
    dc.TextOut(m_pOrigin.x,m_pOrigin.y,m_strLine); 
    m_strLine=m_strLine.Left(m_strLine.GetLength()-1); 
    dc.SetTextColor(clr); 
    }
    前两句是有效的,如果后两句注释掉的话,按退格后,整行都看不到,但是加上后两句就不行啦!
      

  3.   

    void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
    CFont font;
    font.CreatePointFont(200,"新宋体",NULL);
    CFont *poldFont=dc.SelectObject(&font);
    TEXTMETRIC tm;
    dc.GetTextMetrics(&tm);
    if(0x0d==nChar)
    {
    m_strLine.Empty();
    m_pOrigin.y+=tm.tmHeight;}
    else if(0x08==nChar)
    {
    COLORREF clr=dc.SetTextColor(dc.GetBkColor());
    //后面已经有了TextOut这里就不需要了 dc.TextOut(m_pOrigin.x,m_pOrigin.y,m_strLine);
    m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
    dc.SetTextColor(clr);}
    else
    {
    m_strLine+=nChar;
    }
    CSize sz=dc.GetTextExtent(m_strLine);
    CPoint m_pCaretPos;m_pCaretPos.x=m_pOrigin.x+sz.cx;
    m_pCaretPos.y=m_pOrigin.y;
    SetCaretPos(m_pCaretPos);
    Invalidate();//在这里添加
    dc.TextOut(m_pOrigin.x,m_pOrigin.y,m_strLine);
    dc.SelectObject(poldFont);
    CView::OnChar(nChar, nRepCnt, nFlags);} 
      

  4.   

    好像不行,加上后,刚刚显示在上面,不按退格就什么也没有了,这个程序是想按退格后,删除一个字符,另外
    //后面已经有了TextOut这里就不需要了 dc.TextOut(m_pOrigin.x,m_pOrigin.y,m_strLine);
    这一行是用背景颜色输出字符,目的是使这一行不可见,然后去掉一个字符,改变颜色重新输出
      

  5.   

    哦 
    那你把Invalidate();添加在这段代码开头之处试一试
    即CClientDC dc(this);之前
      

  6.   

    void Invalidate( BOOL bErase = TRUE );ParametersbEraseSpecifies whether the background within the update region is to be erased.ResInvalidates the entire client area of CWnd。
    可能不能用Invalidate()噢!无论放到哪,都是刚刚输入的全部清除。