(转)在CRichEditCtrl中如何获取中文字符的位置

VC 从编辑框CEdit或富编辑控件CRichEditCtrl读取大容量文本并写入文件的方法 本文解决编辑框、富编辑控件的内容写入文件时,文本长度太大时写入内容被截断的问题! 读取编辑框内容并写入文件,可能最常用的方法是创建文件,利用GetWindowText, 或GetDlgItemText读取编辑框或富编辑控件(Multiline)的内容到字符串,将字符串buffer写入文件。常见代码如下: CFile file("temp.txt", CFile::modeReadWrite | ... 阅读详情

牢骚牢骚rich edit,他给我找了不小的麻烦,等到中文能选半个字的时候我才知道原来那个东西还有中英文之分的,然而麻烦还不就只是这一点。

 

在2000下或更高版本的OS上,rich edit能接收WM_LBUTTONUP消息,然而98下,只接收一次,第二次就不理你了,至少MFC编译出来的代码是这样,没有在SDK上作过试验。

 

richedit.SetWindowText("a");

 

richedit.SetSel(0,-1);

 

richedit.GetSel(nStart,nEnd);

 

nEnd等于几?

 

1?很可能是3,然而也未必。

 

那你需要看是不是在之前调用过 richedit.SetDefaultFormat()了,调过之后和调过之前肯定是不一样的

 

为何有麻里麻烦

 

richedit.SetWindowText("a");

 

richedit.SetSel(0,-1);

 

richedit.GetSel(nStart,nEnd);

 

为什么不 string.GetLength()呢?

 

问题是GetLength()返回的是字节数,而在VC6下,SetSel()未必就是以字节数来设定选择范围的,拉丁字母,例如,是两个字节然而要选购中一个拉丁字母肯定要 SetSel(nStart,nStart + 1),然而中文又要必须 SetSel(nStart,nStart + 2)了,至于有没有 + 3 ,+4的,我不知道。我碰到这问题后,想得一个偷懒办法就是做一个隐藏的rich edit,例如字符串 ASDL,我要选D,怎么办,我不知道D前有些什么样的字符,那就先把AS放在隐藏rich edit之后,全选再用GetSel得到范围,nEnd就是D的nStart,然后ASD放入隐藏rich edit,如前得到nEnd,那这个范围就可以确保能够选到D了。可要注意两个RichEdit不能一个调用另一个不调用SetDefaultFormat(),否则结果未知。

 

,Net下编译的richEdit统统以字符作为单位,倒免去了这一大堆麻烦,然而还需要与VC 6下的做某种转换,大约是一个偏移量,我记不住了,然而即便.NEt也不能解决WM_LBUTTONUP消息问题,我的解决办法是干脆用鼠标钩子。

 

附:字节索引与字符索引转换函数:

 

int CharIndexToMultiIndex(CString strSrc,int nIndex){

 int nLen = strSrc.GetLength();

 if(nIndex < 0)

  return -1;

 if(nLen <= nIndex )

  nIndex = nLen;

 CString strText = strSrc.Left(nIndex);

 nLen = _mbslen((unsigned char*)(LPCTSTR)strText);

 return nLen;

}

 

int MultiIndexToCharIndex(CString strSrc,int nIndex){

 unsigned char *pCh = (unsigned char*)(LPCTSTR)strSrc;

 char *pChCur = (char*)pCh;

 int nLen = _mbslen(pCh);

 if(nLen < nIndex)

  return strSrc.GetLength();

 if( nIndex < 0)

  return -1;

 for(int i = 0; i < nIndex; i++){

  pChCur = CharNext(pChCur);

 }

 int nRet = (int)pChCur - (int)pCh;

 return nRet;

}

 

小技巧:判断一段文字多少个双字节字符多少个单字节字符函数:

 

 int nBytes = strText.GetLength();

 int nMultiBytes = _mbslen((unsigned char*)(LPCSTR)strText);

 int nChinese = nBytes - nMultiBytes;

 int nEnglish = nBytes - nChinese * 2;

 

常用函数:

CString GetSelText();                 //获得选中的文本内容

GetSel(int st,int end);                //获得选择文本的位置

LimitText(int);                              //限制最大输入文本的大小

LineCount();                                 //行数

Int LineLength(int );                            //行的长度

Int LineIndex(int);                       //行的序号

GetLine();                                     //行的内容

Int n = GetFirstVisibleLine();    //移动滚动条

LineScroll(-n,0);

Cadence Virtuoso Layout 版图绘制 画好原理图,打好pin脚(pin最好以全大写的形式书写,以防后续操作中可能出现Bug) 查看所使用工艺库的design rule文件,确定栅格单位设置大小 在准备绘制的原理图界面启动layout XL/GXL 在layout界面按e,设置网格大小与design rule匹配 直接根据原理图生成版图 根据原理图连接关系显示版图中未连接的飞线 查看和更改原理图与版图中器件对应的链接关系 shift + f:显示器件版图细节 版图的构成:元器件(工艺厂商提供)、器件连接、阱连接、IO和PAD模拟电路 阅读详情

相关推荐

无线图像传输新突破:深度JSCC算法在低带宽环境下的性能实测

本文深入探讨了基于深度学习的信源信道联合编码(JSCC)算法在低带宽无线图像传输中的突破性表现。通过实测数据对比,深度JSCC在低信噪比环境下展现出卓越的鲁棒性,有效对抗传统方案的“悬崖效应”,实现图像质量的平滑下降,为远程医疗、工业巡检等严苛场景提供了新的解决方案。

weixin_29090089的博客 504

在Richedit中查找字符串

【代码】在Richedit中查找字符串。

自学C++,会写HelloWorld 384

OI 生涯回忆录 《Pilgrimage》

前言 于 NOI2020 后写下本文。 本文简单提及了在写作时尚能回忆起来的,在我的 OI 生涯中对我的影响重大的人、事、比赛等。 写作本文,旨在在回忆允许的范围内,对 OI 生涯进行一定程度上的梳理,总结。 开端 入门 我最早接触计算机程序设计,是在小学。 那时候,我的数学成绩不错,就被老师推荐去学习编程。 就这样,我在局前街小学的何静老师的指导下,走上了编程的道路。 小学时的编程,与其说是 “竞赛” ,不如说是 “兴趣班” 。 当时,包括我在内,很多小孩子天性是浮躁的。支撑我对着无聊的代码学下去的,并不

cz_xuyixuan的博客 1万+

MFC总结(一):MFC中文件操作、查找与选择总结(3)

(三)为保存文件选择路径     A. 使用SHBrowseForFolder函数创建一个对话框,用于选择路径。其原型为                     LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi) 其中,返回值是一个指针,一个项目标识符列表,如果用户选择了取消的话,则返回NULL。 输入参数lpbi为BROWSEINFO结构体

