当前位置: 代码迷 >> C++ >> MFC文本安插符残留
  详细解决方案

MFC文本安插符残留

热度:7239   发布时间:2013-02-26 00:00:00.0
MFC文本插入符残留
我在改变Caret位置时(如回车),上一个Caret会残留在String的末尾。
我是用vs2010创建的。.net4。消息和成员变量都没问题。如图,第一个串Thanks,第二个串Very,第三个串Much结束时都有残留文本插入符,如图。请问应该如何处理?究竟是哪的问题?

这个问题已经困扰我好久了,请大家帮帮忙。非常感谢。先谢谢大家了。
CString m_strTotal[100]、CPoint m_ptTotal[100]这两个是用于窗口重绘的,就是记录前面的作图步骤,CString m_strLine是当前的字符串,CPoint m_ptOrigin是当前字符串的位置。CPoint m_ptCaret是重绘时候确定插入符用的。我发现,把OnChar函数里面的二三四行(即和CFont有关的)删去就不会残留插入符了。但是,如果注释掉这三行,就不能用字体了。请问是怎么回事?多谢了。

还有,树上的代码和这个功能一样,在vc6上编译就没有插入符残留,在vs2010上就有。请问何故?



代码如下:
// CTextView 消息处理程序


void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

 // TODO: 在此添加消息处理程序代码和/或调用默认值

 CClientDC dc(this);

 

 CFont font;

 font.CreatePointFont(CharSize,L"华文行楷",NULL);

 CFont *pOldFont = dc.SelectObject(&font);

 

 TEXTMETRIC tm;

 dc.GetTextMetrics(&tm);

 if(0x0d == nChar){                    //回车符

  m_strTotal[count] = m_strLine;

  m_strLine.Empty();

  m_ptOrigin.y = m_ptOrigin.y + tm.tmHeight;

  m_ptTotal[count] = m_ptOrigin;

  count++;

 }

 else if(0x08 == nChar){               //退格符

  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);

  m_strTotal[count] = m_strTotal[count].Left(m_strTotal[count].GetLength()-1);

  dc.SetTextColor(clr);

 }else{

  m_strLine = m_strLine + char(nChar);

  m_strTotal[count] = m_strTotal[count] + char(nChar);
 }

 

 CSize sz = dc.GetTextExtent(m_strLine);


 CPoint pt;

 pt.x = m_ptOrigin.x + sz.cx;
 pt.y = m_ptOrigin.y;

 

 SetCaretPos(pt);

 m_ptCaret = pt;

 dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);

 dc.SelectObject(pOldFont);

 CView::OnChar(nChar, nRepCnt, nFlags);}


void CTextView::OnLButtonDown(UINT nFlags, CPoint point)

{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

 

 m_ptCaret = point;


 SetCaretPos(point);

 m_strTotal[count] = m_strLine;

 m_strLine.Empty();

 m_ptOrigin = point;

 m_ptTotal[count] = point;

 count++;

 CView::OnLButtonDown(nFlags, point);
}

 


int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 

 // TODO:  在此添加您专用的创建代码


 CClientDC dc(this);

 

 CFont font;

 font.CreatePointFont(CharSize,L"华文行楷",NULL);

 CFont *pOldFont = dc.SelectObject(&font);
  相关解决方案