| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 168 人关注过本帖
标题:RichTextbox控件如何根据自身宽、高,以及用户设定的字体、字号和行距,计算 ...
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:471
专家分:372
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:11 
RichTextbox控件如何根据自身宽、高,以及用户设定的字体、字号和行距,计算1屏有几行?1行有几列?
看到吹版的这段代码,联想到以前我遇到的那个问题(一直都未能精确地解决):

程序代码:
        DECLARE long SendMessageW   IN user32 as SendMessageW2   long,long,long,string@
        DECLARE long SetWindowTextW IN user32 as SetWindowTextW2 long,string
        #define EM_GETLINE    0x00C4 
        nBufferSize = 2048    && 要足够大
        cBuffer     = BINTOC(nBufferSize,"4rs")+REPLICATE(0h00,nBufferSize+1)
        hEdit       = thisform.hEdit1.hwnd    &&编辑框句柄
        nLineNo     = 9                  &&要取的行号(通常是从0行起)
        nWordCount  = SendMessageW2(hEdit, EM_GETLINE, nLineNo, @cBuffer)
        SetWindowTextW2(hEdit, cBuffer)   && 显示结果


如标题所示:如何计算RichTextbox一屏可完整显示的行数?以及,一列能显示的字符个数?
原因:希望在不出现垂直滚动条的前提下,能够一屏显示完整内容,让用户不必频繁地上下翻滚(注:表单另外设计有翻页按钮)。
问DC,它给出的解答异常复杂,远非类似一个SendMessageW2(hEdit, EM_GETLINE, nLineNo, @cBuffer)就能解决得了的。
想想也是,“宋体,12,N”和“微软雅黑, 16, B”,同一屏能够完整显示的字符行数与列数,结果相差非常大的!

搜索更多相关主题的帖子: 显示 long RichTextbox 用户 计算 
前天 23:13
sych
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:403
专家分:644
注 册:2019-10-11
收藏
得分:0 
这个问题挑战性大,每行可显示的字符数可以变通获取,但不同的字符宽度不同,不知道会不会有所不同
昨天 06:43
sych
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:403
专家分:644
注 册:2019-10-11
收藏
得分:0 
Declare INTEGER SendMessage in WIN32API as sendmessage_n INTEGER hwnd , INTEGER wMsg , INTEGER wParam , INTEGER lParam
#defi EM_LINELENGTH 0xC1
MESSAGEBOX( SendMessage_n(thisform.Olecontrol5.hwnd, EM_LINELENGTH, 0,  0))
每行列数

昨天 07:18
sych
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:403
专家分:644
注 册:2019-10-11
收藏
得分:0 
不同的字符占用的空间不同,这个值会发生变化
昨天 07:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10676
专家分:43295
注 册:2014-5-20
收藏
得分:0 
没用过RichTextbox,随便拖一个试试,有个自动换行的问题,有无禁止自动换行的设置?
init事件:
this.text = REPLICATE("AaBbCcDdEeFfGgHhIiJjKkLlMmNn汉字1234567890",3)
遇到数字号码框不够宽时会自动换行?
图片附件: 游客没有浏览图片的权限,请 登录注册



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

没用过RichTextbox,随便拖一个试试,有个自动换行的问题,有无禁止自动换行的设置?
init事件:
this.text = REPLICATE("AaBbCcDdEeFfGgHhIiJjKkLlMmNn汉字1234567890",3)
遇到数字号码框不够宽时会自动换行?


确实,先前看到你们讨论“获取RichTextbox第N行文字内容”的帖子,恰好我也想到了这个变通的解决方案:
RichTextbox1.init事件:
this.text = REPLICATE(0hA1A1,10000)

然后,用你那一个API得到第1--3行的字符,再分别取lenc(),合计值/3得到平均值,这就是比较精确的一行有多少个字符了吧。
至于一屏有多少列,估计仍得用比较复杂的像素值来计算……

昨天 10:29
wxzd123
Rank: 2
等 级:论坛游民
帖 子:445
专家分:96
注 册:2012-9-6
收藏
得分:0 
太好了,跟着楼主学习了
昨天 11:04
wxzd123
Rank: 2
等 级:论坛游民
帖 子:445
专家分:96
注 册:2012-9-6
收藏
得分:0 
我弄了半天也没搞明白,这回测试一下楼主的代码
昨天 11:05
wxzd123
Rank: 2
等 级:论坛游民
帖 子:445
专家分:96
注 册:2012-9-6
收藏
得分:0 
RichTextbox排版好,可vfp的编辑框Edit1排版不好,但能透明,我想RichTextbox排版完把每行后面加个回车符,然后用Edit1显示,可是没有实现。
昨天 11:10
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:471
专家分:372
注 册:2013-10-4
收藏
得分:0 
以下是引用sych在2025-9-2 07:18:47的发言:

Declare INTEGER SendMessage in WIN32API as sendmessage_n INTEGER hwnd , INTEGER wMsg , INTEGER wParam , INTEGER lParam
#defi EM_LINELENGTH 0xC1
MESSAGEBOX( SendMessage_n(thisform.Olecontrol5.hwnd, EM_LINELENGTH, 0,  0))
每行列数


这个API没问题,能准确返回一行汉字字符的个数!

[此贴子已经被作者于2025-9-2 13:30编辑过]

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



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

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