茅庐 9582

手把手教你修改miniwiggler配置信息,解决UDE连接问题(附FT_PROG工具下载)

本文详细介绍了如何使用FT_PROG工具修改miniwiggler配置信息,解决UDE连接问题。通过分析FT2232芯片的EEPROM结构,提供从驱动安装到配置烧写的完整流程,帮助开发者实现无缝连接英飞凌TriBoard开发板。文章还包含常见错误解决方案和高级批量配置技巧。

weixin_30919429的博客 373

cuda安装时出现错误 Unable to locate package cuda-toolkit-12-4

cuda安装时出现错误 Unable to locate package cuda-toolkit-12-4

4865

如何解决CRichEditCtrl控件在显示中文时的选择位问题

在较新版本的CRichEditCtrl控件里,中文字符和英文一样,只占一个选择位,这就导致选择操作(主要是GetSel和SetSel函数)针对中文时不正确,在网上查了一下,有人也遇到这个问题,但都没有很好的解决办法。这几天我也遇到这个问题,试验了一下,找到了一个办法。我的应用的目的是要实现滚动显示文本内容,但内容遇到关键字就要高亮显示,并将该关键字所在行的背景色改变。 #include

2031

保姆级教程:用Cesium的Primitive API实现火箭发射全流程动画(含代码避坑)

本文详细介绍了如何使用Cesium的Primitive API实现火箭发射全流程动画,包括模型控制、关节动画和精细时序管理。通过实战代码示例和性能优化技巧,帮助开发者高效构建高复杂度航天仿真系统,显著提升三维可视化效果与运行效率。

weixin_42565652的博客 212

CRichEditCtrl系列讲堂8 解决CEdit/CRichEdit中SetSel错位或者位置判断错误的问题

