1. 程式人生 > >用程式碼控制richtextbox的部份字型大小和顏色

用程式碼控制richtextbox的部份字型大小和顏色

新建一個類,把我貼的程式碼封裝在一起,然後另寫個程式引用這個類,在工具箱裡新增選擇項,在元件選項頁裡用瀏覽按鈕選擇這個類,會出現RichTextBoxPrintCtrl這個控制元件,新增成功後把這個控制元件當成richtextbox用就行了。是原richtextbox的增強版,可以改變字型大小,改變顏色,還能匯出到rtf檔案中。

    public class RichTextBoxPrintCtrl : RichTextBox
    {
        //Convert the unit used by the .NET framework (1/100 inch)
        //and the unit used by Win32 API calls (twips 1/1440 inch)
        private const double anInch = 14.4;

        [StructLayout(LayoutKind.Sequential)]
        private struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct CHARRANGE
        {
            public int cpMin;         //First character of range (0 for start of doc)
            public int cpMax;           //Last character of range (-1 for end of doc)
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct FORMATRANGE
        {
            public IntPtr hdc;             //Actual DC to draw on
            public IntPtr hdcTarget;       //Target DC for determining text formatting
            public RECT rc;                //Region of the DC to draw to (in twips)
            public RECT rcPage;            //Region of the whole DC (page size) (in twips)
            public CHARRANGE chrg;         //Range of text to draw (see earlier declaration)
        }

        private const int WM_USER = 0x0400;
        private const int EM_FORMATRANGE = WM_USER + 57;

        [DllImport("USER32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

        // Render the contents of the RichTextBox for printing
        //Return the last character printed + 1 (printing start from this point for next page)
        public int Print(int charFrom, int charTo, PrintPageEventArgs e)
        {
            //Calculate the area to render and print
            RECT rectToPrint;
            rectToPrint.Top = (int)(e.MarginBounds.Top * anInch);
            rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch);
            rectToPrint.Left = (int)(e.MarginBounds.Left * anInch);
            rectToPrint.Right = (int)(e.MarginBounds.Right * anInch);

            //Calculate the size of the page
            RECT rectPage;
            rectPage.Top = (int)(e.PageBounds.Top * anInch);
            rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch);
            rectPage.Left = (int)(e.PageBounds.Left * anInch);
            rectPage.Right = (int)(e.PageBounds.Right * anInch);

            IntPtr hdc = e.Graphics.GetHdc();

            FORMATRANGE fmtRange;
            fmtRange.chrg.cpMax = charTo;//Indicate character from to character to
            fmtRange.chrg.cpMin = charFrom;
            fmtRange.hdc = hdc;                    //Use the same DC for measuring and rendering
            fmtRange.hdcTarget = hdc;              //Point at printer hDC
            fmtRange.rc = rectToPrint;             //Indicate the area on page to print
            fmtRange.rcPage = rectPage;            //Indicate size of page

            IntPtr res = IntPtr.Zero;

            IntPtr wparam = IntPtr.Zero;
            wparam = new IntPtr(1);

            //Get the pointer to the FORMATRANGE structure in memory
            IntPtr lparam = IntPtr.Zero;
            lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange));
            Marshal.StructureToPtr(fmtRange, lparam, false);

            //Send the rendered data for printing
            res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam);

            //Free the block of memory allocated
            Marshal.FreeCoTaskMem(lparam);

            //Release the device context handle obtained by a previous call
            e.Graphics.ReleaseHdc(hdc);

            //Return last + 1 character printer
            return res.ToInt32();
        }

    }
