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