我写了一个类似文本编辑的小程序,现在能实现的功能只有 回车换行,退格和光标跟着鼠标移动
可是,退格的功能只能删除一行的字符,如果这一行所有字符都删除了,不能到上一行进行退格
不知道该怎么做?
还有如果想在鼠标的位置进行退格应该怎么做?
请朋友们指点。。。
代码部分如下:
(假如所有的变量和函数都已经定义过了)
m_StringLen——保存输入的字符
void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetCaretPos(point);//使光标移动到鼠标左键点下的位置
m_StringLen.Empty();
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);
}
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); //得到字体的信息
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);//利用字体的信息来确定光标的高度和宽度
ShowCaret();
return 0;
}
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar)//处理回车
{
m_StringLen.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
else if(0x08==nChar)//对退格键进行处理
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());//将文本设置成背景色
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_StringLen);
m_StringLen=m_StringLen.Left(m_StringLen.GetLength()-1);//从左边开始保存文本长度-1的字符
dc.SetTextColor(clr);
}
else
{
m_StringLen+=nChar;
}
CSize sz=dc.GetTextExtent(m_StringLen);//得到字符在屏幕上占据的范围
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;//X坐标为原来坐标加上字符的宽度
pt.y=m_ptOrigin.y;
SetCaretPos(pt);//使光标跟着输入的字符
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_StringLen);
CView::OnChar(nChar, nRepCnt, nFlags);
}