#region  RTF工具
    public class RTFUtil
    {
        public static string RTFEncodeString(string inStr)
        {
            string t = System.Web.HttpUtility.UrlEncode(System.Text.UTF8Encoding.Default.GetBytes(inStr));
            return t.Replace("%", "//'").Replace("+","//~");
        }
        public static string RTFEncodeColor(Color c)
        {
            byte r = c.R;
            byte g = c.G;
            byte b = c.B;
            return "//red" + r.ToString() + "//green" + g.ToString() + "//blue" + b.ToString() + ";";
        }
    }
    #endregion
    #region  RTF顏色表
    public class RTFColorTable : System.Collections.CollectionBase
    {
        public RTFColorTable()
        {
            List.Add(Color.Black);
            List.Add(Color.White);
            List.Add(Color.Red);
            List.Add(Color.Blue);
            List.Add(Color.Gray);
            List.Add(Color.Purple);
        }
        public void Add(Color c)
        {
            if (!List.Contains(c))
                List.Add(c);
        }
        public void Delete(Color c)
        {
            List.Remove(c);
        }
        public void Delete(int index)
        {
            List.RemoveAt(index);
        }
        public bool Contains(Color c)
        {
            return List.Contains(c);
        }
        public int IndexOf(Color c)
        {
            return List.IndexOf(c);
        }
        public string RTFSource
        {
            get
            {
                string r = "{//colortbl ";
                for (int iCnt = 0; iCnt < List.Count; iCnt++)
                {
                    r += RTFUtil.RTFEncodeColor((Color)List[iCnt]);
                }
                r += "}";
                return r;
            }
        }
    }
    #endregion
    #region  RTF字體表
    public class RTFFontTable : System.Collections.CollectionBase
    {
        public RTFFontTable()
        {
            List.Add("宋體");
            List.Add("FixedSys");
            List.Add("Cordia  New");
        }
        public void Add(string fName)
        {
            List.Add(fName);
        }
        public void Delete(string fName)
        {
            List.Remove(fName);
        }
        public bool Contains(string fName)
        {
            return List.Contains(fName);
        }
        public void Delete(int index)
        {
            List.RemoveAt(index);
        }
        public int IndexOf(string f)
        {
            return List.IndexOf(f);
        }
        public string RTFSource
        {
            get
            {
                string r = "{//fonttbl";
                for (int iCnt = 0; iCnt < List.Count; iCnt++)
                {
                    r += "{//f" + iCnt.ToString() + "//fnil//fprq6//fcharset134  ";
                    r += RTFUtil.RTFEncodeString((string)List[iCnt]) + ";}";
                }
                r += "}";
                return r;
            }
        }
    }
    #endregion
    #region  RTF文件類
    public class RTFDocument
    {
        private string RTFHeader = "{//rtf1//ansi//ansicpg936//deff0//deflang1033//deflangfe2052";
        private string RTFGenerator = "{//*//generator  eglic.com;}";
        public RTFColorTable Colors;
        private RTFFontTable Fonts;
        private string RTFContent = "";
        public RTFDocument()
        {
            Colors = new RTFColorTable();
            Fonts = new RTFFontTable();
        }
        public void AppendText(string sText, int iSize, Color cColor, string sFont,
        bool bBlod, bool bItalic, bool bUnderLine, bool bNewLine)
        {
            if (!Colors.Contains(cColor))
                Colors.Add(cColor);
            if (!Fonts.Contains(sFont))
                Fonts.Add(sFont);
            string tmp = "";
            if (cColor == Color.Gray || cColor == Color.Black)
            {
                tmp = RTFUtil.RTFEncodeString(sText+"    ");
            }
            else
            {
                tmp = RTFUtil.RTFEncodeString(sText );
            }
           
            if (bBlod) tmp = "//b" + tmp + "//b0";
            if (bUnderLine) tmp = "//ul" + tmp + "//ulnone";
            if (bItalic) tmp = "//i" + tmp + "//i0";
            int ci = Colors.IndexOf(cColor); if (ci < 1) ci = 0;
            int fi = Fonts.IndexOf(sFont); if (fi < 0) fi = 0;
            tmp = "//fs" + iSize.ToString()+" " + tmp + "//fs10";
            tmp = "//f" + fi.ToString() + tmp + "//f0";
            tmp = "//cf" + ci.ToString() + tmp + "//cf0";
            if (bNewLine) tmp = "//par "+tmp;
            RTFContent += tmp;
        }
        public string RTFSource
        {
            get
            {
                return RTFHeader + this.Fonts.RTFSource + this.Colors.RTFSource + this.RTFGenerator + @"/viewkind4" + RTFContent + "}";
            }
        }
    }
    #endregion

具體的呼叫方法。

