文档库 最新最全的文档下载
当前位置:文档库 › C#自定义Richtextbox应用

C#自定义Richtextbox应用


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

///


/// 设置行距
///

/// 控件
/// 间距
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);
}
}

这样

,想要的效果就出来了,呵呵,有什么不对的话还请大家多指教补充!







/**************************************************/


我现在要自定义RichTextBox控件,让它有透明背景或者有背景图片。

方法一:

背景透明是有几种方法,可是无论怎么搞就是不完美。
base.SetStyle(https://www.wendangku.net/doc/e17637799.html,erPaint, true);
base.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
base.SetStyle(ControlStyles.DoubleBuffer, true);
base.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
上面是可以让背景透明,可是往里面写入文字却什么也看不到,但文字是存在的~~似乎连文字也透明了,主要是
base.SetStyle(https://www.wendangku.net/doc/e17637799.html,erPaint, true);导致的。实在让我无语~~~~



方法二:
override protected CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
这个方法似乎很轻松让背景透明,可是写文字的时候有点问题,会有卡的感觉。

相关文档