| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 668 人关注过本帖
标题:RichTextbox控件如何根据自身宽、高,以及用户设定的字体、字号和行距,计算 ...
只看楼主 加入收藏
sych
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:420
专家分:648
注 册:2019-10-11
收藏
得分:0 
Declare INTEGER SendMessage in WIN32API as sendmessage_n INTEGER hwnd , INTEGER wMsg , INTEGER wParam , integer lParam
Declare INTEGER SendMessage in WIN32API as sendmessage_c2 INTEGER hwnd , INTEGER wMsg , INTEGER wParam , string lParam
#defi WM_SETREDRAW 0x0b
SendMessage_n(thisform.Olecontrol5.hwnd, WM_SETREDRAW, 0, 0)  && Lock
#defi EM_REPLACESEL 0xC2
SendMessage_c2(thisform.Olecontrol5.hwnd, EM_REPLACESEL, 1, REPLICATE(CHR(254),2000))  &&填充新字符串,且可撤销
#defi EM_GETFIRSTVISIBLELINE 0XCE
#defi EM_LINEINDEX  0xbb
#defi EM_POSFROMCHAR  0xd6
iFirstLine = SendMessage_n(thisform.Olecontrol5.hwnd, EM_GETFIRSTVISIBLELINE,0,0)
FOR i=0 TO 100
    cpFirst = SendMessage_n(thisform.Olecontrol5.hwnd,EM_LINEINDEX,iFirstLine+i,0)
    aa=SendMessage_n(thisform.Olecontrol5.hwnd, EM_POSFROMCHAR,cpFirst,0)
    aa=BITrSHIFT(aa,16)
    IF i>0
        IF aa=1
            EXIT
        endif
        IF aa>thisform.Olecontrol5.Height
            i=iif(aa>thisform.Olecontrol5.Height+5,i-1,i)  &&判断上一行是否完整显示,这个5是预估值,也可以用获取的行间距
            EXIT
        endif
    ENDIF
next
#defi EM_LINELENGTH 0xC1
MESSAGEBOX( SendMessage_n(thisform.Olecontrol5.hwnd, EM_LINELENGTH, 0,0))
MESSAGEBOX(i)
#defi EM_UNDO  0xc7
SendMessage_n(thisform.Olecontrol5.hwnd, EM_UNDO, 0, 0)  &&撤销填充
SendMessage_n(thisform.Olecontrol5.hwnd, WM_SETREDRAW, 1, 0)  && UnLock
通过这个话题的讨论,学到很多新东西
昨天 10:43
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:378
专家分:916
注 册:2021-11-24
收藏
得分:0 
LZ是想搞 行号显示吗,记得之前好像搜索到这个示例,缺陷是:放大缩小窗口,包括行高、字体的调整,这个行号 对错乱了,无法动态调整。

另: 如果能增加代码块 功能,就更好了(想法:通过代码设计出格式(排版),然后再正常书写代码)。

这样VFP就可以利用 RichEdit 来写笔记了或收藏资料 等。

昨天 10:44
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:489
专家分:372
注 册: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()了?

昨天 11:54
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10698
专家分:43295
注 册:2014-5-20
收藏
得分:0 
回复 53楼 cssnet
EM_GETLINE 支持 RichEdit
要注意的是接收行数据的缓冲区在发送消息之前,将此缓冲区的第一个字节设置为缓冲区的大小(以 TCHAR为单位)。
    对于 ANSI 文本,这是字节数。
    对于 Unicode 文本,这是字数。

昨天 16:27
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:489
专家分:372
注 册: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

昨天 17:01
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10698
专家分:43295
注 册:2014-5-20
收藏
得分:0 
回复 55楼 cssnet
这文件就是一行,返回1、2正常,返回2可能是0D结束符
昨天 17:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10698
专家分:43295
注 册:2014-5-20
收藏
得分:0 
EM_GETLINE不是只取编辑框视区的行,应该是整个编辑内容,用EM_GETLINE来计算行数不准确吧?
昨天 17:23
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:489
专家分:372
注 册: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

大佬啊,这是您亲自贴的代码啊!!!
昨天 17:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10698
专家分:43295
注 册:2014-5-20
收藏
得分:0 
回复 58楼 cssnet
11.txt的0hEE9385是双字节“配”转UTF-8编码?

昨天 18:35
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:489
专家分:372
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-9-5 18:35:52的发言:

11.txt的0hEE9385是双字节“配”转UTF-8编码?


0hEE9385其实是51#的0hFEFE:

c1 = 0hFEFE
c2 = strconv(c1, 9)
c3 = REPLICATE(c2, 2000)
strtofile(c3, "11.txt")

只是随便选的一个空白字符。你也可以用0hA1A1的UTF-8,或者,任意可见字符的UTF-8去试,都行!

昨天 18:46
快速回复:RichTextbox控件如何根据自身宽、高,以及用户设定的字体、字号和行距 ...
数据加载中...
 
   



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

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