附件:https://files.cnblogs.com/xe2011/CSHARP_RichTextBoxEditor.rar
完整的转到这里 http://www.cnblogs.com/xe2011/p/3449333.html
主要的类
1 using System; 2 //using System.Collections.Generic; 3 //using System.Linq; 4 using System.Text; 5 using System.Drawing; 6 //using System.Windows.Forms; 7 using System.Runtime.InteropServices; 8 using System.Drawing.Printing; 9 using System.ComponentModel; 10 using System.IO; 11 using RichTextBoxCtrl; 12 using richTextBoxTableClass; 13 14 #region 添加引用 说明 15 //右键选中 引用 添加引用 16 //在“添加引用”对话框中, 17 //双击“System.Drawing.dll”和 18 //“System.Windows.Forms.dll”,然后单击“确定”。 19 #endregion 20 21 22 namespace System.Windows.Forms 23 { 24 public class RichTextBoxCtrl : RichTextBox 25 { 26 27 #region RichTextBox初始化属性 28 /// <summary> 29 /// richTextBox1 = this; 30 /// </summary> 31 private System.Windows.Forms.RichTextBox richTextBox1; 32 33 public RichTextBoxCtrl() 34 { 35 richTextBox1 = this; 36 AllowDrop = true; 37 EnableAutoDragDrop = true; 38 AcceptsTab = true; 39 HideSelection = false; 40 ScrollBars = RichTextBoxScrollBars.Vertical; 41 InitialRichTextBoxCtrl(); 42 43 } 44 #endregion 45 46 #region RichTextBox 新建 打开 和 保存 文件对话框 47 48 private string fileName = "未命名.rtf"; 49 private string absFileName = ""; 50 51 //文件名 返回 如 abc.rtf 52 public string FileName 53 { 54 get{ 55 return fileName; 56 } 57 } 58 59 //格式 C:\windows\abc.rtf 60 public string AbsFileName 61 { 62 get { 63 return absFileName; 64 } 65 } 66 67 68 /// <summary> 69 /// 判断文件是否保存了 70 /// </summary> 71 private void CheckFileSave() 72 { 73 if (this.Modified) 74 { 75 string msg = ""; 76 if (File.Exists(absFileName)) 77 msg = "文档已修改是否保存:" + fileName; 78 else 79 msg = "文档已修改是否保存"; 80 81 DialogResult Result = MessageBox.Show(msg, "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 82 if (Result == DialogResult.Yes) 83 { 84 if (File.Exists(absFileName)) 85 richTextBox1.SaveFile(absFileName); 86 else 87 this.ShowSaveFileDlg(); 88 } 89 } 90 } 91 92 /// <summary> 93 /// 新空的文档 94 /// </summary> 95 public void NewDocument() 96 { 97 CheckFileSave(); 98 99 richTextBox1.Text = ""; 100 richTextBox1.Modified = false; 101 102 absFileName = ""; 103 fileName = ""; 104 } 105 106 /// <summary> 107 /// 打开文件 108 /// </summary> 109 public void ShowOpenFileDlg() 110 { 111 CheckFileSave(); 112 113 OpenFileDialog openFileDialog1 = new OpenFileDialog(); 114 openFileDialog1.DefaultExt = ".rtf"; 115 openFileDialog1.Filter = "RTF 文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"; 116 if (openFileDialog1.ShowDialog() == DialogResult.OK) 117 { 118 LoadFile(openFileDialog1.FileName); 119 Modified = false; 120 121 absFileName = openFileDialog1.FileName; 122 fileName = Path.GetFileName(absFileName); 123 } 124 } 125 126 //另存文件 127 public void ShowSaveFileDlg() 128 { 129 SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 130 saveFileDialog1.DefaultExt = ".rtf"; 131 saveFileDialog1.Filter = "RTF 文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"; 132 saveFileDialog1.FileName = FileName; 133 if (saveFileDialog1.ShowDialog() == DialogResult.OK) 134 { 135 SaveFile(saveFileDialog1.FileName); 136 Modified = false; 137 138 absFileName = saveFileDialog1.FileName; 139 fileName = Path.GetFileName(absFileName); 140 } 141 } 142 143 #endregion 144 145 #region 把RTF文件保存为纯文本 146 147 /// <summary> 148 /// 把RTF文件保存为纯文本 149 /// 只保存字符 转换后文本不包括RTF中的图片信息 150 /// </summary> 151 /// <param name="TextFileName">"C:\Users\Admin\Desktop\CurRoleBase.txt"</param> 152 public void SaveToTextFile(string TextFileName) 153 { 154 this.SaveFile(TextFileName, RichTextBoxStreamType.TextTextOleObjs); 155 } 156 #endregion 157 158 #region 设置为只读模式 159 160 [DllImport("user32.dll")] 161 static extern bool HideCaret(IntPtr hWnd); 162 163 164 /// <summary> 165 /// HideCaret 166 /// </summary> 167 /// <param name="m"></param> 168 protected override void WndProc(ref Message m) 169 { 170 base.WndProc(ref m); 171 if (ReadOnly) 172 HideCaret(Handle); 173 } 174 #endregion 175 176 #region 设置 和 获得光标所在的行号和列号 177 ///要在本类中初始化 richTextBox1 = this; 178 private int EM_LINEINDEX = 0x00BB; 179 private int EM_LINEFROMCHAR = 0x00C9; 180 181 [DllImport("user32.dll", EntryPoint = "SendMessage")] 182 public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); 183 184 185 /// <summary> 186 /// 获得光标所在的行号和列号 187 /// </summary> 188 /// <param name="editControl"></param> 189 /// <returns>p.X = 行号 p.Y =列号</returns> 190 public Point GetCaretPosition() 191 { 192 int charIndex = (int)SendMessage(richTextBox1.Handle, EM_LINEINDEX, -1, 0); 193 int lineIndex = (int)SendMessage(richTextBox1.Handle, EM_LINEFROMCHAR, charIndex, 0); 194 Point pt=new Point(); 195 pt.X = richTextBox1.SelectionStart - charIndex +1;//Line 196 pt.Y = lineIndex +1;//Column 197 return pt; 198 } 199 200 201 /// <summary> 202 /// 转到行 203 /// </summary> 204 /// <param name="Line">行号</param> 205 public void jumpLine(int Line) 206 { 207 richTextBox1.SelectionStart = SendMessage(richTextBox1.Handle, EM_LINEINDEX, Line - 1, 0); 208 richTextBox1.SelectionLength = 0; 209 richTextBox1.ScrollToCaret(); 210 } 211 212 213 /// <summary> 214 /// 有问题 同时设置行号和列号就出现问题了 215 /// </summary> 216 /// <param name="Column"></param> 217 public void jumpColumn(int Column) 218 { 219 int Line = Column; 220 221 int charIndex = (int)SendMessage(richTextBox1.Handle, EM_LINEINDEX, Line - 1, 0); 222 int lineIndex = charIndex + (int)SendMessage(richTextBox1.Handle, EM_LINEFROMCHAR, charIndex, 0); 223 224 richTextBox1.SelectionStart = lineIndex; 225 } 226 #endregion 227 228 #region RichTextBox 字体样式 229 //格式刷 230 231 232 /// richTextBox1 = this; 233 234 /// <summary> 235 /// 粗体 236 /// </summary> 237 public void ToggleBold() 238 { 239 if (richTextBox1.SelectionFont == null) 240 richTextBox1.SelectionFont = richTextBox1.Font; 241 242 FontStyle style = richTextBox1.SelectionFont.Style; 243 244 if (richTextBox1.SelectionFont.Bold) 245 246 style &= ~FontStyle.Bold;//恢复正常 247 else 248 style |= FontStyle.Bold; 249 250 richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, style); 251 } 252 253 /// <summary> 254 /// 斜体 255 /// </summary> 256 public void ToggleItalic() 257 { 258 if (richTextBox1.SelectionFont == null) 259 richTextBox1.SelectionFont = richTextBox1.Font; 260 261 FontStyle style = richTextBox1.SelectionFont.Style; 262 263 if (richTextBox1.SelectionFont.Italic) 264 style &= ~FontStyle.Italic;//恢复正常 265 else 266 style |= FontStyle.Italic; 267 268 richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, style); 269 } 270 271 /// <summary> 272 /// 下划线 273 /// </summary> 274 public void ToggleUnderLine() 275 { 276 if (richTextBox1.SelectionFont == null) 277 richTextBox1.SelectionFont = richTextBox1.Font; 278 279 FontStyle style = richTextBox1.SelectionFont.Style; 280 281 if (richTextBox1.SelectionFont.Underline) 282 style &= ~FontStyle.Underline;//恢复正常 283 else 284 style |= FontStyle.Underline; 285 286 richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, style); 287 } 288 289 /// <summary> 290 /// 删除线 291 /// </summary> 292 public void ToggleStrikeout() 293 { 294 if (richTextBox1.SelectionFont == null) 295 richTextBox1.SelectionFont = richTextBox1.Font; 296 297 FontStyle style = richTextBox1.SelectionFont.Style; 298 299 if (richTextBox1.SelectionFont.Strikeout) 300 style &= ~FontStyle.Strikeout;//恢复正常 301 else 302 style |= FontStyle.Strikeout; 303 richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, style); 304 } 305 306 307 //标题1 ,标题2.... 308 public void SetFontFormat(int index) 309 { 310 richTextBoxFontFormatClass FontFormat1 = new richTextBoxFontFormatClass(); 311 FontFormat1.richTextBox = this; 312 FontFormat1.SetFontFormat(index); 313 } 314 315 public string GetFontFormat() 316 { 317 richTextBoxFontFormatClass FontFormat1 = new richTextBoxFontFormatClass(); 318 FontFormat1.richTextBox = this; 319 return FontFormat1.GetFontFormat(); 320 } 321 322 /// <summary> 323 /// 设置上标 324 /// </summary> 325 [Browsable(false)] 326 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 327 public bool SelectionSupperScript 328 { 329 get 330 { 331 return (SelectionCharOffset == 4); 332 } 333 set 334 { 335 if (SelectionCharOffset == 0) 336 { 337 SelectionCharOffset = 4; 338 } 339 else 340 { 341 SelectionCharOffset = 0; 342 } 343 } 344 } 345 346 /// <summary> 347 /// 设置下标 348 /// </summary> 349 [Browsable(false)] 350 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 351 public bool SelectionSubScript 352 { 353 get 354 { 355 return (SelectionCharOffset == -4); 356 } 357 set 358 { 359 if (SelectionCharOffset == 0) 360 { 361 SelectionCharOffset = -4; 362 } 363 else 364 { 365 SelectionCharOffset = 0; 366 } 367 368 } 369 } 370 371 372 /// <summary> 373 ///RichTextBox 数字序列 1. 2. 3. 4. 5. ... 374 /// </summary> 375 [Browsable(false)] 376 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 377 public bool SelectionOrderList 378 { 379 get 380 { 381 richTextBoxBulletClass r = new richTextBoxBulletClass(); 382 r.richTextBox = this; 383 return r.SelectionOrderList; 384 } 385 set 386 { 387 richTextBoxBulletClass r = new richTextBoxBulletClass(); 388 r.richTextBox = this; 389 r.SelectionOrderList = value; 390 } 391 } 392 393 394 //只须设置 不需要获得是否设置的返回值 395 ////Tab-> 396 public void Indent() 397 { 398 SelectionIndent += 8; 399 } 400 ////Tab <- 401 public void OutIndent() 402 { 403 SelectionIndent -= 8; 404 } 405 406 #endregion 407 408 #region RichTextBox Margin 409 private struct Rect 410 { 411 public int Left; 412 public int Top; 413 public int Right; 414 public int Bottom; 415 } 416 417 [DllImport("user32.dll")] 418 private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rect lParam); 419 420 private const int EM_GETRECT = 0x00b2; 421 private const int EM_SETRECT = 0x00b3; 422 423 /// <summary> 424 /// 当没设置的时候结果多出了L T R +2 425 /// </summary> 426 private Rect RichTextBoxMargin 427 { 428 get 429 { 430 Rect rect = new Rect(); 431 SendMessage(richTextBox1.Handle, EM_GETRECT, IntPtr.Zero, ref rect); 432 rect.Left += 1; 433 rect.Top += 1; 434 rect.Right = 1 + richTextBox1.DisplayRectangle.Width - rect.Right; 435 rect.Bottom = richTextBox1.DisplayRectangle.Height - rect.Bottom; 436 return rect; 437 } 438 set 439 { 440 Rect rect; 441 rect.Left = richTextBox1.ClientRectangle.Left + value.Left; 442 rect.Top = richTextBox1.ClientRectangle.Top + value.Top; 443 rect.Right = richTextBox1.ClientRectangle.Right - value.Right; 444 rect.Bottom = richTextBox1.ClientRectangle.Bottom - value.Bottom; 445 446 SendMessage(richTextBox1.Handle, EM_SETRECT, IntPtr.Zero, ref rect); 447 } 448 449 } 450 451 [Browsable(true)] 452 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 453 public int LeftMargin 454 { 455 get 456 { 457 return RichTextBoxMargin.Left; 458 } 459 set 460 { 461 Rect rect1; 462 rect1 = RichTextBoxMargin; 463 464 Rect rect; 465 rect.Left = value; 466 rect.Top = 0;//rect1.Top; 467 rect.Right = rect1.Right; 468 rect.Bottom = rect1.Bottom; 469 470 RichTextBoxMargin = rect; 471 } 472 } 473 474 [Browsable(false)] 475 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 476 public int RightMargin 477 { 478 get 479 { 480 return RichTextBoxMargin.Right; 481 } 482 set 483 { 484 Rect rect1; 485 rect1 = RichTextBoxMargin; 486 487 Rect rect; 488 rect.Left = rect1.Left; 489 rect.Top = rect1.Top; 490 rect.Right = value; 491 rect.Bottom = rect1.Bottom; 492 493 RichTextBoxMargin = rect; 494 } 495 } 496 497 [Browsable(false)] 498 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 499 public int TopMargin 500 { 501 get 502 { 503 return RichTextBoxMargin.Top; 504 } 505 set 506 { 507 Rect rect1; 508 rect1 = RichTextBoxMargin; 509 510 Rect rect; 511 rect.Left = rect1.Left; 512 rect.Top = value; 513 rect.Right = rect1.Right; 514 rect.Bottom = rect1.Bottom; 515 516 RichTextBoxMargin = rect; 517 } 518 } 519 [Browsable(false)] 520 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 521 public int BottomMargin 522 { 523 get 524 { 525 return RichTextBoxMargin.Bottom; 526 } 527 set 528 { 529 Rect rect1; 530 rect1 = RichTextBoxMargin; 531 532 Rect rect; 533 rect.Left = rect1.Left; 534 rect.Top = rect1.Top; 535 rect.Right = rect1.Right; 536 rect.Bottom = value; 537 RichTextBoxMargin = rect; 538 } 539 } 540 541 #endregion 542 543 #region RichTextBox 默认快捷键 544 /* 545 查找 CTRL+F 546 替换 CTRL+R 547 时间日期 F5 548 549 粗体 CTRL+B 550 斜体 CTRL+I 551 下划线 CTRL+U 552 */ 553 554 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 555 { 556 if (!this.ReadOnly) 557 { 558 switch (keyData) 559 { 560 //CTRL+B 561 case Keys.Control | Keys.B: 562 ToggleBold(); 563 return true; 564 565 //CTRL+I 566 case Keys.Control | Keys.I: 567 ToggleItalic(); 568 return true; 569 570 //CTRL+U 571 case Keys.Control | Keys.U: 572 ToggleUnderLine(); 573 return true; 574 575 //shift +tab 左缩进 576 case Keys.Shift | Keys.Tab: 577 if (SelectedText != "") 578 { 579 SelectionIndent -= 8; 580 } 581 return true; 582 583 //shift +tab 右缩进 584 case Keys.Tab: 585 if (SelectedText != "") 586 { 587 SelectionIndent += 8; 588 589 } 590 return true; 591 592 //替换对话框 593 case Keys.Control | Keys.R: 594 ShowReplaceDlg(); 595 return true; 596 597 //插入时间日期 598 case Keys.F5: 599 //2013-11-25 13:57:09 600 SelectedText = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); 601 return true; 602 603 //粘贴纯文本 604 case Keys.Control | Keys.Shift | Keys.V: 605 PasteAsText(); 606 return true; 607 608 case Keys.Control | Keys.G: 609 ShowGoToDlg(); 610 return true; 611 612 } 613 } 614 615 if (keyData == (Keys.Control | Keys.F)) 616 { 617 ShowFindDlg(); 618 } 619 return false; 620 } 621 622 623 #endregion 624 625 #region RichTextBox 常用属性 626 627 public void PasteAsText() 628 { 629 richTextBox1.SelectedText = Clipboard.GetText(); //粘贴纯文本 630 } 631 632 public void PasteAsBmp() 633 { 634 if (CanPasteAsBmp()) 635 { 636 richTextBox1.Paste(); 637 } 638 } 639 640 public void PasteAsHtml() 641 { 642 643 } 644 645 public void PasteAsUnicode() 646 { 647 648 } 649 650 /// <summary> 651 /// 剪切板是否为空 652 /// </summary> 653 /// <returns></returns> 654 public bool CanPaste() 655 { 656 return (Clipboard.GetDataObject() != null); 657 } 658 659 /// <summary> 660 /// 剪切板是否有字符串 661 /// </summary> 662 /// <returns></returns> 663 public bool CanPasteAsText() 664 { 665 return Clipboard.GetDataObject().GetDataPresent(DataFormats.Text); 666 } 667 /// <summary> 668 /// 剪切板是否有位图 669 /// </summary> 670 /// <returns></returns> 671 public bool CanPasteAsBmp() 672 { 673 return Clipboard.GetDataObject().GetDataPresent(DataFormats.Bitmap); 674 } 675 /// <summary> 676 /// 剪切板是否HTML 677 /// </summary> 678 /// <returns></returns> 679 public bool CanPasteAsHtml() 680 { 681 return Clipboard.GetDataObject().GetDataPresent(DataFormats.Html); 682 } 683 684 /// <summary> 685 /// 是否可以全选 686 /// </summary> 687 /// <returns></returns> 688 public bool CanSelectAll() 689 { 690 return (richTextBox1.SelectedText.Length != richTextBox1.Text.Length); 691 } 692 693 private void InitialRichTextBoxCtrl() 694 { 695 //ContextMenuStrip = contextMenuStrip1; 696 LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(richTextBox1_LinkClicked); 697 } 698 699 /// <summary> 700 /// 自动打开超链接 701 /// </summary> 702 /// <param name="sender"></param> 703 /// <param name="e"></param> 704 private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e) 705 { 706 DialogResult b = MessageBox.Show("你要打开此链接吗?\n" + e.LinkText, "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); 707 if (b == DialogResult.Yes) 708 { 709 System.Diagnostics.Process.Start("iexplore.exe", e.LinkText); 710 } 711 } 712 713 714 #endregion 715 716 #region RichTextBox 通用对话框 717 718 //private FindDialog FindDlg = new FindDialog(); 719 //private ReplaceDialog ReplaceDlg=new ReplaceDialog(); 720 721 /// <summary> 722 /// 查找对话框 723 /// </summary> 724 public void ShowFindDlg() 725 { 726 FindDialog FindDlg = new FindDialog(); 727 FindDlg.richTextBox1 = this; 728 FindDlg.textBox1.Text = this.SelectedText; 729 FindDlg.StartPosition = FormStartPosition.CenterParent; 730 FindDlg.ShowDialog(); 731 } 732 733 /// <summary> 734 /// 替换 对话框 735 /// </summary> 736 public void ShowReplaceDlg() 737 { 738 ReplaceDialog ReplaceDlg = new ReplaceDialog(); 739 ReplaceDlg.StartPosition = FormStartPosition.CenterParent; 740 ReplaceDlg.richTextBox1 = this; 741 ReplaceDlg.textBox1.Text = this.SelectedText; 742 ReplaceDlg.ShowDialog(); 743 } 744 745 /// <summary> 746 /// 字体对话框 747 /// </summary> 748 public void ShowFontDlg() 749 { 750 FontDialog fontDialog1 = new FontDialog(); 751 fontDialog1.Font = richTextBox1.Font; 752 if (fontDialog1.ShowDialog() == DialogResult.OK) 753 { 754 richTextBox1.Font = fontDialog1.Font; 755 756 } 757 } 758 /// <summary> 759 /// 转到 对话框 760 /// </summary> 761 public void ShowGoToDlg() 762 { 763 Point pt = this.GetCaretPosition(); 764 765 frm_GOTO frm = new frm_GOTO(); 766 frm.label1.Text = "等号(1 - " + this.Lines.Length.ToString() + ")(&L)"; 767 frm.textBox1.Text = pt.X.ToString(); 768 if (frm.ShowDialog() == DialogResult.OK) 769 { 770 int Line = Convert.ToInt32(frm.textBox1.Text); 771 if (Line >= 1) 772 { 773 if (Line > this.Lines.Length+1) 774 { 775 MessageBox.Show("行数大于现有的行数"); 776 } 777 else 778 { 779 this.jumpLine(Line); 780 } 781 } 782 } 783 } 784 785 //RichTextBox 插入图片 786 public void ShowInsertImageDlg() 787 { 788 OpenFileDialog OpenFileDialog1 = new OpenFileDialog(); 789 OpenFileDialog1.Title = "Select Image"; 790 OpenFileDialog1.Filter = "BMP File|*.BMP|JPEG File|*.JPG|GIF File|*.GIF|PNG File|*.PNG|ICO File|*.ICO|Image File|*.BMP;*.DIB;*.RLE;*.JPG;*.JPEG;*.JPE;*.JFIF;*.GIF;*.EMF;*.WMF;*.TIF;*.PNG;*.ICO|All File|*.*"; 791 OpenFileDialog1.FilterIndex = 6; 792 if (OpenFileDialog1.ShowDialog() == DialogResult.OK) 793 { 794 string strImagePath = OpenFileDialog1.FileName; 795 Image img; 796 img = Image.FromFile(strImagePath); 797 Clipboard.SetDataObject(img); 798 DataFormats.Format df; 799 df = DataFormats.GetFormat(DataFormats.Bitmap); 800 if (this.CanPaste(df)) 801 { 802 this.Paste(df); 803 } 804 } 805 } 806 807 //插入表格对话框 808 public void ShowInsertTableDlg() 809 { 810 richTextBoxTableDlg dlg = new richTextBoxTableDlg(); 811 dlg.richTextBox = this; 812 813 if (dlg.ShowDialog() == DialogResult.OK) 814 { 815 richTextBoxTable r1 = new richTextBoxTable(); 816 r1.richTextBox = this; 817 r1.cellWidth = (int)dlg.numericUpDownCellWidth.Value; 818 r1.InsertTable((int)dlg.numericUpDownColumn.Value, (int)dlg.numericUpDownRow.Value, dlg.radioButtonAutoSzie.Checked); 819 } 820 } 821 822 823 public void ShowViewSourceDlg() 824 { 825 ViewRtfSoruceDlg rtfdlg = new ViewRtfSoruceDlg(); 826 827 string s = string.Format("文件很大 请等待... {0}KB", (richTextBox1.Rtf.Length /1204)); 828 829 //if (richTextBox1.Rtf.Length > 1024*1024) 830 // MessageBox.Show(s); 831 832 rtfdlg.textBox1.Text = richTextBox1.Rtf; 833 if (rtfdlg.ShowDialog()==DialogResult.OK) 834 { 835 richTextBox1.Rtf = rtfdlg.textBox1.Text; 836 } 837 Application.DoEvents(); 838 } 839 #endregion 840 841 #region RichTextBox 是否显示行号 842 #endregion 843 844 #region 实现 页面设置 打印预览 打印 845 846 //页面设置 847 public void ShowPageSetupDlg() 848 { 849 richTextBoxPrintClass r = new richTextBoxPrintClass(); 850 r.richTextBox = this; 851 r.ShowPageSetupDlg(); 852 } 853 //打印预览功能 854 public void ShowShowPagePriviewDlg() 855 { 856 richTextBoxPrintClass r = new richTextBoxPrintClass(); 857 r.richTextBox = this; 858 r.ShowShowPagePriviewDlg(); 859 } 860 861 //打印 862 public void ShowPrintDlg() 863 { 864 richTextBoxPrintClass r = new richTextBoxPrintClass(); 865 r.richTextBox = this; 866 r.ShowPrintDlg(); 867 } 868 #endregion 869 870 #region 支持表格正确粘贴 871 872 873 // P/Invoke declarations 874 [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 875 private static extern IntPtr LoadLibrary(string path); 876 877 private static IntPtr moduleHandle; 878 879 protected override CreateParams CreateParams 880 { 881 get 882 { 883 if (moduleHandle == IntPtr.Zero) 884 { 885 moduleHandle = LoadLibrary("msftedit.dll"); 886 if ((long)moduleHandle < 0x20) 887 { 888 throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not load Msftedit.dll"); 889 } 890 } 891 892 CreateParams createParams = base.CreateParams; 893 createParams.ClassName = "RichEdit50W"; 894 if (this.Multiline) 895 { 896 if (((this.ScrollBars & RichTextBoxScrollBars.Horizontal) != RichTextBoxScrollBars.None) && !base.WordWrap) 897 { 898 createParams.Style |= 0x100000; 899 if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None) 900 { 901 createParams.Style |= 0x2000; 902 } 903 } 904 if ((this.ScrollBars & RichTextBoxScrollBars.Vertical) != RichTextBoxScrollBars.None) 905 { 906 createParams.Style |= 0x200000; 907 if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None) 908 { 909 createParams.Style |= 0x2000; 910 } 911 } 912 } 913 if ((BorderStyle.FixedSingle == base.BorderStyle) && ((createParams.Style & 0x800000) != 0)) 914 { 915 createParams.Style &= -8388609; 916 createParams.ExStyle |= 0x200; 917 } 918 return createParams; 919 } 920 } 921 #endregion 922 } 923 924 }