C#代码理解和学习

时间:2011-02-23 17:03:43

标签: c# .net c#-4.0

我正在通过实际潜入它来学习C#。我刚刚停了下来。我在下面有这个代码有一个菜单项,Acquire。当我选择它时,它会运行Acquire。但是我希望它在加载/启动应用程序后立即运行。

我在哪里做出必要的改变?

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;

using WIALib; // namespace of imported WIA Scripting COM component

namespace Wia
{
    /// <summary> MainForm for this WIA sample </summary>
    public class MainForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.MainMenu mainMenu;
        private System.Windows.Forms.MenuItem menuTopFile;
        private System.Windows.Forms.MenuItem menuFileAcquire;
        private System.Windows.Forms.MenuItem menuFileSaveAs;
        private System.Windows.Forms.MenuItem menuFileSep1;
        private System.Windows.Forms.MenuItem menuFileExit;
        private System.Windows.Forms.PictureBox pictureBox;
        private IContainer components;

        public MainForm()
        {
            //
            // Required for Windows Form Designer support
            //

            InitializeComponent();

        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                DisposeImage();

                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
            this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
            this.menuTopFile = new System.Windows.Forms.MenuItem();
            this.menuFileAcquire = new System.Windows.Forms.MenuItem();
            this.menuFileSaveAs = new System.Windows.Forms.MenuItem();
            this.menuFileSep1 = new System.Windows.Forms.MenuItem();
            this.menuFileExit = new System.Windows.Forms.MenuItem();
            this.pictureBox = new System.Windows.Forms.PictureBox();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
            this.SuspendLayout();
            //
            // mainMenu
            //
            this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuTopFile});
            //
            // menuTopFile
            //
            this.menuTopFile.Index = 0;
            this.menuTopFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuFileAcquire,
            this.menuFileSaveAs,
            this.menuFileSep1,
            this.menuFileExit});
            this.menuTopFile.Text = "&File";
            //
            // menuFileAcquire
            //
            this.menuFileAcquire.Index = 0;
            this.menuFileAcquire.Text = "Acquire...";
            this.menuFileAcquire.Click += new System.EventHandler(this.menuFileAcquire_Click);
            //
            // menuFileSaveAs
            //
            this.menuFileSaveAs.Enabled = false;
            this.menuFileSaveAs.Index = 1;
            this.menuFileSaveAs.Text = "Save &As...";
            this.menuFileSaveAs.Click += new System.EventHandler(this.menuFileSaveAs_Click);
            //
            // menuFileSep1
            //
            this.menuFileSep1.Index = 2;
            this.menuFileSep1.Text = "-";
            //
            // menuFileExit
            //
            this.menuFileExit.Index = 3;
            this.menuFileExit.Text = "E&xit";
            this.menuFileExit.Click += new System.EventHandler(this.menuFileExit_Click);
            //
            // pictureBox
            //
            this.pictureBox.Location = new System.Drawing.Point(8, 8);
            this.pictureBox.Name = "pictureBox";
            this.pictureBox.Size = new System.Drawing.Size(488, 357);
            this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
            this.pictureBox.TabIndex = 0;
            this.pictureBox.TabStop = false;
            //
            // MainForm
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.AutoScroll = true;
            this.BackColor = System.Drawing.SystemColors.Window;
            this.ClientSize = new System.Drawing.Size(520, 377);
            this.Controls.Add(this.pictureBox);
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.Menu = this.mainMenu;
            this.MinimumSize = new System.Drawing.Size(256, 256);
            this.Name = "MainForm";
            this.Text = "Scanning Device";
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }
        #endregion

        /// <summary> The main entry point for the application. </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new MainForm());
        }

        private void menuFileExit_Click( object sender, System.EventArgs e )
        {
            Close();
        }

        private void menuFileAcquire_Click( object sender, System.EventArgs e )
        {
            WiaClass        wiaManager    = null;        // WIA manager COM object
            CollectionClass    wiaDevs        = null;        // WIA devices collection COM object
            ItemClass        wiaRoot        = null;        // WIA root device COM object
            CollectionClass    wiaPics        = null;        // WIA collection COM object
            ItemClass        wiaItem        = null;        // WIA image COM object

            try {
                wiaManager = new WiaClass();        // create COM instance of WIA manager

                wiaDevs = wiaManager.Devices as CollectionClass;            // call Wia.Devices to get all devices
                if( (wiaDevs == null) || (wiaDevs.Count == 0) )
                {
                    MessageBox.Show( this, "No WIA devices found!", "WIA", MessageBoxButtons.OK, MessageBoxIcon.Stop );
                    Application.Exit();
                    return;
                }

                object selectUsingUI = System.Reflection.Missing.Value;            // = Nothing
                wiaRoot = (ItemClass) wiaManager.Create( ref selectUsingUI );    // let user select device
                if( wiaRoot == null )                                            // nothing to do
                    return;

                // this call shows the common WIA dialog to let the user select a picture:
                wiaPics = wiaRoot.GetItemsFromUI( WiaFlag.SingleImage, WiaIntent.ImageTypeColor ) as CollectionClass;
                if( wiaPics == null )
                    return;

                bool takeFirst = true;                        // this sample uses only one single picture
                foreach( object wiaObj in wiaPics )            // enumerate all the pictures the user selected
                {
                    if( takeFirst )
                    {
                        DisposeImage();                        // remove previous picture
                        wiaItem = (ItemClass) Marshal.CreateWrapperOfType( wiaObj, typeof(ItemClass) );
                        imageFileName = Path.GetTempFileName();                // create temporary file for image
                        Cursor.Current = Cursors.WaitCursor;                // could take some time
                        this.Refresh();
                        wiaItem.Transfer( imageFileName, false );            // transfer picture to our temporary file
                        pictureBox.Image = Image.FromFile( imageFileName );    // create Image instance from file
                        menuFileSaveAs.Enabled = true;                        // enable "Save as" menu entry
                        takeFirst = false;                                    // first and only one done.
                    }
                    Marshal.ReleaseComObject( wiaObj );                    // release enumerated COM object
                }
            }
            catch( Exception ee ) {
                MessageBox.Show( this, "Acquire from WIA Imaging failed\r\n" + ee.Message, "WIA", MessageBoxButtons.OK, MessageBoxIcon.Stop );
                Application.Exit();
            }
            finally {
                if( wiaItem != null )
                    Marshal.ReleaseComObject( wiaItem );        // release WIA image COM object
                if( wiaPics != null )
                    Marshal.ReleaseComObject( wiaPics );        // release WIA collection COM object
                if( wiaRoot != null )
                    Marshal.ReleaseComObject( wiaRoot );        // release WIA root device COM object
                if( wiaDevs != null )
                    Marshal.ReleaseComObject( wiaDevs );        // release WIA devices collection COM object
                if( wiaManager != null )
                    Marshal.ReleaseComObject( wiaManager );        // release WIA manager COM object
                Cursor.Current = Cursors.Default;                // restore cursor
            }
        }

            /// <summary> User selected menu entry to save image. </summary>
        private void menuFileSaveAs_Click( object sender, System.EventArgs e )
        {
            if( pictureBox.Image == null )                // no bitmap exists
                return;

            SaveFileDialog sd = new SaveFileDialog();
            sd.Title = "Save Image As...";
            sd.FileName = "temp.bmp";
            sd.Filter = "Bitmap file (*.bmp)|*.bmp";    // bmp bitmap file format
            if( sd.ShowDialog() != DialogResult.OK )
                return;

            pictureBox.Image.Save( sd.FileName );        // save to file
        }

        /// <summary> Remove image from screen, dispose object and delete the temporary file. </summary>
        private void DisposeImage()
        {
            menuFileSaveAs.Enabled = false;                // disable "Save As" menu entry
            Image oldImg = pictureBox.Image;
            pictureBox.Image = null;                    // empty picture box
            if( oldImg != null )
                oldImg.Dispose();                        // dispose old image (free memory, unlock file)

            if( imageFileName != null ) {                // try to delete the temporary image file
                try {
                    File.Delete( imageFileName );
                }
                catch( Exception )
                { }
            }
        }

        /// <summary> temporary image file. </summary>
        private string imageFileName;
    }
}

1 个答案:

答案 0 :(得分:9)

可能最好的地方是连接Form_Load事件处理程序,并在那里进行。

确定:

  1. 将您的代码从menuFileAcquire_Click移出到定义为private void Acquire的方法

  2. Acquire

  3. 致电menuFileAcquire_Click
  4. 使用Visual Studio,添加一个事件处理程序来处理表单的Loaded事件。

  5. 在该方法中(很可能称为MainForm_Loaded),也可以调用Acquire

  6. 这样,您的Acquire方法以及首次加载表单时触发的方法都会调用相同的功能。