Alldj.RTFDocument rtf = new RTFDocument();
            Color ctitle = Color.Red;
            Color csubtitle = Color.Blue;
            Color ctt = Color.Black;
            Color cmtt = Color.Gray;
            Color cstt = Color.Purple;
            string fname = "宋體";
            int ftitle = 40;
            int fsubtitle = 30;
            int ftt = 20;
           
   string text="";
   DataSet ds=new DataSet();
   ds=Func.DBbind("select * from jkda_family where fid='"+fid+"' /n select * from personal a inner join jkda_familyMemberrelation b on a.pid=b.pid where b.fid='"+fid+"'");
   //idcard,name,sex,birthday,nation,hostrelation,livestate
   //district,street,hamlet,road,alley,number,room,host,homephone,createtime
   if (ds.Tables[0].Rows.Count<=0)
   {
    return;
   }

            rtf.AppendText("社群家庭健康檔案", ftitle, ctitle, fname, true, false, false, false);
   try
   {
                text = "建檔日期:";
                rtf.AppendText(text, ftt, csubtitle, fname,false, false, false, true);
                text = Convert.ToDateTime(ds.Tables[0].Rows[0]["createtime"].ToString()).ToLongDateString() + "  " + Convert.ToDateTime(ds.Tables[0].Rows[0]["createtime"].ToString()).ToLongTimeString();
                rtf.AppendText(text, ftt, ctt, fname, false, false, false, false);

                text = "建檔醫生:";
                rtf.AppendText(text, ftt, csubtitle, fname, false, false, false, true);
                text = ds.Tables[0].Rows[0]["doctor"].ToString().Trim();
                rtf.AppendText(text, ftt, ctt, fname, false, false, false, false);

                text = "戶主:";
                rtf.AppendText(text, ftt, csubtitle, fname, false, false, false, true);
                text = ds.Tables[0].Rows[0]["host"].ToString().Trim();
                rtf.AppendText(text, ftt, ctt, fname, false, false, false, false);

    string address="";
    if (ds.Tables[0].Rows[0]["district"].ToString().Trim()!="")
    {
     address+=ds.Tables[0].Rows[0]["district"].ToString().Trim()+"區 ";
    }
    if (ds.Tables[0].Rows[0]["street"].ToString().Trim()!="")
    {
     address+=ds.Tables[0].Rows[0]["street"].ToString().Trim()+"街道 ";
    }
    if (ds.Tables[0].Rows[0]["hamlet"].ToString().Trim()!="")
    {
     address+=ds.Tables[0].Rows[0]["hamlet"].ToString().Trim()+"居委 ";
    }
    if (ds.Tables[0].Rows[0]["road"].ToString().Trim()!="")
    {
     address+=ds.Tables[0].Rows[0]["road"].ToString().Trim()+"路 ";
    }
    if (ds.Tables[0].Rows[0]["alley"].ToString().Trim()!="")
    {
     address+=ds.Tables[0].Rows[0]["alley"].ToString().Trim()+"弄 ";
    }
    if (ds.Tables[0].Rows[0]["alley"].ToString().Trim()!="")
    {
     address+=ds.Tables[0].Rows[0]["number"].ToString().Trim()+"號 ";
    }
    if (ds.Tables[0].Rows[0]["room"].ToString().Trim()!="")
    {
     address+=ds.Tables[0].Rows[0]["room"].ToString().Trim()+"室";
    }
                text = "家庭地址:";
                rtf.AppendText(text, ftt, csubtitle, fname, false, false, false, false);
                text = ds.Tables[0].Rows[0]["host"].ToString().Trim();
                rtf.AppendText(address, ftt, ctt, fname, false, false, false, false);

                text = "電話:";
                rtf.AppendText(text, ftt, csubtitle, fname, false, false, false, false);
                text = ds.Tables[0].Rows[0]["homephone"].ToString().Trim();
                rtf.AppendText(text, ftt, ctt, fname, false, false, false, false);

                text = "家庭成員";
                rtf.AppendText(text, ftt,cstt, fname, false, false, false, true);

                this.rtfamily.Rtf = rtf.RTFSource;

   }
   catch(Exception eee)
   {
    Func.Msg(eee.Message);
   }
   
   
  }