今天做个提示信息,需要控制文字显示的行间距,原本是想用label来做,后来发现并没有相关的属性可以设置,到网上搜索了一下,唯一的方法似乎只能是自己控制重绘,不想使用这么麻烦的处理,于是又尝试了其它的控件richtextbox,发现还是没有可以直接设置的属性,不过却可以通过api来实现,实现方法如下:
//定义常量:
//具体是干什么用的我自己也不清楚
public const int WM_USER = 0x0400;
public const int EM_GETPARAFORMAT = WM_USER+61;
public const int EM_SETPARAFORMAT = WM_USER+71;
public const long MAX_TAB_STOPS = 32;
public const uint PFM_LINESPACING = 0x00000100;
//定义结构体,为什么这么定义,我也不知道
[StructLayout( LayoutKind.Sequential )]
private struct PARAFORMAT2{
public int cbSize;
public uint dwMask;
public short wNumbering;
public short wReserved;
public int dxStartIndent;
public int dxRightIndent;
public int dxOffset;
public short wAlignment;
public short cTabCount;
[MarshalAs( UnmanagedType.ByValArray, SizeConst = 32 )]
public int[] rgxTabs;
public int dySpaceBefore;
public int dySpaceAfter;
public int dyLineSpacing;
public short sStyle;
public byte bLineSpacingRule;
public byte bOutlineLevel;
public short wShadingWeight;
public short wShadingStyle;
public short wNumberingStart;
public short wNumberingStyle;
public short wNumberingTab;
public short wBorderSpace;
public short wBorderWidth;
public short wBorders;}
//定义函数
[DllImport("user32", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, ref PARAFORMAT2 IParam);
//调用方法如下
private void SetLineSpace(int lineSpace)
{
PARAFORMAT2 pFormat = new PARAFORMAT2();
pFormat .cbSize = Marshal.SizeOf(pFormat );
pFormat .bLineSpacingRule = 4;
pFormat .dyLineSpacing = lineSpace;
pFormat .dwMask = PFM_LINESPACING;
SendMessage(new HandleRef(this.richTextBox1, richTextBox1.Handle),
EM_SETPARAFORMAT, 4, ref pFormat );
}