需求: 在CEdit中查找指定文本然后选中,当然CEdit中会包含汉子以及英文字符,也包括回车换行符, 然后进行查找,第一次标识并选中第一次出现的位置,再次点查找要标识并选中第二次出现位置,如果到达最后一次要从头重新查找。   解答: 问题很简单可能会使用CString来获取窗口的内容 GetWindowText 然后在获取到的CString中进行查找,然后使用

奔跑吧,蜗牛! 1759

走马观碑组智能车竞赛:目标板识别算法优化与实战技巧(基于OpenCV)

本文针对智能车竞赛走马观碑组别的核心挑战,深入探讨了基于OpenCV的目标板识别算法优化与实战技巧。文章系统分析了PVC赛道环境下的光照、运动模糊等干扰因素,详细拆解了从红色矩形定位、透视校正到特征提取与分类的完整流程,并提供了工程优化、速度提升及现场调试的实用策略,旨在帮助参赛队伍构建一套在高速运动中既准又快的鲁棒识别系统。

life6的博客 732

避开SAM3安装大坑:手把手教你用国内镜像和Modelscope权重快速跑通Demo

本文详细介绍了如何在国内环境下快速部署SAM3视觉大模型,包括使用国内镜像加速Python包安装、通过Modelscope获取权重文件以及解决CUDA 11.8等低版本适配问题。手把手教你避开常见安装陷阱,实现高效Demo运行。

weixin_30642561的博客 1406

如何在CRichEditCtrl控件中直接读如RTF格式的文件(这个是通过流的方式来读取文件)...

如何在CRichEditCtrl控件中直接读如RTF格式的文件 Inserting an RTF string using StreamIn -------------------------------------------------------------------------------- When inserting Rich Text Format...

dkopg24406的专栏 338

基于Simulink实现电动汽车制动能量回收系统的仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车制动能量回收系统的仿真研究。该系统能够全面评估制动能量回收系统的性能,验证控制策略的有效性,并通过优化设计提高能量回收效率和制动安全性。引入智能预测:结合人工智能技术,实现更智能的能量回收控制策略。扩展功能:增加对多种车型和制动场景的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 336

MFC中Rich Edit 2.0 控件中字体不一致的问题

最近使用MFC写了一个小程序,开发环境VS2010,使用了Rich Edit 2.0 控件,除了遇到没有任务错误但运行不成功的问题(具体原因可搜索,主要是Rich Edit 2.0需要加载一个dll,需要在dlg的构造函数中添加AfxInitRichEdit()),除此之外,还发现,若给控件添加文字,首行的首字符非汉字,而其后再有汉字和字母的混编的情况下,发现首字符与汉字后面的英文字符的字体不一致

u014624795的博客 923

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

如何在richEdit里面特殊显示某些字符

转自:blog.csdn.net/minpro 如何在richEdit里面特殊显示某些字符 void __fastcall TfrmChild::setTextFormatKey(TRzRichEdit * richEdit) {     richEdit->Paragraph->Alignment = taLeftJustify;     richEdit->SelAttrib

sweet_life的专栏 1366

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Richedit使用大全

 很不错的源代码http://www.pudn.com/search_db.asp?keyword=MyRichEdit&x=36&y=16richedit 常见使用问题一.常见问题a.可以编译,不能执行的在需要在相应的对话框中加上InitInstance(void)函数中添加AfxInitRichEdit();b.升级默认的Riched版本(默认的有一些bug),如可在Ini

qsycn的专栏 5991

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

点击CRichEdit ctrl 后如何获得当前点击位置

点击CRichEdit ctrl 后的消息消息映射 是 OnCaptureChanged 消息, 在这个消息里能够处理 // TODO: 在此处添加消息处理程序代码 long nStart, nEnd; this->GetSel(nStart, nEnd); int a= 1; 就能够获得当前点击位置

carl2380的专栏 664

CRichEditCtrl加载 rtf 文件和字符串的方法

CRichEditCtrl类没有直接赋值 rtf 的方法,需要通过回调函数的方式加载。本文介绍的几种方法,主要用于加载 rtf 字符串。

Python的专栏 3651

CRichEditCtrl 获取单行字符串长度

对于多行RichEdit控件,CRichEditCtrl 提供了获取每行字符长度的函数:LineLength()定义如下:Retrieves the length of a line in a rich edit control. int LineLength( int nLine = -1 ) const;ParametersnLineSpecifies

jtujtujtu的专栏 2657
上一篇: Richedit使用大全
下一篇: (转)vc++获得系统时间的几种方案
skilledprogrammer
博客等级 码龄19年 78粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值