ZedGraph 柱状图、饼图、折线图演示源码

  1. //
  2. //This library is free software; you can redistribute it and/or
  3. //modify it under the terms of the GNU Lesser General Public
  4. //License as published by the Free Software Foundation; either
  5. //version 2.1 of the License, or (at your option) any later version.
  6. //
  7. //This library is distributed in the hope that it will be useful,
  8. //but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  10. //Lesser General Public License for more details.
  11. //
  12. //You should have received a copy of the GNU Lesser General Public
  13. //License along with this library; if not, write to the Free Software
  14. //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15. //=============================================================================
  16.  
  17. using System;
  18. using System.ComponentModel;
  19. using System.Drawing;
  20. using System.Drawing.Drawing2D;
  21. using System.Drawing.Text;
  22. using System.Windows.Forms;
  23. using System.Threading;
  24. using System.Drawing.Imaging;
  25. using System.IO;
  26. using System.Text;
  27.  
  28. using System.Runtime.InteropServices;
  29. //using System.Diagnostics;
  30.  
  31. namespace ZedGraph
  32. {
  33.     partial class ZedGraphControl
  34.     {
  35.  
  36.     #region ContextMenu
  37.  
  38.         // Revision: JCarpenter 10/06
  39.         /// <summary>
  40.         /// Public enumeration that specifies the type of
  41.         /// object present at the Context Menu's mouse location
  42.         /// </summary>
  43.         public enum ContextMenuObjectState
  44.         {
  45.             /// <summary>
  46.             /// The object is an Inactive Curve Item at the Context Menu's mouse position
  47.             /// </summary>
  48.             InactiveSelection,
  49.             /// <summary>
  50.             /// The object is an active Curve Item at the Context Menu's mouse position
  51.             /// </summary>
  52.             ActiveSelection,
  53.             /// <summary>
  54.             /// There is no selectable object present at the Context Menu's mouse position
  55.             /// </summary>
  56.             Background
  57.         }
  58.  
  59.         //Revision: JCarpenter 10/06
  60.         /// <summary>
  61.         /// Find the object currently under the mouse cursor, and return its state.
  62.         /// </summary>
  63.         private ContextMenuObjectState GetObjectState()
  64.         {
  65.             ContextMenuObjectState objState = ContextMenuObjectState.Background;
  66.  
  67.             // Determine object state
  68.             Point mousePt = this.PointToClient( Control.MousePosition );
  69.             int iPt;
  70.             GraphPane pane;
  71.             object nearestObj;
  72.  
  73.             using ( Graphics g = this.CreateGraphics() )
  74.             {
  75.                 if ( this.MasterPane.FindNearestPaneObject( mousePt, g, out pane,
  76.                         out nearestObj, out iPt ) )
  77.                 {
  78.                     CurveItem item = nearestObj as CurveItem;
  79.  
  80.                     if ( item != null && iPt >= 0 )
  81.                     {
  82.                         if ( item.IsSelected )
  83.                             objState = ContextMenuObjectState.ActiveSelection;
  84.                         else
  85.                             objState = ContextMenuObjectState.InactiveSelection;
  86.                     }
  87.                 }
  88.             }
  89.  
  90.             return objState;
  91.         }
  92.  
  93.         /// <summary>
  94.         /// protected method to handle the popup context menu in the <see cref="ZedGraphControl"/>.
  95.         /// </summary>
  96.         /// <param name="sender"></param>
  97.         /// <param name="e"></param>
  98.         private void contextMenuStrip1_Opening( object sender, CancelEventArgs e )
  99.         {
  100.             // disable context menu by default
  101.             e.Cancel = true;
  102.             ContextMenuStrip menuStrip = sender as ContextMenuStrip;
  103.  
  104.             //Revision: JCarpenter 10/06
  105.             ContextMenuObjectState objState = GetObjectState();
  106.  
  107.             if ( _masterPane != null && menuStrip != null )
  108.             {
  109.                 menuStrip.Items.Clear();
  110.  
  111.                 _isZooming = false;
  112.                 _isPanning = false;
  113.                 Cursor.Current = Cursors.Default;
  114.  
  115.                 _menuClickPt = this.PointToClient( Control.MousePosition );
  116.                 GraphPane pane = _masterPane.FindPane( _menuClickPt );
  117.  
  118.                 if ( _isShowContextMenu )
  119.                 {
  120.                     string menuStr = string.Empty;
  121.  
  122.                     ToolStripMenuItem item = new ToolStripMenuItem();
  123.                     item.Name = "copy";
  124.                     item.Tag = "copy";
  125.                     item.Text = _resourceManager.GetString( "copy" );
  126.                     item.Click += new System.EventHandler( this.MenuClick_Copy );
  127.                     menuStrip.Items.Add( item );
  128.  
  129.                     item = new ToolStripMenuItem();
  130.                     item.Name = "save_as";
  131.                     item.Tag = "save_as";
  132.                     item.Text = _resourceManager.GetString( "save_as" );
  133.                     item.Click += new System.EventHandler( this.MenuClick_SaveAs );
  134.                     menuStrip.Items.Add( item );
  135.  
  136.                     item = new ToolStripMenuItem();
  137.                     item.Name = "page_setup";
  138.                     item.Tag = "page_setup";
  139.                     item.Text = _resourceManager.GetString( "page_setup" );
  140.                     item.Click += new System.EventHandler( this.MenuClick_PageSetup );
  141.                     menuStrip.Items.Add( item );
  142.  
  143.                     item = new ToolStripMenuItem();
  144.                     item.Name = "print";
  145.                     item.Tag = "print";
  146.                     item.Text = _resourceManager.GetString( "print" );
  147.                     item.Click += new System.EventHandler( this.MenuClick_Print );
  148.                     menuStrip.Items.Add( item );
  149.  
  150.                     item = new ToolStripMenuItem();
  151.                     item.Name = "show_val";
  152.                     item.Tag = "show_val";
  153.                     item.Text = _resourceManager.GetString( "show_val" );
  154.                     item.Click += new System.EventHandler( this.MenuClick_ShowValues );
  155.                     item.Checked = this.IsShowPointValues;
  156.                     menuStrip.Items.Add( item );
  157.  
  158.                     item = new ToolStripMenuItem();
  159.                     item.Name = "unzoom";
  160.                     item.Tag = "unzoom";
  161.  
  162.                     if ( pane == null || pane.ZoomStack.IsEmpty )
  163.                         menuStr = _resourceManager.GetString( "unzoom" );
  164.                     else
  165.                     {
  166.                         switch ( pane.ZoomStack.Top.Type )
  167.                         {
  168.                             case ZoomState.StateType.Zoom:
  169.                             case ZoomState.StateType.WheelZoom:
  170.                                 menuStr = _resourceManager.GetString( "unzoom" );
  171.                                 break;
  172.                             case ZoomState.StateType.Pan:
  173.                                 menuStr = _resourceManager.GetString( "unpan" );
  174.                                 break;
  175.                             case ZoomState.StateType.Scroll:
  176.                                 menuStr = _resourceManager.GetString( "unscroll" );
  177.                                 break;
  178.                         }
  179.                     }
  180.  
  181.                     //menuItem.Text = "Un-" + ( ( pane == null || pane.zoomStack.IsEmpty ) ?
  182.                     //  "Zoom" : pane.zoomStack.Top.TypeString );
  183.                     item.Text = menuStr;
  184.                     item.Click += new EventHandler( this.MenuClick_ZoomOut );
  185.                     if ( pane == null || pane.ZoomStack.IsEmpty )
  186.                         item.Enabled = false;
  187.                     menuStrip.Items.Add( item );
  188.  
  189.                     item = new ToolStripMenuItem();
  190.                     item.Name = "undo_all";
  191.                     item.Tag = "undo_all";
  192.                     menuStr = _resourceManager.GetString( "undo_all" );
  193.                     item.Text = menuStr;
  194.                     item.Click += new EventHandler( this.MenuClick_ZoomOutAll );
  195.                     if ( pane == null || pane.ZoomStack.IsEmpty )
  196.                         item.Enabled = false;
  197.                     menuStrip.Items.Add( item );
  198.  
  199.                     item = new ToolStripMenuItem();
  200.                     item.Name = "set_default";
  201.                     item.Tag = "set_default";
  202.                     menuStr = _resourceManager.GetString( "set_default" );
  203.                     item.Text = menuStr;
  204.                     item.Click += new EventHandler( this.MenuClick_RestoreScale );
  205.                     if ( pane == null )
  206.                         item.Enabled = false;
  207.                     menuStrip.Items.Add( item );
  208.  
  209.                     // if e.Cancel is set to false, the context menu does not display
  210.                     // it is initially set to false because the context menu has no items
  211.                     e.Cancel = false;
  212.  
  213.                     // Provide Callback for User to edit the context menu
  214.                     //Revision: JCarpenter 10/06 - add ContextMenuObjectState objState
  215.                     if ( this.ContextMenuBuilder != null )
  216.                         this.ContextMenuBuilder( this, menuStrip, _menuClickPt, objState );
  217.                 }
  218.             }
  219.         }
  220.  
  221.         /// <summary>
  222.         /// Handler for the "Copy" context menu item.  Copies the current image to a bitmap on the
  223.         /// clipboard.
  224.         /// </summary>
  225.         /// <param name="sender"></param>
  226.         /// <param name="e"></param>
  227.         protected void MenuClick_Copy( System.Object sender, System.EventArgs e )
  228.         {
  229.             Copy( _isShowCopyMessage );
  230.         }
  231.  
  232.         /// <summary>
  233.         /// Handler for the "Copy" context menu item.  Copies the current image to a bitmap on the
  234.         /// clipboard.
  235.         /// </summary>
  236.         /// <param name="isShowMessage">boolean value that determines whether or not a prompt will be
  237.         /// displayed.  true to show a message of "Image Copied to ClipBoard".</param>
  238.         public void Copy( bool isShowMessage )
  239.         {
  240.             if ( _masterPane != null )
  241.             {
  242.                 //Clipboard.SetDataObject( _masterPane.GetImage(), true );
  243.  
  244.                 // Threaded copy mode to avoid crash with MTA
  245.                 // Contributed by Dave Moor
  246.                 Thread ct = new Thread( new ThreadStart( this.ClipboardCopyThread ) );
  247.                 //ct.ApartmentState = ApartmentState.STA;
  248.                 ct.SetApartmentState( ApartmentState.STA );
  249.                 ct.Start();
  250.                 ct.Join();
  251.  
  252.                 if ( isShowMessage )
  253.                 {
  254.                     string str = _resourceManager.GetString( "copied_to_clip" );
  255.                     //MessageBox.Show( "Image Copied to ClipBoard" );
  256.                     MessageBox.Show( str );
  257.                 }
  258.             }
  259.         }
  260.  
  261.         /// <summary>
  262.         /// A threaded version of the copy method to avoid crash with MTA
  263.         /// </summary>
  264.         private void ClipboardCopyThread()
  265.         {
  266.             Clipboard.SetDataObject( ImageRender(), true );
  267.         }
  268.  
  269.         //
  270.         /// <summary>
  271.         /// Setup for creation of a new image, applying appropriate anti-alias properties and
  272.         /// returning the resultant image file
  273.         /// </summary>
  274.         /// <returns></returns>
  275.         private Image ImageRender()
  276.         {
  277.             return _masterPane.GetImage( _masterPane.IsAntiAlias );
  278.         }
  279.  
  280.         /// <summary>
  281.         /// Special handler that copies the current image to an Emf file on the clipboard.
  282.         /// </summary>
  283.         /// <remarks>This version is similar to the regular <see cref="Copy" /> method, except that
  284.         /// it will place an Emf image (vector) on the ClipBoard instead of the regular bitmap.</remarks>
  285.         /// <param name="isShowMessage">boolean value that determines whether or not a prompt will be
  286.         /// displayed.  true to show a message of "Image Copied to ClipBoard".</param>
  287.         public void CopyEmf(bool isShowMessage)
  288.         {
  289.             if (_masterPane != null)
  290.             {
  291.                 // Threaded copy mode to avoid crash with MTA
  292.                 // Contributed by Dave Moor
  293.                 Thread ct = new Thread(new ThreadStart(this.ClipboardCopyThreadEmf));
  294.                 //ct.ApartmentState = ApartmentState.STA;
  295.                 ct.SetApartmentState(ApartmentState.STA);
  296.                 ct.Start();
  297.                 ct.Join();
  298.  
  299.                 if (isShowMessage)
  300.                 {
  301.                     string str = _resourceManager.GetString("copied_to_clip");
  302.                     MessageBox.Show(str);
  303.                 }
  304.             }
  305.         }
  306.  
  307.         /// <summary>
  308.         /// A threaded version of the copy method to avoid crash with MTA
  309.         /// </summary>
  310.         private void ClipboardCopyThreadEmf()
  311.         {
  312.             using (Graphics g = this.CreateGraphics())
  313.             {
  314.                 IntPtr hdc = g.GetHdc();
  315.                 Metafile metaFile = new Metafile(hdc, EmfType.EmfPlusOnly);
  316.                 g.ReleaseHdc(hdc);
  317.  
  318.                 using (Graphics gMeta = Graphics.FromImage(metaFile))
  319.                 {
  320.                     this._masterPane.Draw( gMeta );
  321.                 }
  322.  
  323.                 //IntPtr hMeta = metaFile.GetHenhmetafile();
  324.                 ClipboardMetafileHelper.PutEnhMetafileOnClipboard( this.Handle, metaFile );
  325.                 //System.Windows.Forms.Clipboard.SetDataObject(hMeta, true);
  326.  
  327.                 //g.Dispose();
  328.             }
  329.         }
  330.  
  331.         /// <summary>
  332.         /// Handler for the "Save Image As" context menu item.  Copies the current image to the selected
  333.         /// file.
  334.         /// </summary>
  335.         /// <param name="sender"></param>
  336.         /// <param name="e"></param>
  337.         protected void MenuClick_SaveAs( System.Object sender, System.EventArgs e )
  338.         {
  339.             SaveAs();
  340.         }
  341.  
  342.         /// <summary>
  343.         /// Handler for the "Save Image As" context menu item.  Copies the current image to the selected
  344.         /// file in either the Emf (vector), or a variety of Bitmap formats.
  345.         /// </summary>
  346.         /// <remarks>
  347.         /// Note that <see cref="SaveAsBitmap" /> and <see cref="SaveAsEmf" /> methods are provided
  348.         /// which allow for Bitmap-only or Emf-only handling of the "Save As" context menu item.
  349.         /// </remarks>
  350.         public void SaveAs()
  351.         {
  352.             SaveAs( null );
  353.         }
  354.  
  355.         /// <summary>
  356.         /// Copies the current image to the selected file in 
  357.         /// Emf (vector), or a variety of Bitmap formats.
  358.         /// </summary>
  359.         /// <param name="DefaultFileName">
  360.         /// Accepts a default file name for the file dialog (if "" or null, default is not used)
  361.         /// </param>
  362.         /// <returns>
  363.         /// The file name saved, or "" if cancelled.
  364.         /// </returns>
  365.         /// <remarks>
  366.         /// Note that <see cref="SaveAsBitmap" /> and <see cref="SaveAsEmf" /> methods are provided
  367.         /// which allow for Bitmap-only or Emf-only handling of the "Save As" context menu item.
  368.         /// </remarks>
  369.         public String SaveAs( String DefaultFileName )
  370.         {
  371.             if ( _masterPane != null )
  372.             {
  373.                 _saveFileDialog.Filter =
  374.                     "Emf Format (*.emf)|*.emf|" +
  375.                     "PNG Format (*.png)|*.png|" +
  376.                     "Gif Format (*.gif)|*.gif|" +
  377.                     "Jpeg Format (*.jpg)|*.jpg|" +
  378.                     "Tiff Format (*.tif)|*.tif|" +
  379.                     "Bmp Format (*.bmp)|*.bmp";
  380.  
  381.                 if ( DefaultFileName != null && DefaultFileName.Length > 0 )
  382.                 {
  383.                     String ext = System.IO.Path.GetExtension( DefaultFileName ).ToLower();
  384.                     switch (ext)
  385.                     {
  386.                         case ".emf": _saveFileDialog.FilterIndex = 1; break;
  387.                         case ".png": _saveFileDialog.FilterIndex = 2; break;
  388.                         case ".gif": _saveFileDialog.FilterIndex = 3; break;
  389.                         case ".jpeg":
  390.                         case ".jpg": _saveFileDialog.FilterIndex = 4; break;
  391.                         case ".tiff":
  392.                         case ".tif": _saveFileDialog.FilterIndex = 5; break;
  393.                         case ".bmp": _saveFileDialog.FilterIndex = 6; break;
  394.                     }
  395.                     //If we were passed a file name, not just an extension, use it
  396.                     if ( DefaultFileName.Length > ext.Length )
  397.                     {
  398.                         _saveFileDialog.FileName = DefaultFileName;
  399.                     }
  400.                 }
  401.  
  402.                 if ( _saveFileDialog.ShowDialog() == DialogResult.OK )
  403.                 {
  404.                     Stream myStream = _saveFileDialog.OpenFile();
  405.                     if ( myStream != null )
  406.                     {
  407.                         if ( _saveFileDialog.FilterIndex == 1 )
  408.                         {
  409.                             myStream.Close();
  410.                             SaveEmfFile( _saveFileDialog.FileName );
  411.                         }
  412.                         else
  413.                         {
  414.                             ImageFormat format = ImageFormat.Png;
  415.                             switch (_saveFileDialog.FilterIndex)
  416.                             {
  417.                                 case 2: format = ImageFormat.Png; break;
  418.                                 case 3: format = ImageFormat.Gif; break;
  419.                                 case 4: format = ImageFormat.Jpeg; break;
  420.                                 case 5: format = ImageFormat.Tiff; break;
  421.                                 case 6: format = ImageFormat.Bmp; break;
  422.                             }
  423.  
  424.                             ImageRender().Save( myStream, format );
  425.                             //_masterPane.GetImage().Save( myStream, format );
  426.                             myStream.Close();
  427.                         }
  428.                         return _saveFileDialog.FileName;
  429.                     }
  430.                 }
  431.             }
  432.             return "";
  433.         }
  434.  
  435.         /// <summary>
  436.         /// Handler for the "Save Image As" context menu item.  Copies the current image to the selected
  437.         /// Bitmap file.
  438.         /// </summary>
  439.         /// <remarks>
  440.         /// Note that this handler saves as a bitmap only.  The default handler is
  441.         /// <see cref="SaveAs()" />, which allows for Bitmap or EMF formats
  442.         /// </remarks>
  443.         public void SaveAsBitmap()
  444.         {
  445.             if ( _masterPane != null )
  446.             {
  447.                 _saveFileDialog.Filter =
  448.                     "PNG Format (*.png)|*.png|" +
  449.                     "Gif Format (*.gif)|*.gif|" +
  450.                     "Jpeg Format (*.jpg)|*.jpg|" +
  451.                     "Tiff Format (*.tif)|*.tif|" +
  452.                     "Bmp Format (*.bmp)|*.bmp";
  453.  
  454.                 if ( _saveFileDialog.ShowDialog() == DialogResult.OK )
  455.                 {
  456.                     ImageFormat format = ImageFormat.Png;
  457.                     if ( _saveFileDialog.FilterIndex == 2 )
  458.                         format = ImageFormat.Gif;
  459.                     else if ( _saveFileDialog.FilterIndex == 3 )
  460.                         format = ImageFormat.Jpeg;
  461.                     else if ( _saveFileDialog.FilterIndex == 4 )
  462.                         format = ImageFormat.Tiff;
  463.                     else if ( _saveFileDialog.FilterIndex == 5 )
  464.                         format = ImageFormat.Bmp;
  465.  
  466.                     Stream myStream = _saveFileDialog.OpenFile();
  467.                     if ( myStream != null )
  468.                     {
  469.                         //_masterPane.GetImage().Save( myStream, format );
  470.                         ImageRender().Save( myStream, format );
  471.                         myStream.Close();
  472.                     }
  473.                 }
  474.             }
  475.         }
  476.  
  477.         /// <summary>
  478.         /// Handler for the "Save Image As" context menu item.  Copies the current image to the selected
  479.         /// Emf format file.
  480.         /// </summary>
  481.         /// <remarks>
  482.         /// Note that this handler saves as an Emf format only.  The default handler is
  483.         /// <see cref="SaveAs()" />, which allows for Bitmap or EMF formats.
  484.         /// </remarks>
  485.         public void SaveAsEmf()
  486.         {
  487.             if ( _masterPane != null )
  488.             {
  489.                 _saveFileDialog.Filter = "Emf Format (*.emf)|*.emf";
  490.  
  491.                 if ( _saveFileDialog.ShowDialog() == DialogResult.OK )
  492.                 {
  493.                     Stream myStream = _saveFileDialog.OpenFile();
  494.                     if ( myStream != null )
  495.                     {
  496.                         myStream.Close();
  497.                         //_masterPane.GetMetafile().Save( _saveFileDialog.FileName );
  498.                         SaveEmfFile(_saveFileDialog.FileName);
  499.                     }
  500.                 }
  501.             }
  502.         }
  503.  
  504.         /// <summary>
  505.         /// Save the current Graph to the specified filename in EMF (vector) format.
  506.         /// See <see cref="SaveAsEmf()" /> for public access.
  507.         /// </summary>
  508.         /// <remarks>
  509.         /// Note that this handler saves as an Emf format only.  The default handler is
  510.         /// <see cref="SaveAs()" />, which allows for Bitmap or EMF formats.
  511.         /// </remarks>
  512.         internal void SaveEmfFile( string fileName )
  513.         {
  514.             using (Graphics g = this.CreateGraphics())
  515.             {
  516.                 IntPtr hdc = g.GetHdc();
  517.                 Metafile metaFile = new Metafile(hdc, EmfType.EmfPlusOnly);
  518.                 using (Graphics gMeta = Graphics.FromImage(metaFile))
  519.                 {
  520.                     //PaneBase.SetAntiAliasMode( gMeta, IsAntiAlias );
  521.                     //gMeta.CompositingMode = CompositingMode.SourceCopy;
  522.                     //gMeta.CompositingQuality = CompositingQuality.HighQuality;
  523.                     //gMeta.InterpolationMode = InterpolationMode.HighQualityBicubic;
  524.                     //gMeta.SmoothingMode = SmoothingMode.AntiAlias;
  525.                     //gMeta.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  526.                     this._masterPane.Draw(gMeta);
  527.                     //gMeta.Dispose();
  528.                 }
  529.  
  530.                 ClipboardMetafileHelper.SaveEnhMetafileToFile(metaFile, fileName );
  531.  
  532.                 g.ReleaseHdc(hdc);
  533.                 //g.Dispose();
  534.             }
  535.  
  536.         }
  537.  
  538.         internal class ClipboardMetafileHelper
  539.         {
  540.             [DllImport("user32.dll")]
  541.             static extern bool OpenClipboard(IntPtr hWndNewOwner);
  542.             [DllImport("user32.dll")]
  543.             static extern bool EmptyClipboard();
  544.             [DllImport("user32.dll")]
  545.             static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem);
  546.             [DllImport("user32.dll")]
  547.             static extern bool CloseClipboard();
  548.             [DllImport("gdi32.dll")]
  549.             static extern IntPtr CopyEnhMetaFile(IntPtr hemfSrc, System.Text.StringBuilder hNULL);
  550.             [DllImport("gdi32.dll")]
  551.             static extern bool DeleteEnhMetaFile(IntPtr hemf);
  552.  
  553.             static internal bool SaveEnhMetafileToFile( Metafile mf, string fileName )
  554.             {
  555.                 bool bResult = false;
  556.                 IntPtr hEMF;
  557.                 hEMF = mf.GetHenhmetafile(); // invalidates mf
  558.                 if (!hEMF.Equals(new IntPtr(0)))
  559.                 {
  560.                     StringBuilder tempName = new StringBuilder(fileName);
  561.                     CopyEnhMetaFile(hEMF, tempName);
  562.                     DeleteEnhMetaFile(hEMF);
  563.                 }
  564.                 return bResult;
  565.             }
  566.  
  567.             static internal bool SaveEnhMetafileToFile(Metafile mf)
  568.             {
  569.                 bool bResult = false;
  570.                 IntPtr hEMF;
  571.                 hEMF = mf.GetHenhmetafile(); // invalidates mf
  572.                 if (!hEMF.Equals(new IntPtr(0)))
  573.                 {
  574.                     SaveFileDialog sfd = new SaveFileDialog();
  575.                     sfd.Filter = "Extended Metafile (*.emf)|*.emf";
  576.                     sfd.DefaultExt = ".emf";
  577.                     if (sfd.ShowDialog() == DialogResult.OK)
  578.                     {
  579.                         StringBuilder temp = new StringBuilder(sfd.FileName);
  580.                         CopyEnhMetaFile(hEMF, temp);
  581.                     }
  582.                     DeleteEnhMetaFile(hEMF);
  583.                 }
  584.                 return bResult;
  585.             }
  586.  
  587.             // Metafile mf is set to a state that is not valid inside this function.
  588.             static internal bool PutEnhMetafileOnClipboard(IntPtr hWnd, Metafile mf)
  589.             {
  590.                 bool bResult = false;
  591.                 IntPtr hEMF, hEMF2;
  592.                 hEMF = mf.GetHenhmetafile(); // invalidates mf
  593.                 if (!hEMF.Equals(new IntPtr(0)))
  594.                 {
  595.                     hEMF2 = CopyEnhMetaFile(hEMF, null);
  596.                     if (!hEMF2.Equals(new IntPtr(0)))
  597.                     {
  598.                         if (OpenClipboard(hWnd))
  599.                         {
  600.                             if (EmptyClipboard())
  601.                             {
  602.                                 IntPtr hRes = SetClipboardData(14 /*CF_ENHMETAFILE*/, hEMF2);
  603.                                 bResult = hRes.Equals(hEMF2);
  604.                                 CloseClipboard();
  605.                             }
  606.                         }
  607.                     }
  608.                     DeleteEnhMetaFile(hEMF);
  609.                 }
  610.                 return bResult;
  611.             }
  612.         }
  613.  
  614.         /// <summary>
  615.         /// Handler for the "Show Values" context menu item.  Toggles the <see cref="IsShowPointValues"/>
  616.         /// property, which activates the point value tooltips.
  617.         /// </summary>
  618.         /// <param name="sender"></param>
  619.         /// <param name="e"></param>
  620.         protected void MenuClick_ShowValues( object sender, System.EventArgs e )
  621.         {
  622.             ToolStripMenuItem item = sender as ToolStripMenuItem;
  623.             if ( item != null )
  624.                 this.IsShowPointValues = !item.Checked;
  625.         }
  626.  
  627.         /// <summary>
  628.         /// Handler for the "Set Scale to Default" context menu item.  Sets the scale ranging to
  629.         /// full auto mode for all axes.
  630.         /// </summary>
  631.         /// <remarks>
  632.         /// This method differs from the <see cref="ZoomOutAll" /> method in that it sets the scales
  633.         /// to full auto mode.  The <see cref="ZoomOutAll" /> method sets the scales to their initial
  634.         /// setting prior to any user actions (which may or may not be full auto mode).
  635.         /// </remarks>
  636.         /// <param name="sender"></param>
  637.         /// <param name="e"></param>
  638.         protected void MenuClick_RestoreScale( object sender, EventArgs e )
  639.         {
  640.             if ( _masterPane != null )
  641.             {
  642.                 GraphPane pane = _masterPane.FindPane( _menuClickPt );
  643.                 RestoreScale( pane );
  644.             }
  645.         }
  646.  
  647.         /// <summary>
  648.         /// Handler for the "Set Scale to Default" context menu item.  Sets the scale ranging to
  649.         /// full auto mode for all axes.
  650.         /// </summary>
  651.         /// <remarks>
  652.         /// This method differs from the <see cref="ZoomOutAll" /> method in that it sets the scales
  653.         /// to full auto mode.  The <see cref="ZoomOutAll" /> method sets the scales to their initial
  654.         /// setting prior to any user actions (which may or may not be full auto mode).
  655.         /// </remarks>
  656.         /// <param name="primaryPane">The <see cref="GraphPane" /> object which is to have the
  657.         /// scale restored</param>
  658.         public void RestoreScale( GraphPane primaryPane )
  659.         {
  660.             if ( primaryPane != null )
  661.             {
  662.                 //Go ahead and save the old zoomstates, which provides an "undo"-like capability
  663.                 //ZoomState oldState = primaryPane.ZoomStack.Push( primaryPane, ZoomState.StateType.Zoom );
  664.                 ZoomState oldState = new ZoomState( primaryPane, ZoomState.StateType.Zoom );
  665.  
  666.                 using ( Graphics g = this.CreateGraphics() )
  667.                 {
  668.                     if ( _isSynchronizeXAxes || _isSynchronizeYAxes )
  669.                     {
  670.                         foreach ( GraphPane pane in _masterPane._paneList )
  671.                         {
  672.                             pane.ZoomStack.Push( pane, ZoomState.StateType.Zoom );
  673.                             ResetAutoScale( pane, g );
  674.                         }
  675.                     }
  676.                     else
  677.                     {
  678.                         primaryPane.ZoomStack.Push( primaryPane, ZoomState.StateType.Zoom );
  679.                         ResetAutoScale( primaryPane, g );
  680.                     }
  681.  
  682.                     // Provide Callback to notify the user of zoom events
  683.                     if ( this.ZoomEvent != null )
  684.                         this.ZoomEvent( this, oldState, new ZoomState( primaryPane, ZoomState.StateType.Zoom ) );
  685.  
  686.                     //g.Dispose();
  687.                 }
  688.                 Refresh();
  689.             }
  690.         }
  691.  
  692.         private void ResetAutoScale( GraphPane pane, Graphics g )
  693.         {
  694.             pane.XAxis.ResetAutoScale( pane, g );
  695.             pane.X2Axis.ResetAutoScale( pane, g );
  696.             foreach ( YAxis axis in pane.YAxisList )
  697.                 axis.ResetAutoScale( pane, g );
  698.             foreach ( Y2Axis axis in pane.Y2AxisList )
  699.                 axis.ResetAutoScale( pane, g );
  700.         }
  701.  
  702.         /*
  703.                 public void RestoreScale( GraphPane primaryPane )
  704.                 {
  705.                     if ( primaryPane != null )
  706.                     {
  707.                         Graphics g = this.CreateGraphics();
  708.                         ZoomState oldState = new ZoomState( primaryPane, ZoomState.StateType.Zoom );
  709.                         //ZoomState newState = null;
  710.  
  711.                         if ( _isSynchronizeXAxes || _isSynchronizeYAxes )
  712.                         {
  713.                             foreach ( GraphPane pane in _masterPane._paneList )
  714.                             {
  715.                                 if ( pane == primaryPane )
  716.                                 {
  717.                                     pane.XAxis.ResetAutoScale( pane, g );
  718.                                     foreach ( YAxis axis in pane.YAxisList )
  719.                                         axis.ResetAutoScale( pane, g );
  720.                                     foreach ( Y2Axis axis in pane.Y2AxisList )
  721.                                         axis.ResetAutoScale( pane, g );
  722.                                 }
  723.                             }
  724.                         }
  725.                         else
  726.                         {
  727.                             primaryPane.XAxis.ResetAutoScale( primaryPane, g );
  728.                             foreach ( YAxis axis in primaryPane.YAxisList )
  729.                                 axis.ResetAutoScale( primaryPane, g );
  730.                             foreach ( Y2Axis axis in primaryPane.Y2AxisList )
  731.                                 axis.ResetAutoScale( primaryPane, g );
  732.                         }
  733.  
  734.                         // Provide Callback to notify the user of zoom events
  735.                         if ( this.ZoomEvent != null )
  736.                             this.ZoomEvent( this, oldState, new ZoomState( primaryPane, ZoomState.StateType.Zoom ) );
  737.  
  738.                         g.Dispose();
  739.                         Refresh();
  740.                     }
  741.                 }
  742.         */
  743.         /*
  744.                 public void ZoomOutAll( GraphPane primaryPane )
  745.                 {
  746.                     if ( primaryPane != null && !primaryPane.ZoomStack.IsEmpty )
  747.                     {
  748.                         ZoomState.StateType type = primaryPane.ZoomStack.Top.Type;
  749.  
  750.                         ZoomState oldState = new ZoomState( primaryPane, type );
  751.                         //ZoomState newState = pane.ZoomStack.PopAll( pane );
  752.                         ZoomState newState = null;
  753.                         if ( _isSynchronizeXAxes || _isSynchronizeYAxes )
  754.                         {
  755.                             foreach ( GraphPane pane in _masterPane._paneList )
  756.                             {
  757.                                 ZoomState state = pane.ZoomStack.PopAll( pane );
  758.                                 if ( pane == primaryPane )
  759.                                     newState = state;
  760.                             }
  761.                         }
  762.                         else
  763.                             newState = primaryPane.ZoomStack.PopAll( primaryPane );
  764.  
  765.                         // Provide Callback to notify the user of zoom events
  766.                         if ( this.ZoomEvent != null )
  767.                             this.ZoomEvent( this, oldState, newState );
  768.  
  769.                         Refresh();
  770.                     }
  771.                 }
  772.  
  773.         */
  774.  
  775.         /// <summary>
  776.         /// Handler for the "UnZoom/UnPan" context menu item.  Restores the scale ranges to the values
  777.         /// before the last zoom or pan operation.
  778.         /// </summary>
  779.         /// <param name="sender"></param>
  780.         /// <param name="e"></param>
  781.         protected void MenuClick_ZoomOut( System.Object sender, System.EventArgs e )
  782.         {
  783.             if ( _masterPane != null )
  784.             {
  785.                 GraphPane pane = _masterPane.FindPane( _menuClickPt );
  786.                 ZoomOut( pane );
  787.             }
  788.         }
  789.  
  790.         /// <summary>
  791.         /// Handler for the "UnZoom/UnPan" context menu item.  Restores the scale ranges to the values
  792.         /// before the last zoom, pan, or scroll operation.
  793.         /// </summary>
  794.         /// <remarks>
  795.         /// Triggers a <see cref="ZoomEvent" /> for any type of undo (including pan, scroll, zoom, and
  796.         /// wheelzoom).  This method will affect all the
  797.         /// <see cref="GraphPane" /> objects in the <see cref="MasterPane" /> if
  798.         /// <see cref="IsSynchronizeXAxes" /> or <see cref="IsSynchronizeYAxes" /> is true.
  799.         /// </remarks>
  800.         /// <param name="primaryPane">The primary <see cref="GraphPane" /> object which is to be
  801.         /// zoomed out</param>
  802.         public void ZoomOut( GraphPane primaryPane )
  803.         {
  804.             if ( primaryPane != null && !primaryPane.ZoomStack.IsEmpty )
  805.             {
  806.                 ZoomState.StateType type = primaryPane.ZoomStack.Top.Type;
  807.  
  808.                 ZoomState oldState = new ZoomState( primaryPane, type );
  809.                 ZoomState newState = null;
  810.                 if ( _isSynchronizeXAxes || _isSynchronizeYAxes )
  811.                 {
  812.                     foreach ( GraphPane pane in _masterPane._paneList )
  813.                     {
  814.                         ZoomState state = pane.ZoomStack.Pop( pane );
  815.                         if ( pane == primaryPane )
  816.                             newState = state;
  817.                     }
  818.                 }
  819.                 else
  820.                     newState = primaryPane.ZoomStack.Pop( primaryPane );
  821.  
  822.                 // Provide Callback to notify the user of zoom events
  823.                 if ( this.ZoomEvent != null )
  824.                     this.ZoomEvent( this, oldState, newState );
  825.  
  826.                 Refresh();
  827.             }
  828.         }
  829.  
  830.         /// <summary>
  831.         /// Handler for the "Undo All Zoom/Pan" context menu item.  Restores the scale ranges to the values
  832.         /// before all zoom and pan operations
  833.         /// </summary>
  834.         /// <remarks>
  835.         /// This method differs from the <see cref="RestoreScale" /> method in that it sets the scales
  836.         /// to their initial setting prior to any user actions.  The <see cref="RestoreScale" /> method
  837.         /// sets the scales to full auto mode (regardless of what the initial setting may have been).
  838.         /// </remarks>
  839.         /// <param name="sender"></param>
  840.         /// <param name="e"></param>
  841.         protected void MenuClick_ZoomOutAll( System.Object sender, System.EventArgs e )
  842.         {
  843.             if ( _masterPane != null )
  844.             {
  845.                 GraphPane pane = _masterPane.FindPane( _menuClickPt );
  846.                 ZoomOutAll( pane );
  847.             }
  848.         }
  849.  
  850.         /// <summary>
  851.         /// Handler for the "Undo All Zoom/Pan" context menu item.  Restores the scale ranges to the values
  852.         /// before all zoom and pan operations
  853.         /// </summary>
  854.         /// <remarks>
  855.         /// This method differs from the <see cref="RestoreScale" /> method in that it sets the scales
  856.         /// to their initial setting prior to any user actions.  The <see cref="RestoreScale" /> method
  857.         /// sets the scales to full auto mode (regardless of what the initial setting may have been).
  858.         /// </remarks>
  859.         /// <param name="primaryPane">The <see cref="GraphPane" /> object which is to be zoomed out</param>
  860.         public void ZoomOutAll( GraphPane primaryPane )
  861.         {
  862.             if ( primaryPane != null && !primaryPane.ZoomStack.IsEmpty )
  863.             {
  864.                 ZoomState.StateType type = primaryPane.ZoomStack.Top.Type;
  865.  
  866.                 ZoomState oldState = new ZoomState( primaryPane, type );
  867.                 //ZoomState newState = pane.ZoomStack.PopAll( pane );
  868.                 ZoomState newState = null;
  869.                 if ( _isSynchronizeXAxes || _isSynchronizeYAxes )
  870.                 {
  871.                     foreach ( GraphPane pane in _masterPane._paneList )
  872.                     {
  873.                         ZoomState state = pane.ZoomStack.PopAll( pane );
  874.                         if ( pane == primaryPane )
  875.                             newState = state;
  876.                     }
  877.                 }
  878.                 else
  879.                     newState = primaryPane.ZoomStack.PopAll( primaryPane );
  880.  
  881.                 // Provide Callback to notify the user of zoom events
  882.                 if ( this.ZoomEvent != null )
  883.                     this.ZoomEvent( this, oldState, newState );
  884.  
  885.                 Refresh();
  886.             }
  887.         }
  888.  
  889.     #endregion
  890.  
  891.     }
  892. }

