附件:http://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 }
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Windows.Forms; 5 using System.Runtime.InteropServices; 6 7 8 //2013-11-27 02:00:13 9 ////清除样式 10 //richTextBoxBulletClass r = new richTextBoxBulletClass(); 11 //r.richTextBox = richTextBox1; 12 //r.RemoveSelectionParaFormat2(); 13 14 15 ////属性获得 16 17 //richTextBoxBulletClass r = new richTextBoxBulletClass(); 18 //r.richTextBox = richTextBox1; 19 //btn.Checked = r.SelectionOrderList; 20 21 22 ////设置样式 23 //richTextBoxBulletClass r = new richTextBoxBulletClass(); 24 //r.richTextBox = richTextBox1; 25 //r.SelectionOrderList = !r.SelectionOrderList; 26 27 namespace RichTextBoxCtrl 28 { 29 class richTextBoxBulletClass 30 { 31 public RichTextBox richTextBox; 32 public richTextBoxBulletClass() 33 { 34 richTextBox = new RichTextBox(); 35 } 36 37 #region PARAFORMAT2 38 [StructLayout(LayoutKind.Sequential)] 39 private class PARAFORMAT2 40 { 41 public int cbSize; 42 public int dwMask; 43 public short wNumbering; 44 public short wReserved; 45 public int dxStartIndent; 46 public int dxRightIndent; 47 public int dxOffset; 48 public short wAlignment; 49 public short cTabCount; 50 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)] 51 public int[] rgxTabs; 52 53 public int dySpaceBefore; // Vertical spacing before para 54 public int dySpaceAfter; // Vertical spacing after para 55 public int dyLineSpacing; // Line spacing depending on Rule 56 public short sStyle; // Style handle 57 public byte bLineSpacingRule; // Rule for line spacing (see tom.doc) 58 public byte bOutlineLevel; // Outline Level 59 public short wShadingWeight; // Shading in hundredths of a per cent 60 public short wShadingStyle; // Byte 0: style, nib 2: cfpat, 3: cbpat 61 public short wNumberingStart; // Starting value for numbering 62 public short wNumberingStyle; // Alignment, Roman/Arabic, (), ), ., etc. 63 public short wNumberingTab; // Space bet 1st indent and 1st-line text 64 public short wBorderSpace; // Border-text spaces (nbl/bdr in pts) 65 public short wBorderWidth; // Pen widths (nbl/bdr in half twips) 66 public short wBorders; // Border styles (nibble/border) 67 68 public PARAFORMAT2() 69 { 70 this.cbSize = Marshal.SizeOf(typeof(PARAFORMAT2)); 71 } 72 } 73 #endregion 74 75 #region PARAFORMAT MASK VALUES 76 77 78 79 public const uint WM_USER = 0x0400; 80 // RichEdit messages 81 public const uint EM_GETPARAFORMAT = (WM_USER + 61); 82 public const uint EM_SETPARAFORMAT = (WM_USER + 71); 83 84 // PARAFORMAT mask values 85 public const uint PFM_OFFSET = 0x00000004; 86 public const uint PFM_NUMBERING = 0x00000020; 87 88 // PARAFORMAT 2.0 masks and effects 89 public const uint PFM_NUMBERINGSTYLE = 0x00002000;//设置项目编号的样式 90 public const uint PFM_NUMBERINGTAB = 0x00004000;//设置项目编号按下Tab键的信息 91 public const uint PFM_NUMBERINGSTART = 0x00008000;//设置项目编号的开始标识 92 93 94 95 //wNumbering 96 //Options used for bulleted or numbered paragraphs. 97 //To use this member, set the PFM_NUMBERING flag in the dwMask member. 98 //This member can be one of the following values. 99 public enum Paraformat2Numbering 100 { 101 zero = 0, 102 Normal = 1, //No paragraph numbering or bullets. 103 ArabicNumbers = 2, //Uses Arabic numbers (1, 2, 3, ...). 104 LowerCaseLetter = 3, //Uses lowercase letters (a, b, c, ...). 105 UpperCaseLetter = 4, //Uses uppercase letters (A, B, C, ...). 106 LowerCaseRoman = 5, //Uses lowercase Roman numerals (i, ii, iii, ...). 107 UpperCaseRoman = 6 //Uses uppercase Roman numerals (I, II, III, ...). 108 } 109 110 //wNumberingStyle 111 //Numbering style used with numbered paragraphs. 112 //Use this member in conjunction with the wNumbering member. 113 //This member is included only for compatibility with TOM interfaces; 114 //the rich edit control stores the value but rich edit versions earlier than 3.0 do not use it to display the text or bullets. 115 //To use this member, set the PFM_NUMBERINGSTYLE flag in the dwMask member. 116 //This member can be one of the following values. 117 public enum Paraformat2NumberingStyle 118 { 119 RightParenthesis = 0x000,//Follows the number with a right parenthesis. 120 DoubleParenthesis = 0x100,//Encloses the number in parentheses. 121 Period = 0x200,//Follows the number with a period. 122 Plain = 0x300,//Displays only the number. 123 zero = 0x400//Continues a numbered list without applying the next number or bullet. 124 } 125 126 #endregion 127 128 #region SetSelectionParaFormat2 129 130 [DllImport("user32.dll")] 131 private static extern IntPtr SendMessage(IntPtr hWnd, uint msg, uint wParam, [In, Out, MarshalAs(UnmanagedType.LPStruct)] PARAFORMAT2 lParam); 132 133 public void SetSelectionParaFormat2(Paraformat2NumberingStyle style, Paraformat2Numbering Number) 134 { 135 PARAFORMAT2 p = new PARAFORMAT2(); 136 p.dwMask = (int)(PFM_NUMBERING | PFM_OFFSET | PFM_NUMBERINGSTART | PFM_NUMBERINGSTYLE | PFM_NUMBERINGTAB); 137 138 p.wNumbering = (short)Number; 139 //p.dxOffset = BulletIndent; 140 p.wNumberingStyle = (short)style; 141 p.wNumberingStart = 1; 142 p.wNumberingTab = 500; 143 144 SendMessage(richTextBox.Handle, EM_SETPARAFORMAT, 0, p); 145 } 146 #endregion 147 148 149 //获得 wNumbering的返回值 150 public Paraformat2Numbering GetSelectionParaformat2wNumbering() 151 { 152 PARAFORMAT2 p = new PARAFORMAT2(); 153 SendMessage(richTextBox.Handle, EM_GETPARAFORMAT, 0, p); 154 return (Paraformat2Numbering)p.wNumbering; 155 } 156 157 //获得wNumberingStyleg的返回值 158 public Paraformat2NumberingStyle GetSelectionParaformat2wNumberingStyle() 159 { 160 PARAFORMAT2 p = new PARAFORMAT2(); 161 SendMessage(richTextBox.Handle, EM_GETPARAFORMAT, 0, p); 162 return (Paraformat2NumberingStyle)p.wNumberingStyle; 163 } 164 165 #region 更多样式... ... 166 167 private void test() 168 { 169 //●●●● 170 SetSelectionParaFormat2(Paraformat2NumberingStyle.Period, Paraformat2Numbering.Normal); 171 //1 2 3 4 5 ... 172 SetSelectionParaFormat2(Paraformat2NumberingStyle.Plain, Paraformat2Numbering.ArabicNumbers); 173 //1. 2. 3. 4. 5. ... 174 SetSelectionParaFormat2(Paraformat2NumberingStyle.Period, Paraformat2Numbering.ArabicNumbers); 175 //1) 2) 3) 4) ... 176 SetSelectionParaFormat2(Paraformat2NumberingStyle.RightParenthesis, Paraformat2Numbering.ArabicNumbers); 177 //(1) (2) (3) (4) ... 178 SetSelectionParaFormat2(Paraformat2NumberingStyle.DoubleParenthesis, Paraformat2Numbering.ArabicNumbers); 179 ////////////////////////////////////////////////////////////////////////// 180 181 //a b c d e 182 SetSelectionParaFormat2(Paraformat2NumberingStyle.Plain, Paraformat2Numbering.LowerCaseLetter); 183 //a. b. c. d. e. 184 SetSelectionParaFormat2(Paraformat2NumberingStyle.Period, Paraformat2Numbering.LowerCaseLetter); 185 //a) b) c) d) e) 186 SetSelectionParaFormat2(Paraformat2NumberingStyle.RightParenthesis, Paraformat2Numbering.LowerCaseLetter); 187 //(a) (b) (c) (d) (e) 188 SetSelectionParaFormat2(Paraformat2NumberingStyle.DoubleParenthesis, Paraformat2Numbering.LowerCaseLetter); 189 ////////////////////////////////////////////////////////////////////////// 190 191 //A B C D E 192 SetSelectionParaFormat2(Paraformat2NumberingStyle.Plain, Paraformat2Numbering.UpperCaseLetter); 193 //A. B. C. D. E. 194 SetSelectionParaFormat2(Paraformat2NumberingStyle.Period, Paraformat2Numbering.UpperCaseLetter); 195 //A) B) C) D) E) 196 SetSelectionParaFormat2(Paraformat2NumberingStyle.RightParenthesis, Paraformat2Numbering.UpperCaseLetter); 197 //(A) (B) (C) (D) (E) 198 SetSelectionParaFormat2(Paraformat2NumberingStyle.DoubleParenthesis, Paraformat2Numbering.UpperCaseLetter); 199 ////////////////////////////////////////////////////////////////////////// 200 201 //I II III IIII IV 202 SetSelectionParaFormat2(Paraformat2NumberingStyle.Plain, Paraformat2Numbering.LowerCaseRoman); 203 //I. II. III. IIII. IV. 204 SetSelectionParaFormat2(Paraformat2NumberingStyle.Period, Paraformat2Numbering.LowerCaseRoman); 205 //I) II) III) IIII) IV) 206 SetSelectionParaFormat2(Paraformat2NumberingStyle.RightParenthesis, Paraformat2Numbering.LowerCaseRoman); 207 //(I) (II) (III) (IIII) (IV) 208 SetSelectionParaFormat2(Paraformat2NumberingStyle.DoubleParenthesis, Paraformat2Numbering.LowerCaseRoman); 209 ////////////////////////////////////////////////////////////////////////// 210 211 } 212 #endregion 213 214 215 216 //清除选中的样式 217 public void RemoveSelectionParaFormat2() 218 { 219 SetSelectionParaFormat2(0, 0); 220 } 221 222 223 224 #region 数字序列 1. 2. 3. 4. 5. ... 225 private bool bOrder = false; 226 public bool SelectionOrderList 227 { 228 get 229 { 230 return ( 231 (GetSelectionParaformat2wNumbering() == Paraformat2Numbering.ArabicNumbers) && 232 (GetSelectionParaformat2wNumberingStyle() == Paraformat2NumberingStyle.Period) 233 ); 234 235 } 236 set 237 { 238 bOrder = value; 239 240 if (value == true) 241 SetSelectionParaFormat2(Paraformat2NumberingStyle.Period, Paraformat2Numbering.ArabicNumbers); 242 else 243 RemoveSelectionParaFormat2(); 244 } 245 } 246 #endregion 247 248 } 249 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Windows.Forms; 6 using System.Drawing; 7 8 9 //使用 10 ////set font Size font Style bold Italic 11 //// 12 ////普通 not bold italic 13 ////标题1 字体大小 24 Bold 14 ////标题2 字体大小 18 Bold 15 ////标题3 字体大小 14 Bold 16 ////标题4 字体大小 12 Bold 17 ////标题5 字体大小 10 Bold 18 ////标题6 字体大小 8 Bold 19 ////地址 字体大小 12 Italic 20 21 //private RichTextBoxCtrl.richTextBoxFontFormatClass r = new RichTextBoxCtrl.richTextBoxFontFormatClass(); 22 //private void Form1_Load(object sender, EventArgs e) 23 //{ 24 // r.richTextBox = richTextBox1; 25 // comboBox1.Items.Clear(); 26 // comboBox1.Items.AddRange(new object[] { 27 // "普通", 28 // "标题1", 29 // "标题2", 30 // "标题3", 31 // "标题4", 32 // "标题5", 33 // "标题6", 34 // "地址 "}); 35 //} 36 37 //private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 38 //{ 39 // r.SetFontFormat(comboBox1.SelectedIndex); 40 41 // //SetFontFormat(comboBox1.SelectedIndex); 42 // Text = r.GetFontFormat().ToString(); 43 //} 44 45 //private void richTextBox1_SelectionChanged(object sender, EventArgs e) 46 //{ 47 // Text = r.GetFontFormat(); 48 // comboBox1.Text = r.GetFontFormat(); 49 //} 50 51 namespace RichTextBoxCtrl 52 { 53 class richTextBoxFontFormatClass 54 { 55 public richTextBoxFontFormatClass() 56 { 57 58 } 59 public RichTextBox richTextBox; 60 61 public void SetFontFormat(int formatIndex) 62 { 63 float fontSize = richTextBox.Font.Size; 64 string fontName = richTextBox.Font.Name; 65 switch (formatIndex) 66 { 67 case 0://普通 68 richTextBox.SelectionFont = new Font(fontName, fontSize, FontStyle.Regular); 69 break; 70 case 1://标题1 71 richTextBox.SelectionFont = new Font(fontName, 24f, FontStyle.Bold); 72 break; 73 case 2: //标题2 74 richTextBox.SelectionFont = new Font(fontName, 18f, FontStyle.Bold); 75 break; 76 case 3: //标题3 77 richTextBox.SelectionFont = new Font(fontName, 14f, FontStyle.Bold); 78 break; 79 case 4://标题4 80 richTextBox.SelectionFont = new Font(fontName, 12f, FontStyle.Bold); 81 break; 82 case 5: //标题5 83 richTextBox.SelectionFont = new Font(fontName, 10f, FontStyle.Bold); 84 break; 85 case 6: //标题6 86 richTextBox.SelectionFont = new Font(fontName, 8f, FontStyle.Bold); 87 break; 88 case 7: //地址 89 richTextBox.SelectionFont = new Font(fontName, 12f, FontStyle.Italic); 90 break; 91 } 92 } 93 public string GetFontFormat() 94 { 95 string Result = "普通"; 96 if (richTextBox.SelectionFont !=null ) 97 { 98 float fontSize = richTextBox.SelectionFont.Size; 99 FontStyle fontStyle = richTextBox.SelectionFont.Style; 100 101 if (fontSize == 24 && fontStyle == FontStyle.Bold) 102 Result = "标题1"; 103 else 104 if (fontSize == 18 && fontStyle == FontStyle.Bold) 105 Result = "标题2"; 106 else 107 if (fontSize == 14 && fontStyle == FontStyle.Bold) 108 Result = "标题3"; 109 else 110 if (fontSize == 12 && fontStyle == FontStyle.Bold) 111 Result = "标题4"; 112 else 113 if (fontSize == 10 && fontStyle == FontStyle.Bold) 114 Result = "标题5"; 115 else 116 if (fontSize == 8 && fontStyle == FontStyle.Bold) 117 Result = "标题6"; 118 else 119 if (fontSize == 12 && fontStyle == FontStyle.Italic) 120 Result = "地址"; 121 else 122 Result = "普通"; 123 } 124 else 125 Result = "普通"; 126 return Result; 127 } 128 } 129 }
1 using System; 2 using System.Windows.Forms; 3 using System.Drawing; 4 using System.Runtime.InteropServices; 5 using System.Drawing.Printing; 6 7 8 #region 调用示例 9 /*使用 10 //页面设置 11 private void btnPageSetup_Click(object sender, EventArgs e) 12 { 13 richTextBoxPrintClass r = new richTextBoxPrintClass(); 14 r.richTextBox = richTextBox1; 15 r.ShowPageSetupDlg(); 16 } 17 //打印预览功能 18 private void btnPrintPreview_Click(object sender, EventArgs e) 19 { 20 richTextBoxPrintClass r = new richTextBoxPrintClass(); 21 r.richTextBox = richTextBox1; 22 r.ShowShowPagePriviewDlg(); 23 } 24 //打印 25 private void btnPrint_Click(object sender, EventArgs e) 26 { 27 richTextBoxPrintClass r = new richTextBoxPrintClass(); 28 r.richTextBox = richTextBox1; 29 r.ShowPrintDlg(); 30 } 31 */ 32 #endregion 33 //http://support.microsoft.com/kb/812425/zh-cn 34 namespace RichTextBoxCtrl 35 { 36 class richTextBoxPrintClass 37 { 38 public richTextBoxPrintClass() 39 { 40 InitializeComponent(); 41 } 42 #region 打印功用 43 44 //and the unit used by Win32 API calls (twips 1/1440 inch) 45 private const double anInch = 14.4; 46 47 [StructLayout(LayoutKind.Sequential)] 48 private struct RECT 49 { 50 public int Left; 51 public int Top; 52 public int Right; 53 public int Bottom; 54 } 55 56 [StructLayout(LayoutKind.Sequential)] 57 private struct CHARRANGE 58 { 59 public int cpMin; //First character of range (0 for start of doc) 60 public int cpMax; //Last character of range (-1 for end of doc) 61 } 62 63 [StructLayout(LayoutKind.Sequential)] 64 private struct FORMATRANGE 65 { 66 public IntPtr hdc; //Actual DC to draw on 67 public IntPtr hdcTarget; //Target DC for determining text formatting 68 public RECT rc; //Region of the DC to draw to (in twips) 69 public RECT rcPage; //Region of the whole DC (page size) (in twips) 70 public CHARRANGE chrg; //Range of text to draw (see earlier declaration) 71 } 72 73 private const int WM_USER = 0x0400; 74 private const int EM_FORMATRANGE = WM_USER + 57; 75 76 [DllImport("USER32.dll")] 77 private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 78 79 80 // Render the contents of the RichTextBox for printing 81 // Return the last character printed + 1 (printing start from this point for next page) 82 public static int Print(RichTextBox richTextBox, int charFrom, int charTo, PrintPageEventArgs e) 83 { 84 //Calculate the area to render and print 85 RECT rectToPrint; 86 rectToPrint.Top = (int)(e.MarginBounds.Top * anInch); 87 rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch); 88 rectToPrint.Left = (int)(e.MarginBounds.Left * anInch); 89 rectToPrint.Right = (int)(e.MarginBounds.Right * anInch); 90 91 //Calculate the size of the page 92 RECT rectPage; 93 rectPage.Top = (int)(e.PageBounds.Top * anInch); 94 rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch); 95 rectPage.Left = (int)(e.PageBounds.Left * anInch); 96 rectPage.Right = (int)(e.PageBounds.Right * anInch); 97 98 IntPtr hdc = e.Graphics.GetHdc(); 99 100 FORMATRANGE fmtRange; 101 fmtRange.chrg.cpMax = charTo; //Indicate character from to character to 102 fmtRange.chrg.cpMin = charFrom; 103 fmtRange.hdc = hdc; //Use the same DC for measuring and rendering 104 fmtRange.hdcTarget = hdc; //Point at printer hDC 105 fmtRange.rc = rectToPrint; //Indicate the area on page to print 106 fmtRange.rcPage = rectPage; //Indicate size of page 107 108 IntPtr res = IntPtr.Zero; 109 110 IntPtr wparam = IntPtr.Zero; 111 wparam = new IntPtr(1); 112 113 //Get the pointer to the FORMATRANGE structure in memory 114 IntPtr lparam = IntPtr.Zero; 115 lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange)); 116 Marshal.StructureToPtr(fmtRange, lparam, false); 117 118 //Send the rendered data for printing 119 res = SendMessage(richTextBox.Handle, EM_FORMATRANGE, wparam, lparam); 120 121 //Free the block of memory allocated 122 Marshal.FreeCoTaskMem(lparam); 123 124 //Release the device context handle obtained by a previous call 125 e.Graphics.ReleaseHdc(hdc); 126 127 //Return last + 1 character printer 128 return res.ToInt32(); 129 } 130 131 #endregion 132 133 134 #region 初始化 135 public RichTextBox richTextBox; 136 private PageSetupDialog pageSetupDialog1; 137 private PrintDialog printDialog1; 138 private PrintDocument printDocument1; 139 private PrintPreviewDialog printPreviewDialog1; 140 141 private void InitializeComponent() 142 { 143 richTextBox = new RichTextBox(); 144 pageSetupDialog1 = new PageSetupDialog(); 145 printDialog1 = new PrintDialog(); 146 printDocument1 = new PrintDocument(); 147 printPreviewDialog1 = new PrintPreviewDialog(); 148 149 // 150 // pageSetupDialog1 151 // 152 pageSetupDialog1.Document = printDocument1; 153 // 154 // printDialog1 155 // 156 printDialog1.Document = printDocument1; 157 printDialog1.UseEXDialog = true; 158 // 159 // printDocument1 160 // 161 printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage); 162 printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(printDocument1_BeginPrint); 163 // 164 // printPreviewDialog1 165 // 166 167 printPreviewDialog1.AutoScrollMargin = new System.Drawing.Size(0, 0); 168 printPreviewDialog1.AutoScrollMinSize = new System.Drawing.Size(0, 0); 169 printPreviewDialog1.ClientSize = new System.Drawing.Size(400, 300); 170 printPreviewDialog1.Document = printDocument1; 171 printPreviewDialog1.Enabled = true; 172 // printPreviewDialog1.Icon = ((System.Drawing.Icon)(resources.GetObject("printPreviewDialog1.Icon"))); 173 printPreviewDialog1.Name = "printPreviewDialog1"; 174 printPreviewDialog1.Visible = false; 175 } 176 177 178 private int checkPrint; 179 private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) 180 { 181 checkPrint = 0; 182 } 183 184 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 185 { 186 // Print the content of RichTextBox. Store the last character printed. 187 //checkPrint = richTextBoxPrintCtrl1.Print(checkPrint, richTextBoxPrintCtrl1.TextLength, e); 188 checkPrint = richTextBoxPrintClass.Print(richTextBox, checkPrint, richTextBox.TextLength, e); 189 190 // Check for more pages 191 if (checkPrint < richTextBox.TextLength) 192 e.HasMorePages = true; 193 else 194 e.HasMorePages = false; 195 } 196 197 198 #endregion 199 200 201 //页面设置功能 202 public void ShowPageSetupDlg() 203 { 204 pageSetupDialog1.ShowDialog(); 205 } 206 207 //打印预览功能 208 public void ShowShowPagePriviewDlg() 209 { 210 printPreviewDialog1.ShowDialog(); 211 } 212 213 //打印 214 public void ShowPrintDlg() 215 { 216 if (printDialog1.ShowDialog() == DialogResult.OK) 217 printDocument1.Print(); 218 } 219 } 220 }
1 using System; 2 using System.Runtime.InteropServices; 3 using System.Windows.Forms; 4 using System.Text; 5 6 //private void button2_Click(object sender, EventArgs e) 7 //{ 8 // richTextBoxTableDlg dlg = new richTextBoxTableDlg(); 9 // dlg.richTextBox = richTextBox51; 10 11 // if (dlg.ShowDialog() ==DialogResult.OK) 12 // { 13 // richTextBoxTable r1 = new richTextBoxTable(); 14 // r1.richTextBox = richTextBox51; 15 // r1.cellWidth = (int)dlg.numericUpDownCellWidth.Value ; 16 // r1.InsertTable((int)dlg.numericUpDownColumn.Value, (int)dlg.numericUpDownRow.Value, dlg.radioButtonAutoSzie.Checked); 17 // } 18 //} 19 /* 20 * 光标在表格上可以改变光标 21 */ 22 23 namespace richTextBoxTableClass 24 { 25 public class richTextBoxTable 26 { 27 28 public richTextBoxTable() 29 { 30 31 } 32 33 public RichTextBox richTextBox; 34 public int cellWidth;// = 1000;//default =1000 35 36 /// <summary> 37 /// 插入表格 38 /// </summary> 39 /// <param name="col">行</param> 40 /// <param name="row">列</param> 41 /// <param name="AutoSize">=TRUE:自动设置每个单元格的大小</param> 42 public void InsertTable(int col, int row,bool AutoSize) 43 { 44 StringBuilder rtf = new StringBuilder(); 45 rtf.Append(@"{\rtf1 "); 46 47 //int cellWidth = 1000;//col.1 width =1000 48 if (AutoSize) 49 //滚动条出现时 (richTextBox.ClientSize.Width - 滚动条的宽 /列的个数)*15 50 cellWidth = ((richTextBox.ClientSize.Width-3) / row) * 15; 51 for (int i = 0; i < col; i++) 52 { 53 rtf.Append(@"\trowd"); 54 for (int j = 1; j <= row; j++) 55 rtf.Append(@"\cellx" + (j * cellWidth).ToString()); 56 rtf.Append(@"\intbl \cell \row"); //create row 57 } 58 rtf.Append(@"\pard"); 59 rtf.Append(@"}"); 60 richTextBox.SelectedRtf = rtf.ToString(); 61 //return rtf.ToString(); 62 } 63 } 64 }