| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 2054 人关注过本帖, 1 人收藏
标题:RichTextbox控件如何根据自身宽、高,以及用户设定的字体、字号和行距,计算 ...
取消只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
以下是引用sych在2025-9-4 08:51:36的发言:

全角空格


唉,冰雪聪明如我,怎么可能想不到呢?
——不行。
其实我还试过:100个【回车】,100个【全角空格+回车】,……
——不行。准确地说,不太行。
richtextbox对于不可见空白字符的解析似乎存在一些问题,【宋体】会解析错误,多出来好几行,【微软雅黑】倒可能是正确的。

2025-09-04 10:22
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
以下是引用sych在2025-9-4 11:03:36的发言:

只能说你一点也不像我
*thisform.Olecontrol5.font.name="宋体"
thisform.Olecontrol5.font.name="微软雅黑"
thisform.Olecontrol5.text=REPLICATE(CHR(254),2000)


想不到还有0hFEFE这个空白汉字!我老人家墙都不扶就服你!
2025-09-04 11:36
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
其实,冰雪聪明的我,还想过,要不要插入N行模样像Word行尾那一个“带弯弯的小箭头”(U+21B5),以冒充回车符,蒙骗用户的……只可惜,GBK编码表中没有对应的字符。
2025-09-04 11:44
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
以下是引用sych在2025-9-4 11:03:36的发言:

只能说你一点也不像我
*thisform.Olecontrol5.font.name="宋体"
thisform.Olecontrol5.font.name="微软雅黑"
thisform.Olecontrol5.text=REPLICATE(CHR(254),2000)


其实,实战中仍会有一个小瑕疵的:

假设,richtextbox1中原有两三行文字(注:我老人家一般习惯是thisform.richtextbox1.text = REPLICATE("一二三四五", 7),这样方便数一行有几个字);
现在,需计算一屏有几多行——按照前边的讨论,我们可能会这么做:

* --------------
* 保存现场
* --------------
_screen.LockScreen = .t.
with thisform.richtextbox1
   lnSelstart = lo1.Selstart
   lcRTF = .textRTF
   lcText = .text + REPLICATE(CHR(254), 2000)
   .visible = .f.
   .text = lcText
* 统计一屏总行数(见上边帖子,略。)
* ...
* --------------
* 恢复现场
* --------------
   .textRTF = lcRTF
   .Selstart = lnSelstart
   .visible = .T.
endwith
_screen.LockScreen = .F.

该死的屏幕,执行至此,总会闪一下!
无论如何设置,都会闪一下!
那么,聪明的,如何教他不要闪,只做一个安静的美男子呢?
2025-09-04 16:02
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-9-4 17:08:41的发言:

用text方法输入会清除用EM_SETPARAFORMAT设置的字体属性,也就是说设置的行间距无效。


确实,我也发现了:Richtextbox的行距有些“飘忽不定”,想得到的一个折中的解决方案是:
在.text = "xxxx"后,重设一遍行距。
直觉行。

2025-09-04 17:19
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
以下是引用sych在2025-9-4 20:08:10的发言:
注释掉这几句,我测试没有闪一下
*_screen.LockScreen = .t.
*   .visible = .f.
*   .visible = .T.
*_screen.LockScreen = .F.


大致明白了,谢谢!不过,设置thisform.LockScreen = .t.应无坏处,理论上。


2025-09-04 20:52
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-9-4 23:57:43的发言:
参考示例,没有精准测试。


哇!牛逼 Turbo!牛逼 Ultra!
有C代码就好办啦,我想想办法,看能否翻译成VFP原生代码(估计DC能帮忙搞定一大半!最后自己再适当地修补一下下。)
有界面的东东,还是习惯赤条条不带个拖油瓶。

2025-09-05 00:13
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
我尝试往Richtextbox灌满Unicode字符,然后,上边讨论的获取行字符数的两个API皆阵亡,都只能返回1或2者啦——

nWordCount = SendMessageW2(hEdit, EM_GETLINE, nLineNo, @cBuffer)
nWordCount = SendMessage_n(thisform.Olecontrol5.hwnd, EM_LINELENGTH, 0,  0)

感觉上,是不是要改换SendMessageW()了?

2025-09-05 11:54
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-9-5 16:27:40的发言:

EM_GETLINE 支持 RichEdit
要注意的是接收行数据的缓冲区在发送消息之前,将此缓冲区的第一个字节设置为缓冲区的大小(以 TCHAR为单位)。
    对于 ANSI 文本,这是字节数。
    对于 Unicode 文本,这是字数。


试了,不行,仍返回行字符数 = 2

参考的是此帖:
https://bbs.bc-cn.net/viewthread.php?tid=514450&page=6#pid2792983

将"11.txt"换成这一个空白字符:
11.txt (5.86 KB)


然后统计一行的字符数,要么=1,要么=2

2025-09-05 17:01
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:511
专家分:376
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-9-5 17:23:30的发言:

EM_GETLINE不是只取编辑框视区的行,应该是整个编辑内容,用EM_GETLINE来计算行数不准确吧?


见本帖顶楼,以及:
https://bbs.bc-cn.net/viewthread.php?tid=514468&page=2#pid2793162

大佬啊,这是您亲自贴的代码啊!!!
2025-09-05 17:27
快速回复:RichTextbox控件如何根据自身宽、高,以及用户设定的字体、字号和行距 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022031 second(s), 12 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved