BCB 中测量Richedit 的文本总行高

RICHEDIT 富文本控件可以容纳各种字体,那么如果我们想要知道文本的总行高如何做呢?

比如,我们想判断,richedit中的文本内容有没有超出richedit 的范围,如何实现呢?

1,需要使用EM_FORMATRANGE 消息  http://msdn.microsoft.com/en-us/library/bb788020%28VS.85%29.aspx

2,实现的代码如下:(下面是BCB 的实现,stackoverflow上有delphi的实现

http://stackoverflow.com/questions/3244139/how-to-get-text-extent-of-richedit-in-delphi)

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    RichEdit1->Text = RichEdit1->Text.TrimRight();
    int LogX,LogY;
    HDC richdc = GetDC(RichEdit1->Handle);
    LogX = GetDeviceCaps(richdc, LOGPIXELSX);
    LogY = GetDeviceCaps(richdc, LOGPIXELSY);

    FORMATRANGE formatrange = {0};
    formatrange.hdc = richdc;
    formatrange.hdcTarget = richdc;
    formatrange.rc.left = 0;
    formatrange.rc.top  = 0;
    formatrange.rc.right = RichEdit1->ClientWidth * 1440 / LogX;
    formatrange.rc.bottom= Screen->Height* 1440 / LogY;
    formatrange.rcPage = formatrange.rc;
    formatrange.chrg.cpMin = 0;
    formatrange.chrg.cpMax = -1;
    RichEdit1->Perform(EM_FORMATRANGE,0,(long)&formatrange);
    int totalHeight = formatrange.rc.bottom * LogY / 1440;
    ShowMessage("文本总高度"+IntToStr(formatrange.rc.bottom * LogY / 1440));
    RichEdit1->Perform(EM_FORMATRANGE,0,NULL);//free the cache

    if (totalHeight > (RichEdit1->ClientHeight+3))
    {
        ShowMessage("文字超出范围!");
    }

    ReleaseDC(RichEdit1->Handle,richdc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    RichEdit1->Font->Size++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    RichEdit1->Font->Size--;
}
//---------------------------------------------------------------------------
时间: 2024-08-30 17:50:18

BCB 中测量Richedit 的文本总行高的相关文章

BCB中获得RichEdit 默认行间距

首先,这些功能支持RichEdit2.0 以上功能: 其次,用常规的方法是无法获得LineSpace 的: 你使用 EM_GETPARAFORMAT也得不到,你会发现dyLineSpacing 的值永远是0 你先EM_SETPARAFORMAT ,指定 bLineSpacingRule = 4,再用GETPARAFORMAT 去取dyLineSpacing 同样是0 也许RichEdit的作者有办法. https://social.msdn.microsoft.com/Forums/window

浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

浅谈android中只使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是只使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.近期公司一直加班也没来得及时间去整理,今天难得歇息想把这个分享给大家.只求共同学习,以及自己兴许的复习. 为什么会想到使用一个TextView来实现呢?由于近期公司在做一些优化的工作,当中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的.实现的代码冗余比較大.故此项目经理就说:小宏这个就交给你来优化了.而且还要保证有一定的扩展性,当时就懵逼了.不知道从何处開始

sql server中如何查看执行效率不高的语句

sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考. 在测量功能时,先以下命令清除sql server的缓存 dbcc freeProcCache 在点击某个按钮,执行完后,再执行下面语句,就可以知道系统运行什么Sql和多少次了,其主要慢语句是那些了; SELECT creation_time  N'语句编译时间'         ,last_execution_time  N'上次执行时间'

[SQL] sql server中如何查看执行效率不高的语句

sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.在测量功能时,先以下命令清除sql server的缓存 dbcc freeProcCache 在点击某个按钮,执行完后,再执行下面语句,就可以知道系统运行什么Sql和多少次了,其主要慢语句是那些了; SELECT creation_time N'语句编译时间' ,last_execution_time N'上次执行时间' ,total_phys

批处理命令get_line获取文本总行数并显示指定行的内容

研究背景 get_line是一个很好的工具,它能快速获取文本内容总行数(不包括空行),并显示指定行内容.它有一个特点,就是计算的总行数不包括空行,也就是说它只统计非空行的行数,对处理矩阵数据非常有用. 使用帮助 获取文本内容总行数(不包括空行),并显示指定行内容. get_line {filename | number} filename           文件名,可包含路径,如有空格需用双引号""括起来 number             指定要显示的行,只能输入整数 在批处理中

Duilib中为RichEdit\Edit控件添加自定义右键菜单

前言 Duilib中的RichEdit控件在使用中发现,基本上对复制.粘贴.剪切等快捷方式都是支持的,不过唯一缺点是没有右键菜单,感觉不够好,于是就想着加上右键菜单. 右键菜单基本思路是,在RichEdit的消息处理函数中对鼠标的右键消息处理,发送一个自定义的Notify消息出来,主窗口中受到这个消息后弹出自己的右键菜单. 实现方法 第一步:把鼠标右键消息转发出来 MessageHandler中修改原有代码 bool bWasHandled = true; if( (uMsg >= WM_MOU

BCB 中 Application->CreateForm 和 New 的一个区别

Application->Create 和 NEW 的一个区别 最近写windows服务的时候,恰巧碰到一个问题.我建立了一个DataModal,然后在Datamodal的OnCreate 事件中创建了另外一个类A的对象a.. a会去访问DataModal的全局指针.相当于下面这个东西: 发现,a访问的DataModal的全局指针有如下2种情况, 如果使用Application->CreateForm 创建,则a可以访问到DataModal的全局指针.即,用下面的方式创建: ? 如果用new的

如何迅速将磁盘中文件目录树结构做成文本保存

如何迅速将磁盘中文件目录树结构做成文本保存 相像一个这样的场景,你自己在磁盘中下载了大量的视频.音乐和书籍,觉得不错要推荐给朋友,直接把资源传输给他/她可能不太方便,这个时候只需要把文件名放在文本中发送即可.下面我们就学习一下如何做到这一点. 首先我们打开命令行.(Win+R,输入cmd,Enter即可). 我们以E盘为例,将E盘KLive文件夹内文件名记录在文本中.切换到E盘路径. 进入KLive目录路径,输入命令查看内部目录. 现在将内容结构复制到文本中. 我们查看E盘变化. 打开conte