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);}
当按下退格键时,虽然原来的字删了,但是留下一些乱码,不知道怎么回事?请好心的高手指教!
{
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);}
当按下退格键时,虽然原来的字删了,但是留下一些乱码,不知道怎么回事?请好心的高手指教!
呵呵,我刚学,请你说详细点……谢谢!
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);
}
前两句是有效的,如果后两句注释掉的话,按退格后,整行都看不到,但是加上后两句就不行啦!
{
// 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);}
//后面已经有了TextOut这里就不需要了 dc.TextOut(m_pOrigin.x,m_pOrigin.y,m_strLine);
这一行是用背景颜色输出字符,目的是使这一行不可见,然后去掉一个字符,改变颜色重新输出
那你把Invalidate();添加在这段代码开头之处试一试
即CClientDC dc(this);之前
可能不能用Invalidate()噢!无论放到哪,都是刚刚输入的全部清除。