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 好库网 版权所有

站长统计

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

  1. HighCharts之2D柱状图、折线图和饼图的组合图

    HighCharts之2D柱状图.折线图和饼图的组合图 1.实例源码 ColumnLinePie.html: <!DOCTYPE html> <html> <head&g ...

  2. 数据可视化(Echart) :柱状图、折线图、饼图等六种基本图表的特点及适用场合

    数据可视化(Echart) 柱状图.折线图.饼图等六种基本图表的特点及适用场合 参考网址 效果图 源码 <!DOCTYPE html> <html> <head> ...

  3. JFreeChart 图表生成实例(饼图、柱状图、折线图、时序图)

    import java.awt.BasicStroke; import java.awt.Color; import java.io.FileOutputStream; import java.io. ...

  4. 【转】使用DevExpress的WebChartControl控件绘制图表(柱状图、折线图、饼图)

    第一次写博,没什么经验,主要是把最近自己对Dev的一些研究贴出来大家共同探讨,有不足之处望大家帮忙斧正. WebChartControl是DevExpress控件群下的一个Web图表控件,它使用非常的 ...

  5. HighCharts之2D柱状图、折线图的组合多轴图

    HighCharts之2D柱状图.折线图的组合多轴图 1.实例源码 SomeAxis.html: <!DOCTYPE html> <html> <head> < ...

  6. HighCharts之2D柱状图、折线图的组合双轴图

    HighCharts之2D柱状图.折线图的组合双轴图 1.实例源码 DoubleAxis.html: <!DOCTYPE html> <html> <head> & ...

  7. 使用jfreechart生成柱状图、折线图、和饼状图

    JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计.下面我就详细介绍如 ...

  8. 项目源码--Android美图秀秀源码

    下载源码   技术要点:   1. 多种分类分享高清图片 2. 图片缓存技术 3. 图片缩图显示 4. 图片实时加载技术 5. 多点触控技术 6.  HTTP网络数据搜索技术 7.  精美UI图片显示 ...

  9. FusionCharts 2D柱状图和折线图的组合图调试错误

    在设计FusionCharts 2D柱状图和折线图的组合图的时候,我发现不管怎么重启服务器,组合图就是不出来.后来,我通过调试发现我犯了一个致命的错误,运用平常一贯的思维,认为3D图有这种类型,那么2 ...

随机推荐

  1. 10个CSS简写/优化技巧-摘自网友

    10个CSS简写/优化技巧23来源/作者:未知 类别:前端开发 字体大小:大|中|小 背景颜色:蓝|白|灰 ? ? CSS简写就是指将多行的CSS属性简写成一行,又称为CSS代码优化或CSS缩写.CS ...

  2. linux command curl and sha256sum implement download verification package

    example: download_etcher_cli(){ local url="https://github.com/resin-io/etcher/releases/download ...

  3. 自定义div 拖动。键盘上下左右键移动,ctrl+Q控制是否可以移动,ctrl+回车,返回初始状态

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. CentOS6编译安装Python3

    CentOS6默认Python版本是2, 但我使用的是Python3,因此需要自己安装 但记住,不要删除自带的Python2,否则很多东西会报错,比如yum之类的.(别问我为什么知道...) 话不多说 ...

  5. SpingBoot三——基础架构

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:https://www.cnblogs.com/by-dream/p/10492073.html 继续上一节,为了更好的开发,现将 ...

  6. DevExpress WPF入门指南:跟随 Items Source 向导完成数据绑定

    Items Source Wizard Items Source Configuration Wizard允许在设计时执行数据绑定.跟随这个向导可以自动生成XAML数据绑定代码. 下面就来展示下如何使 ...

  7. BitDefender(比特梵德)特惠活动 免费获取9个月激活码

    Bitdefender为了庆祝自己获得2014年最佳杀毒软件,送出9个月的Internet security免费激活码.

  8. L237

    The British parliament on Tuesday rejected overwhelmingly the Brexit deal, further complicating the ...

  9. ASIHTTPRequest缓存策略download cache

    本文为大家介绍了iOS开发ASIHTTPRequest使用download cache的内容,其中包括cache策略,存储策略,其他cache相关的特性,编写自己的cache等等内容. 从1.8版本开 ...

  10. input 文件上传

    <button class="blueButton fileinput-button" style="width:165px;" @click=" ...