1。获取文本框行数
//获取文本框行数
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);
private static int EM_GETLINECOUNT = 0x00BA;//获取总行数的消息号
public static int GetLineCount(Control ctl)
{
int linecount = 0;
try
{
linecount = SendMessage(ctl.Handle, EM_GETLINECOUNT, IntPtr.Zero, "");
}
catch
{
linecount = 0;
}
return linecount;
}
2。设置richtextbox行距
#region 设置richtextbox行距
///
//set richtextbox linespace
///
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 lParam);
/// <summary>
/// 设置行距
/// </summary>
/// <param name="ctl">控件</param>
/// <param name="dyLineSpacing">间距</param>
public static void SetLineSpaceProperty(Control ctl, int dyLineSpacing)
{
PARAFORMAT2 fmt = new PARAFORMAT2();
fmt.cbSize = Marshal.SizeOf(fmt);
fmt.bLineSpacingRule = 4;// bLineSpacingRule;
fmt.dyLineSpacing = dyLineSpacing;
fmt.dwMask = PFM_LINESPACING;
try
{
SendMessage(new HandleRef(ctl, ctl.Handle), EM_SETPARAFORMAT, 0, ref fmt);
}
catch (Exception ee)
{
}
}
#endregion
3。设置RichTextBox背景透明(重点)
这个问题很久了,一直没找到解决办法,今天又要用到它了,所以决定把它搞定!关于背景透明,在网上找了好久,找到一个方法感觉还不错:
//SetWindowLong函数:改变窗口属性
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern long SetWindowLong(
IntPtr hWnd, //窗口句柄
int nIndex, // 指定要设定的值的信息
IntPtr dwNewLong // 新值
);
//SetWindowLong函数:获得窗口属性
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
const int GWL_EXSTYLE = (-20);
const int WS_EX_TRANSPARENT = 0x20;
//加载的时候对它进行操作
SetWindowLong(this.richTextBox1.Handle, GWL_EXSTYLE, (IntPtr)(GetWindowLong(richTextBox1.Handle, GWL_EXSTYLE) | WS_EX_TRANSPARENT));
没问题,背景透明了,达到了想要的效果,可是有个奇怪的现象,如果有滚动条的情况下,单击滚动条的上下箭头没事,单击滚动条的滚动区也没事,如果你拖动滚动条的滑块的话,会发现显示乱了,为什么,不大清楚,不过解决方法我是自己测试出来的,写上来吧,并完成上面的步骤
private const int GWL_WNDPROC = -4;
public delegate IntPtr FlaWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
private IntPtr OldWndProc = IntPtr.Zero;
private FlaWndProc Wpr = null;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, FlaWndProc wndProc);
this.Wpr = new FlaWndProc(this.FlashWndProc);
this.OldWndProc = SetWindowLong(this.richTextBox1.Handle, GWL_WNDPROC, Wpr);
然后写上我们自己的窗口过程函数,并对滚动消息进行处理,如果是点击滚动,重绘客户区,如果是拖动滚动条(为什么是if (wParam == (IntPtr)8)这么判断,不知道,自己试出来的),返回不操作
const int WM_VSCROLL = 0x115;
private IntPtr FlashWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
switch (msg)
{
case WM_VSCROLL:
if (wParam == (IntPtr)8) return (IntPtr)0;
this.Invalidate(this.richTextBox1.ClientRectangle);
return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);
default:
return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);
}
}
这样,想要的效果就出来了,呵呵,有什么不对的话还请大家多指教补充!
Sorry!还有一点忘了,如果只是这样,用鼠标滚轮的时候又有问题的,解决办法是加上滚动条事件并重绘就可以了,Over~