我们知道在VS.NET环境下有一个RichTextBox控件可以很好的显示Rtf文档,可是有的时候我们需要以图形的形式来显示一个Rtf格式的文档.但RichTextBox并不支持把显示的内容存成图片,经过查找资料我得到了如下的代码,使用这些代码就可以把以RichTextBox显示Rtf格式的内容很好的显示为图片,或使用到Graphics中.
internal
class
PrintableRtf:RichTextBox![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
...
{ //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;![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) [StructLayout(LayoutKind.Sequential)] private struct RECT![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif) ...{ public int Left; public int Top; public int Right; public int Bottom; }![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) [StructLayout(LayoutKind.Sequential)] private struct CHARRANGE![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif) ...{ public int cpMin; //First character of range (0 for start of doc) public int cpMax; //Last character of range (-1 for end of doc) }![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) [StructLayout(LayoutKind.Sequential)] private struct FORMATRANGE![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif) ...{ 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) }![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) private const int WM_USER = 0x0400; private const int EM_FORMATRANGE = WM_USER + 57;![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) [DllImport("USER32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) // 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, RectangleF marginBounds, RectangleF pageBounds, Graphics g)![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif) ...{ //Calculate the area to render and print RECT rectToPrint; rectToPrint.Top = (int)(marginBounds.Top * anInch); rectToPrint.Bottom = (int)(marginBounds.Bottom * anInch); rectToPrint.Left = (int)(marginBounds.Left * anInch); rectToPrint.Right = (int)(marginBounds.Right * anInch);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) //Calculate the size of the page RECT rectPage; rectPage.Top = (int)(pageBounds.Top * anInch); rectPage.Bottom = (int)(pageBounds.Bottom * anInch); rectPage.Left = (int)(pageBounds.Left * anInch); rectPage.Right = (int)(pageBounds.Right * anInch);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) IntPtr hdc = g.GetHdc();![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) 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![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) IntPtr res = IntPtr.Zero;![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) IntPtr wparam = IntPtr.Zero; wparam = new IntPtr(1);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) //Get the pointer to the FORMATRANGE structure in memory IntPtr lparam = IntPtr.Zero; lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange)); Marshal.StructureToPtr(fmtRange, lparam, false);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) //Send the rendered data for printing res = SendMessage(this.Handle, EM_FORMATRANGE, wparam, lparam);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) //Free the block of memory allocated Marshal.FreeCoTaskMem(lparam);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) //Release the device context handle obtained by a previous call g.ReleaseHdc(hdc);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif) //Return last + 1 character printer return res.ToInt32(); } }
Rectangle rect
=
new
Rectangle(
0
,
0
,
800
,
600
);![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
using
(Bitmap bit
=
new
Bitmap(
800
,
600
))![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
...
{ using (Graphics g = Graphics.FromImage(bit))![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif) ...{ int EndPoint = m_PrintableRtf.Print(0, this.m_PrintableRtf.TextLength, rect, rect, e.Graphics); } bit.Save(@"D: tf.bmp"); }
|