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

http://code1.okbase.net/codefile/ZedGraphControl.ContextMenu.cs_201211225626_97.htm

  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. }

更多源码 | 好库简介 | 网站地图 | 帮助中心 | 版权说明 Copyright© 2009-2012 OKBASE.NET All Rights Reserved 好库网 版权所有

站长统计

时间: 2024-10-18 17:12:43

ZedGraph 柱状图、饼图、折线图演示源码的相关文章

如何绘制酷炫折线图? 视频教程 + 源码

利用LightningChart 绘制折线图教程: https://pan.baidu.com/s/1slslor7 源代码: https://www.arction.com/wp-content/uploads/2017/12/WpfAppLinePlotDemo.zip 查看更多详情: http://arction.cn/ LightningChart是Visual Studio插件,為Windows Forms及WPF最快的2D/3D數據可視化SDK.由原廠Arction製作的教學影片,提

Echart饼图、柱状图、折线图(pie、bar、line)添加点击事件

var myChart= echarts.init(document.getElementById('myChart')); myChart.on('click', function (param) { alert('点击了我!'); }); Echart事件参数可以去config.js查找 Echart饼图.柱状图.折线图(pie.bar.line)添加点击事件

数据可视化分析(柱状图、折线图、热力图)

一.项目简介 1.1    项目博客地址 https://rpc.cnblogs.com/metaweblog/yyh28 1.2    项目完成的功能与特色 分析文件‘集美大学各省录取分数.xlsx’,完成以下功能: 1)集美大学2015-2018年间不同省份在本一批的平均分数,柱状图展示排名前10的省份, 2)分析福建省这3年各批次成绩情况,使用折线图展示结果,并预测2019年录取成绩 3)分析其他省份数据.用热力图,地图方式绘制所有省份数据情况. 1.3 项目采用的技术栈 Numpy:矩阵

如何绘制双轴柱状图和折线图?

如何绘制双轴柱状图和折线图? 答:第1步,先将数据作成如下表格. ××市2010--2014年农业灌溉用水有效利用系数 年份 灌溉亩数(万亩) 毛灌溉用水总量(万米3) 净灌溉用水总量(万米3) 灌溉水有效利用系数 考核标准 2010年 1.57 1440 691 0.48 0.55 2011年 1.57 1142 628 0.55 0.55 2012年 1.57 966 628 0.65 0.55 2013年 1.57 966 628 0.65 0.55 2014年 1.57 966 628

Python 中 plt 画柱状图和折线图

1. 背景 Python在一些数据可视化的过程中需要使用 plt 函数画柱状图和折线图. 2. 导入 import matplotlib.pyplot as plt 3. 柱状图 array= np.array(array) plt.hist(array, bins=50,facecolor="red", edgecolor="red" ,linewidth=5,alpha=0.7) plt.xlabel("") plt.ylabel("

如何使用SAP UI5 web Component的React框架的柱状图和折线图

导入柱状图和折线图: import { BarChart, LineChart } from "@ui5/webcomponents-react-charts": 在自定义的React Component里,为图标创建数据集和数据标签对应的JavaScript数组: 最后在React 自定义组件里,直接为LineChart和BarChart这两个标签页维护刚才创建好的JavaScript数组: 最后的效果,折线图: 柱状图: 不出意外,还是通过canvas实现的: 要获取更多Jerry

JavaScript数据可视化编程学习(一)Flotr2,包含简单的,柱状图,折线图,饼图,散点图

一.基础柱状图 二.基础的折线图 三.基础的饼图 四.基础的散点图 一.基础柱状图 如果你还没有想好你的数据用什么类型的图表来展示你的数据,你应该首先考虑是否可以做成柱状图.柱状图可以表示数据的变化过程或者表示多个数据之间的差异. 1.引入javascrippt 使用flotr2这个JavaScript库来创建图表.使用flotr2之前,不需要引入其他的JavaScript库(比如jquery),但是flotr2必须依赖HTML5的canvas元素的支持.canvas支持的主流浏览器有:chro

echartsjs 饼图、柱状图、折线图实例

  <!doctype html>   <html lang="en">   <head>   <meta charset="utf-8" />   <title>图表选项卡</title>   <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.

使用C#画图(饼图折线图)

public PlaceHolder PlaceHolder1; //显示图像的控件 各个图像的类别名称如下: PictureType    图形种类    5    chChartTypeBarClustered    簇状条形图    0    NULL PictureType    图形种类    7    chChartTypeBarClustered3D    三维簇状条形图    0    NULL PictureType    图形种类    6    chChartTypeBar