BCB中获得RichEdit 默认行间距

首先,这些功能支持RichEdit2.0 以上功能;

其次,用常规的方法是无法获得LineSpace 的;

  • 你使用 EM_GETPARAFORMAT也得不到,你会发现dyLineSpacing 的值永远是0
  • 你先EM_SETPARAFORMAT ,指定 bLineSpacingRule = 4,再用GETPARAFORMAT 去取dyLineSpacing 同样是0

也许RichEdit的作者有办法。

https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/f67f6416-eab3-4aee-bfcc-85b9f26fde39/rich-edit-control-line-height

下面是richedit 作者的blog

https://blogs.msdn.microsoft.com/murrays/2010/01/12/richedit-versions-1-0-through-3-0/#comment-12105

下面是我的解决办法。

我发现了一个规律,当用EM_SETPARAFORMAT ,改变行间距的时候。整体文本区域的高度也改变了。

代码如下

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

static int LineSpace = 400;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    RichEdit1->SelectAll();
    PARAFORMAT2 Para;
    Para.cbSize = sizeof(Para);
    Para.dwMask = PFM_LINESPACING;
    Para.bLineSpacingRule = 4;
    Para.dyLineSpacing = LineSpace;
    SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para));
}
//---------------------------------------------------------------------------

由此我们得到启发,如果我们1开始,制定LinSpace 是1,然后逐渐累加。

当,文本区域的高度和默认文本高度相同时,是不是就得到,LineSpace 对应的值了呢?

问题1,如何得到文本区域的高度?  看我的另一个博客 http://www.cnblogs.com/songr/p/5485187.html

问题2,计算,这个超级简单;

下面是实现代码

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

static int LineSpace = 400;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    RichEdit1->SelectAll();
    PARAFORMAT2 Para;
    Para.cbSize = sizeof(Para);
    Para.dwMask = PFM_LINESPACING;
    Para.bLineSpacingRule = 4;
    Para.dyLineSpacing = LineSpace;
    SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para));
}
//---------------------------------------------------------------------------

int TForm1::getTextAreaHeight()
{
    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;
    RichEdit1->Perform(EM_FORMATRANGE,0,NULL);
    ReleaseDC(RichEdit1->Handle,richdc);
    return totalHeight;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
//首先将RichEdit 设置成默认Single spacing
    RichEdit1->SelectAll();
    PARAFORMAT2 Para;
    Para.cbSize = sizeof(Para);
    Para.dwMask = PFM_LINESPACING;
    Para.bLineSpacingRule = 0;
    SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para));
//得到默认情况下的文本区域高度
    int defTextAreaHeight = getTextAreaHeight();
    int i = 0;
    do
    {
//不停的改变行间距,直到文本区域高度和默认情况下相同
        i++;
        PARAFORMAT2 Para;
        Para.cbSize = sizeof(Para);
        Para.dwMask = PFM_LINESPACING;
        Para.bLineSpacingRule = 4;
        Para.dyLineSpacing = i;
        SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para));
    }
    while (defTextAreaHeight != getTextAreaHeight());

    ShowMessage(IntToStr(i));
}
//---------------------------------------------------------------------------

说明,当累加到 278 的时候,文本区域的高度相同了。也就是说,278 是,默认行高的基准线。

有了这个基准线之后。我就可以用这个278 作为,我们计算行高的基础值了。(例如,减少行高时,不能小于这个值。)

时间: 2024-08-30 13:01:58

BCB中获得RichEdit 默认行间距的相关文章

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

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

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

Action 名称搜索顺序&amp;Action配置中的各项默认值

Action 名称的搜索顺序  一级一级往上,若命名空间包存在,但Action不存在,则跑到默认命名空间. Action 配置中的各项默认值    默认类class:ActionSupport    默认方法method:action的 execute    默认result name :success

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

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

【Struts2学习笔记(2)】Action配置中的各项默认值和Action中result的各种转发类型

一.Action配置中的各项默认值 <span style="font-size:18px;"><package name="itcast" namespace="/test" extends="struts-default"> <action name="helloworld" class="cn.itcast.action.HelloWorldAction&quo

style.css项目中的自定义款式用来覆盖Bootstrap中的一些默认设置

这里有两个关键点,其间"bootstrap.cssBootstrap中的根本款式文件,只需运用Bootstrap就必需调用这个文件.而 bootstrap-responsive.css则能够依据你喜好来挑选,假如想让项目具有呼应式规划的作用,就必需求调用这个款式文件,并且调用必需遵从先后顺序,bootstrap-responsive.css必需放置在bootstrap.css以后,不然便不具有呼应式规划功用.而最终的style.css项目中的自定义款式,用来覆盖Bootstrap中的一些默认设置

如何以编程方式打印到在 MFC 中的非默认打印机

http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105790245b09c0252bd7a74a2485d315d2390f07506694ea7a7d0d5d83d87f6305ac4957f7b86c65377571eb8f8dd50a8bb485582a9f5631671df65663d50edcba5154cb37e12efeae69f0caf625e7aec5a5de4320c944040a9780fb4d7467&p

WAMP中修改mysql默认空密码

WAMP中如何修改mysql默认空密码 WAMP安装好后,mysql教程密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作.首先,通过WAMP打开mysql控制台.提示输入密码,因为现在是空,所以直接按回车.然后输入 use mysql 意思是使用mysql这个数据库教程,提示"Database changed"就行.然后输入要修改的密码的sql语句 update user set password=PASSWORD('root') where use

转:centos中vsftp修改默认路径

如果是默认安装vsftpd的话,以下是一些文件的位置约定:/usr/sbin/vsftpd —- VSFTPD的主程序/etc/rc.d/init.d/vsftpd —- 启动脚本/etc/vsftpd/vsftpd.conf —- 主配置文件/etc/pam.d/vsftpd —- PAM认证文件/etc/vsftpd.ftpusers —- 禁止使用VSFTPD的用户列表文件/etc/vsftpd.user_list —- 禁止或允许使用VSFTPD的用户列表文件/var/ftp —- 匿名