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

        /// <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~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值