
我是用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);