CopyGraphToBitmap
(
Int32 bitmapWidthPx,
Int32 bitmapHeightPx
)
{
const String MethodName = "CopyGraphToBitmap";
this.ArgumentChecker.CheckArgumentPositive(MethodName, "bitmapWidthPx",
bitmapWidthPx);
this.ArgumentChecker.CheckArgumentPositive(MethodName, "bitmapHeightPx",
bitmapHeightPx);
CheckIfLayingOutGraph(MethodName);
// Save the current vertex locations.
LayoutSaver oLayoutSaver = new LayoutSaver(this.Graph);
// Adjust the control's graph scale so that the graph's vertices and
// edges will be the same relative size in the image that they are in
// the control.
GraphImageScaler oGraphImageScaler = new GraphImageScaler(this);
oGraphImageScaler.SetGraphScale(bitmapWidthPx, bitmapHeightPx,
WpfGraphicsUtil.GetScreenDpi(this).Width);
// Adjust the control's transforms so that the image will be centered
// on the same point on the graph that the control is centered on.
GraphImageCenterer oGraphImageCenterer = new GraphImageCenterer(this);
oGraphImageCenterer.CenterGraphImage(
new Size(bitmapWidthPx, bitmapHeightPx) );
// Transform the graph's layout to the specified size.
Double dOriginalActualWidth = this.ActualWidth;
Double dOriginalActualHeight = this.ActualHeight;
Rect oBitmapRectangle = new Rect(0, 0,
(Double)bitmapWidthPx, (Double)bitmapHeightPx);
TransformLayout(oBitmapRectangle);
Debug.Assert(m_eLayoutState == LayoutState.Stable);
DrawGraph(oBitmapRectangle);
System.Drawing.Bitmap oBitmap = WpfGraphicsUtil.VisualToBitmap(this,
bitmapWidthPx, bitmapHeightPx);
// Restore the original layout.
//
// NOTE:
//
// Don't try calling TransformLayout() again using the original
// rectangle. The first call to TransformLayout() lost "resolution" if
// the layout was transformed to a smaller rectangle, and attempting to
// reverse the transform will yield poor results.
oLayoutSaver.RestoreLayout();
oGraphImageScaler.RestoreGraphScale();
oBitmapRectangle =
new Rect(0, 0, dOriginalActualWidth, dOriginalActualHeight);
Debug.Assert(m_eLayoutState == LayoutState.Stable);
DrawGraph(oBitmapRectangle);
oGraphImageCenterer.RestoreCenter();
return (oBitmap);
}