C# WinForm richtextbox深行距和字符间距

C# WinForm richtextbox深行距和字符间距,c#,winforms,richtextbox,C#,Winforms,Richtextbox,如何在winform中编辑richtextbox上的行距和字符间距?我试过PARAFORMAT2,但它不允许深度设置。我想像photoshop一样设置间距。比如, 图中有三种不同的间距格式。如何设置像图片中的1,2,3这样的间距?行间距 您可以将消息发送到富文本框控件并作为lparam传递。要控制行距,应在dwMask成员中设置PFM_linespace标志,并根据需要将PARAFORMAT2的blinespacerule和dylinespace成员设置为合适的值 由于您需要微调行距,因此4似

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


图中有三种不同的间距格式。如何设置像图片中的1,2,3这样的间距?

行间距

您可以将消息发送到富文本框控件并作为
lparam
传递。要控制行距,应在
dwMask
成员中设置
PFM_linespace
标志,并根据需要将
PARAFORMAT2
blinespacerule
dylinespace
成员设置为合适的值

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

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);
}
字符间距

根据中的
sSpacing
文档,设置字符间距对rich edit控件显示的文本没有影响

代码

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);
    }
}

您是指行距还是字符间距?是的,我是指两者,但首先行距是必需的。您可以使用
PARAFORMAT2
执行行距。有什么问题吗?我想使行距变小。我使用了PARAFORMAT2,它可以扩展行间距。当我想使间距变小时,它会变得越来越小,越来越小,但在某个值之后,它不会变得越来越小。例如,在创建新行时,不要压缩足够的间隔行。@ATES仅使用
\n
而不使用
\n\r
这将解决您的问题并阅读您的文章。我厌倦了你的代码,但有一个小问题。行距不得小于等于零。当
dyLineSpacing
低于420值时,看起来褪色的字符似乎会被剪切。第一次尝试(没问题)<代码>exRichText1.SetSelectionLineSpacing(4420)第一次尝试屏幕:()第二次尝试(故障)<代码>exRichText1.SetSelectionLineSpacing(4220)第二个尝试屏幕:()您的第二个屏幕截图是预期结果。要查看间距是如何工作的,请在每次单击“减少/增加”按钮时将dyLineSpacing从初始值(示例代码中为420)减少或增加10。我知道如何在第二秒重新启动时解决此问题?