int CTEXTView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1; // TODO: 在此添加您专用的创建代码
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
return 0;
}
void CTEXTView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCaretPos(point);
m_strLine.Empty(); //保存输入的内容
m_ptOrigin=point; //光标的开始位置 CView::OnLButtonDown(nFlags, point);
}void CTEXTView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
//设置字体
CFont font;
font.CreatePointFont(200,_T("华文行楷"),NULL);
CFont *pOldfont=dc.SelectObject(&font); TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar)
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight; }
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine+=static_cast<char>(nChar);
}
CSize sz=dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt); dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine); dc.SelectObject(pOldfont);
CView::OnChar(nChar, nRepCnt, nFlags);
}以上为部分代码,每次删除时 光标就好像滞留一样,
如下面的“|”代表光标,分别代表原来的文字,删除一个后的显示,删除两个后的显示。每次删除一个字母光标虽然向前移动,但是原来的光标位置的光标仍然存在。
abcabc
abcab|
abca||
abc|||初学MFC 请各位帮帮忙。只在view类中定义了m_ptOrigin 和 m_strLine 两个变量,其余的改变内容全部提现在上面的代码
再次感谢各位
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);//原长度字串? m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
//改
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);//少一个
dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
dc.SetTextColor(clr);
}
else if(0x08==nChar)
{
HideCaret();
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);
dc.SetTextColor(clr);
}
然后在显示
dc.TextOut(******************);
ShowCaret();问题原因猜测是程序中只有一个ShowCaret()函数,所以如果没有TextOut函数来重写原来的位置,那么原来输出光标的位置显示的光标就无法更新显示了。