读书人

MFC文本安插符残留

发布时间: 2013-02-15 15:46:56 作者: rapoo

MFC文本插入符残留
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);





TEXTMETRIC tm;

dc.GetTextMetrics(&tm);

CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();



dc.SelectObject(pOldFont);


return 0;
}





BOOL CTextView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)


{

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

CharSize = CharSize + int(zDelta);

return CView::OnMouseWheel(nFlags, zDelta, pt);

}

MFC vs2010 VC++ vc6
[解决办法]
发代码的时候用C++格式吧,别人好看一点啊
[解决办法]
引用:
引用:发代码的时候用C++格式吧,别人好看一点啊
抱歉,第一次发帖。
这个代码是我截取的一段,我也不知道错在哪。
还请见谅。


明天我看看,今天太晚了。。。。。。。。
[解决办法]
去VC/MFC论坛问问?

读书人网 >C++

热点推荐