MFC 文本编程 利用退格键 删除时的 光标问题。 请各位高手帮忙 谢谢!!!!!!!

超gogo 2009-05-28 02:16:51

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 两个变量,其余的改变内容全部提现在上面的代码
再次感谢各位
...全文
358 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜗牛雪步 2012-07-08
  • 打赏
  • 举报
回复
楼主的问题我也遇到,解决办法如下:

在每条TextOut函数之前隐藏光标,TextOut之后显示光标

HideCaret();
dc.TextOut(******************);
ShowCaret();

问题原因猜测是程序中只有一个ShowCaret()函数,所以如果没有TextOut函数来重写原来的位置,那么原来输出光标的位置显示的光标就无法更新显示了。
sgwezz 2010-05-25
  • 打赏
  • 举报
回复
HideCaret(); //退格时先隐藏下光标
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);
}
然后在显示
junying2yu 2009-05-29
  • 打赏
  • 举报
回复
up up
biweilun 2009-05-29
  • 打赏
  • 举报
回复
不是说了让你刷新下么
超gogo 2009-05-29
  • 打赏
  • 举报
回复
UP!!!!!
超gogo 2009-05-29
  • 打赏
  • 举报
回复
坛子里没有人能帮忙仔细回答我的问题吗?????
超gogo 2009-05-29
  • 打赏
  • 举报
回复
请各位告诉一下具体的方法 本人新学 很多地方不明白 希望各位针对我的问题 谢谢
超gogo 2009-05-29
  • 打赏
  • 举报
回复
请问你是怎么试的啊??我重做了也还有这个问题

还有感谢各位的回答 我希望要一个不用隐藏 也不用刷新的方法

我主要是奇怪为什么和教材一样 得出的结果不一样
菜牛 2009-05-29
  • 打赏
  • 举报
回复
隐藏光标、刷新重绘、计算新的光标位置、显示光标。
超gogo 2009-05-28
  • 打赏
  • 举报
回复
要多写几个字母 再删除试试才能看出出现退格键 删除重影
超gogo 2009-05-28
  • 打赏
  • 举报
回复
删除的时候没有重影嘛???
biweilun 2009-05-28
  • 打赏
  • 举报
回复
试过了,没问题
jiujiu45 2009-05-28
  • 打赏
  • 举报
回复
这个视频上有啊!
超gogo 2009-05-28
  • 打赏
  • 举报
回复
请各位帮忙仔细验证一下啊 上面的代码就是改过的地方 其余的都没改 添加的变量 也已经写明

请各位帮忙调试一下 谢谢!!!!!
超gogo 2009-05-28
  • 打赏
  • 举报
回复
同一个代码 我第一次做没问题 第二次就有问题了 我对照了好多遍 一模一样啊 这到底是怎么回事???

超gogo 2009-05-28
  • 打赏
  • 举报
回复
请各位说的明白些啊 谢谢
长尾巴的悟空 2009-05-28
  • 打赏
  • 举报
回复
再好好看看书,或者视频!
用户 昵称 2009-05-28
  • 打赏
  • 举报
回复
你在键盘事件的时候,先隐藏光标。
  • 打赏
  • 举报
回复
需要刷新一下
超gogo 2009-05-28
  • 打赏
  • 举报
回复
up thanks
加载更多回复(11)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