【问题标题】:WinForm richtextbox deep line spacing and character spacingWinForm Richtextbox 深行间距和字符间距
【发布时间】:2016-02-22 04:02:15
【问题描述】:

如何在winform的richtextbox上编辑行间距和字符间距?我试过 PARAFORMAT2 但它不允许深度设置。我想像Photoshop一样设置间距。例如;

图片中是三种不同的间距格式。图片中1、2、3的间距如何设置?

【问题讨论】:

  • 你是指行间距还是字符间距?
  • 是的,我的意思是他们两个,但首先行距是必要的。
  • 您可以使用 PARAFORMAT2 执行行间距。有什么问题?
  • 我想使行距更小。我用的是 PARAFORMAT2,它拉伸行距没问题。当我想让间距变得更小时,它会变得越来越小,越来越小,但是在某个值之后它不会越来越小。例如,不要压缩足够的间距线。
  • @ATES 创建新行时,仅使用\n 而不是\n\r,这将解决您的问题

标签: c# winforms richtextbox


【解决方案1】:

行距

您可以将EM_SETPARAFORMAT 消息发送到富文本框控件并将PARAFORMAT2 传递为lparam。要控制行间距,您应该在dwMask 成员中设置PFM_LINESPACING 标志,并根据您的要求将PARAFORMAT2bLineSpacingRuledyLineSpacing 成员设置为合适的值。

由于您需要微调行距,似乎 4 适合 bLineSpacingRule,然后您可以将 dyLineSpacing 设置为 twip 单位的任何值。有关bLineSpacingRule 可用选项的更多信息,请阅读PARAFORMAT2 文档。

public void SetSelectionLineSpacing(byte bLineSpacingRule, int dyLineSpacing)
{
    PARAFORMAT2 format = new PARAFORMAT2();
    format.cbSize = Marshal.SizeOf(format);
    format.dwMask = PFM_LINESPACING;
    format.dyLineSpacing = dyLineSpacing;
    format.bLineSpacingRule = bLineSpacingRule;
    SendMessage(this.Handle, EM_SETPARAFORMAT, SCF_SELECTION, ref format);
}

字符间距

根据CHARFORMAT2sSpacing 的文档,设置字符间距对富编辑控件显示的文本没有影响。

代码

public class ExRichText : RichTextBox
{
    [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, Int32 msg, 
                                             Int32 wParam, ref PARAFORMAT2 lParam);

    private const int SCF_SELECTION = 1;
    public const int PFM_LINESPACING = 256;
    public const int EM_SETPARAFORMAT = 1095;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct PARAFORMAT2
    {
        public int cbSize;
        public uint dwMask;
        public Int16 wNumbering;
        public Int16 wReserved;
        public int dxStartIndent;
        public int dxRightIndent;
        public int dxOffset;
        public Int16 wAlignment;
        public Int16 cTabCount;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        public int[] rgxTabs;
        public int dySpaceBefore;
        public int dySpaceAfter;
        public int dyLineSpacing;
        public Int16 sStyle;
        public byte bLineSpacingRule;
        public byte bOutlineLevel;
        public Int16 wShadingWeight;
        public Int16 wShadingStyle;
        public Int16 wNumberingStart;
        public Int16 wNumberingStyle;
        public Int16 wNumberingTab;
        public Int16 wBorderSpace;
        public Int16 wBorderWidth;
        public Int16 wBorders;
    }

    public void SetSelectionLineSpacing(byte bLineSpacingRule, int dyLineSpacing)
    {
        PARAFORMAT2 format = new PARAFORMAT2();
        format.cbSize = Marshal.SizeOf(format);
        format.dwMask = PFM_LINESPACING;
        format.dyLineSpacing = dyLineSpacing;
        format.bLineSpacingRule = bLineSpacingRule;
        SendMessage(this.Handle, EM_SETPARAFORMAT, SCF_SELECTION, ref format);
    }
}

【讨论】:

  • 感谢您的帖子。我厌倦了你的代码,但有一个小问题。行距永远不会为零及以下。当dyLineSpacing 低于 420 值时,看起来褪色的字符似乎被剪掉了。第一次尝试(没问题); exRichText1.SetSelectionLineSpacing(4, 420);第一次尝试屏幕:(prntscr.com/a6a6un)第二次尝试(错误); exRichText1.SetSelectionLineSpacing(4, 220);第二次试屏:(prntscr.com/a6a85j)
  • 您的第二个屏幕截图是预期结果。每次单击减小/增大按钮时,要查看间距如何从初始值(示例代码中的 420)减小或增大 dyLineSpacing 10。
  • 我知道,在第二个截图中如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多