关于CString::Format问题

adventurelw 2009-07-20 11:42:30
相关代码如下,是用二分法实现光标点击处最近字符位置查找,实现得有点不好,不精确,但问题不是这方面的,代码如下:

int CMainWindow::GetNearestPosPart(const CPoint point, CDC *pDc)
{
CString string = m_strInputText;
int nLen = (pDc->GetTextExtent(string, string.GetLength() / 2)).cx + m_ptTextOrigin.x;
int nIndex = string.GetLength() / 2;
while(string.GetLength() > 1)//必须用大于1而不能用不等于1,否则会死循环
{
if(point.x == nLen)
return nIndex;
else if(point.x < nLen)
{
string = string.Left(nIndex);
nLen -= (pDc->GetTextExtent(string, string.GetLength() / 2)).cx;
nIndex -= string.GetLength() / 2;
}
else
{
string = string.Right(string.GetLength() - nIndex);
nLen += (pDc->GetTextExtent(string, string.GetLength() / 2)).cx;
nIndex += string.GetLength() / 2;
}
}
int nCurLen = (pDc->GetTextExtent(m_strInputText, nIndex)).cx + m_ptTextOrigin.x;//获取字符串到光标点所在字符的长度
int nPreLen = (pDc->GetTextExtent(m_strInputText, nIndex - 1)).cx + m_ptTextOrigin.x;//获取字符串到光标点所在字符的前一个字符的长度
CString str;
str.Format(TEXT("(%d, %d)——%d, %d, %d"), point.x, point.y, nIndex, m_strInputText.GetLength(), nLen);//问题所在
pDc->TextOutW(32, 2 * m_nyChar + 16, str);
pDc->TextOutW(202, 2 * m_nyChar + 16, m_strInputText);
return ((point.x - nPreLen < nCurLen - point.x ? (nIndex - 1) : nIndex));
}

int CMainWindow::GetNearestPos(const CPoint point)
{
if(point.x < m_ptTextOrigin.x)
return 0;

CClientDC dc(this);
int nLen = dc.GetTextExtent(m_strInputText).cx;
if(point.x > m_ptTextOrigin.x + nLen)
return nLen;

return GetNearestPosPart(point, &dc);
}

void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_rcTextBox.PtInRect(point))
{
m_nTextPos = GetNearestPos(point);
PositionCaret();
}
}

相关的TextOut函数是用来查看数据的,其实和程序没有关系,但就是这里有点问题
str.Format(TEXT("(%d, %d)——%d, %d, %d"), point.x, point.y, nIndex, m_strInputText.GetLength(), nLen);
这一步,多次点击鼠标之后,最后一个整数会变得非常大,比如该是100,可能变成5xxxx或者6xxxx,如果把最后一个整数删除(同时删除字符串中的最后一个%d),那么删除之后的最后一个整数也会在点击鼠标数次之后发生异变;同理,计算只剩下第一个,那这个时候它也作为最后一个,仍然会发生异变。。。。。数据没有删除第五个变得那么多罢了,但很明显不对。当m_strInputText.GetLength()这个数据是最后一个时,通过在其后输出这个字符串,却并没有变化,但点击几次鼠标之后数据显示其长度可能会达到几千。。。。。在更多次点击鼠标过程中,也可能会再变回正确的数值。。。。。
求各位帮忙分析一下可能性,不甚感激。
...全文
250 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪影 2009-07-21
  • 打赏
  • 举报
回复
你查看一下你的m_strInputText变量的值,是否有异常。
bragi523 2009-07-21
  • 打赏
  • 举报
回复
前面加个str.Empty();试试
adventurelw 2009-07-21
  • 打赏
  • 举报
回复
就是不太清楚鼠标消息会不会有其它副作用,还是数数据格式化的问题。。。
DarkChampion 2009-07-21
  • 打赏
  • 举报
回复
鼠标点击过多?

mark
youhao1999 2009-07-21
  • 打赏
  • 举报
回复
帮顶
adventurelw 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tttyd 的回复:]
你查看一下你的m_strInputText变量的值,是否有异常。

[/Quote]
pDc->TextOutW(202, 2 * m_nyChar + 16, m_strInputText);
这一步会输出这个变量,是没有异常的。不知道为何数值会出问题?
adventurelw 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bragi523 的回复:]
前面加个str.Empty();试试
[/Quote]
仍然没有变化,还是会产生异常。。。。。。
jyh_baoding 2009-07-21
  • 打赏
  • 举报
回复
帮顶吧,代码有点长

16,472

社区成员

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

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

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