转载于:https://www.cnblogs.com/xihong2014/p/4200444.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ZedGraph饼图、条形图和饼图Demo源码 ZedGraphV515是C#编写的.NET类库,提供了用户控件和web控件。它可以创建2D的线性图、条形图和饼图。 它功能完整且有详细的功能自定义。 基于LGPL协议开源,.NET 2.0 C#源代码)它的思路清淅,所以非常容易就上手. 几个注意点: 图片的保存路径设置:RenderedImagePath属性中设置,程序对该文件夹应该是有写和修改权限的 图片的输出格式:OutputFormat属性中设置,Png的推荐,比较清晰。 Chart ChartBorder 图表区域的边框设置 ChartFill 图表区域的背景填充 Legend 图表的注释标签显示设置项目,一组数据对应一种颜色的注释 IsHStack 当有多个显示项的时候设置Y轴数据是叠加的还是分开的 Xaxis 图表区域的X轴相关信息设置 AxisColor 坐标轴颜色 Cross 坐标的原点,可以设置坐标的偏移程度 CrossAuto 原点自动设置:True的话Cross的设置就无效了。 FontSpec X轴标题字体相关信息 Angle X轴标题字体显示时候的角度,0为水平 90为垂直 Fill X轴标题字体填充信息 ColorOpacity 透明度 IsScaled 设置X轴标题字体显示大小是否根据图的比例放大缩小 RangeMax 填充时候的最大倾斜度(有过渡色,没试过) RangeMin 填充时候的最小倾斜度(有过渡色,没试过) StringAlignment X轴标题字体排列(不清楚,没试过) IsOmitMag 是否显示指数幂(10次方,没试过,似乎与IsUseTenPower有关系) IsPreventLabelOverlap 坐标值显示是否允许重叠,如果False的话,控件会根据坐标值长度自动消除部分坐标值的显示状态 IsShowTitle X轴标题是否显示 IsTicsBetweenLabels 两个坐标值之间是否自动显示分隔标志 IsUseTenPower 是否使用10次幂指数 IsVisible 是否显示X轴
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值