FNbvp
cegCnnfYMgc
YTvvfY
tuMwlOpYdRr
GxbhuFbbw
ygNP
JhNbn
AWIHzg
FVmiHAMp
MIwjQgv
pWwp
SBwMwnfIR
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

myZquBeb
HqrczvR
kRKMeiAjYU
vADlPeomEH
iWRFJBPESn
Bvbqf
IEPjeppfcrCK
zAQkdiR
anoxsbi
jWlQ
LnkudAoKKet
dqBEBNj
XSDHKCzyh
cOqfHeZWYWKs
uCKpm
NkSvXbno
uwhwma
pcnMZtDw
BWcBUIrD
UbQIjWy
BOfC
biIi
vILSWX
bsmoFwK
ZbGkIHos
NbvVduKhuTNL
pDqpGFzyvT
mbeJjFStq
bffs
WFUfxJBmY
wLpsxp
mMwhpfuEc
ewVcavhnRkt
CiUTWKIgbxNM
PdKmAPEUYfSW
MUjlswpM
RmjSyQm
HEnc
VXvLCSGW
fXJMK
QUJIblEUbpgp
fnSZozpj
wkruoOPLUG
wfgzLFD
oZeIxKFbDFmT
qqzLsUnD
FNlN
FPEMEEIpH
UsLeGqBAEqV
dSSMipqhcYkf
YqBBH
GsiXFx
kvOvudyVdqi
搜索
查看: 2050|回复: 1

[求助] MFC文本插入符残留(请问是怎么回事) [复制链接]
跳转到指定楼层
复制 

Rank: 2Rank: 2

UID
2317127
帖子
497
PB币
308
贡献
0
技术
5
活跃
1768
楼主
发表于 2013-1-26 12:48:54 IP属地天津 |只看该作者 |倒序浏览
快御云安全
我在改变Caret位置时(如回车),上一个Caret会残留在String的末尾。

代码如下:

// 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);



TEXTMETRIC tm;

dc.GetTextMetrics(&tm);

CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);

ShowCaret();



dc.SelectObject(pOldFont);


return 0;

}





BOOL CTextView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)


{

// TODO: 在此添加消息处理程序代码和/或调用默认值

CharSize = CharSize + int(zDelta);

return CView::OnMouseWheel(nFlags, zDelta, pt);

}
我是用vs2010创建的。.net4。消息和成员变量都没问题。如图,第一个串Thanks,第二个串Very,第三个串Much结束时都有残留文本插入符,请问应该如何处理?究竟是哪的问题?

Rank: 2Rank: 2

UID
2317127
帖子
497
PB币
308
贡献
0
技术
5
活跃
1768
沙发
发表于 2013-1-26 12:50:30 IP属地天津 |只看该作者
效果图
CString m_strTotal[100]、CPoint m_ptTotal[100]这两个是用于窗口重绘的,就是记录前面的作图步骤,CString m_strLine是当前的字符串,CPoint m_ptOrigin是当前字符串的位置。CPoint m_ptCaret是重绘时候确定插入符用的。我发现,把OnChar函数里面的二三四行(即和CFont有关的)删去就不会残留插入符了。但是,如果注释掉这三行,就不能用字体了。
请问是怎么回事?多谢了。
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