位置:海鸟网 > IT > ASP.NET >

图象显示和翻转控件(用户自定义控件)

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace ImageZoomer
{
    /// <summary>
    ///
    /// </summary>
   
    //枚举类型定义,定义图象的四种翻转方式
    public enum FlipModeStyle
    {
        NoFlip=0,//不翻转
        FlipX=1,//水平翻转
        FlipY=2,//垂直翻转
        FlipXY=3//水平垂直翻转
    }

    //事件数据类定义,报告图象的显示尺寸
    public class DisplaySizeChangedEventArgs:System.EventArgs
    {
        public int Width;
        public int Height;
        public DisplaySizeChangedEventArgs()
        {
        }
    }

    //事件代表的声明
    public delegate void DisplaySizeChangedEventHandler(object sender,DisplaySizeChangedEventArgs e);

    //用户自定义控件类
    public class ImageZoomerControl : System.Windows.Forms.Control
    {
        private int width;//控件宽度
        private int height;//控件高度
        private System.Drawing.Bitmap bitmap;//控件上的图象
        private FlipModeStyle flip;//图象的翻转方式
        private event DisplaySizeChangedEventHandler eventHandler;//事件

        //构造方法,初始化数据成员
        public ImageZoomerControl()
        {
            width=this.width;
            height=this.height;
            bitmap=null;
            eventHandler=null;
        }

        //宽度属性
        [
        Category("ImageZoomer"),
        Des cription("The displayed image width.")
        ]
        public int DisplayWidth
        {
            get
            {
                return width;
            }
            set
            {
                if(value>=0)
                {
                    width=value;
                    Invalidate(this.ClientRectangle);
                }
            }
        }

        //高度属性
        [
        Category("ImageZoomer"),
        Des cription("The displayed image height.")
        ]
        public int DisplayHeight
        {
            get
            {
                return height;
            }
            set
            {
                if(value>=0)
                {
                    height=value;
                    this.Invalidate(this.ClientRectangle);
                }
            }
        }

        //图象属性
        [
        Category("ImageZoomer"),
        Des cription("The image displayed by this control."),
        DefaultValue(null)
        ]
        public Bitmap DisplayImage
        {
            get
            {
                return bitmap;
            }
            set
            {
                bitmap=value;
                if(bitmap!=null)
                {
                    width=bitmap.Width;
                    height=bitmap.Height;
                }
                else
                {
                    width=this.width;
                    height=this.height;
                }
                this.Invalidate(this.ClientRectangle);
            }
        }

        //翻转方式属性
        [
        Category("ImageZoomer"),
        Des cription("Specify how the image will be flipped.")
        ]
        public FlipModeStyle FlipMode
        {
            get
            {
                return flip;
            }
            set
            {
                flip=value;
                this.Invalidate(this.ClientRectangle);
            }
        }

        //事件属性
        [
        Category("ImageZoomer"),
        Des cription("Occurs when the image size is changed.")
        ]
        public event DisplaySizeChangedEventHandler DisplaySizeChanged
        {
            add
            {
                eventHandler+=value;
            }
            remove
            {
                eventHandler-=value;
            }
        }


        protected override void OnPaint(PaintEventArgs pe)
        {
            if(bitmap==null)
            {
                return;
            }
            Graphics g=pe.Graphics;

            //转换距阵
            System.Drawing.Drawing2D.Matrix transform;//距阵
            if(flip.Equals(FlipModeStyle.FlipX))
            {
                transform=new System.Drawing.Drawing2D.Matrix(-1,0,0,1,width,0);
            }
            else if(flip.Equals(FlipModeStyle.FlipY))
            {
                transform=new System.Drawing.Drawing2D.Matrix(1,0,0,-1,0,height);
            }
            else if(flip.Equals(FlipModeStyle.FlipXY))
            {
                transform=new System.Drawing.Drawing2D.Matrix(-1,0,0,-1,width,height);
            }
            else
            {
                transform=new System.Drawing.Drawing2D.Matrix(1,0,0,1,0,0);
            }
            //设置转换距阵
            g.Transform=transform;
            g.DrawImage(bitmap,new System.Drawing.Rectangle(0,0,width,height),
                0,0,bitmap.Width,bitmap.Height,
                GraphicsUnit.Pixel);
            //恢复绘图平面
            g.ResetTransform();

        }

        //发出事件的方法
        protected virtual void OnDisplaySizeChanged(DisplaySizeChangedEventArgs e)
        {
            //调用事件对象指向的方法
            this.Invoke(eventHandler,new object[]
                {
                    this,e
                }
                );
        }

        //重载方法,调用OnDisplaySizeChanged()发出事件
        protected override void OnMouseDown(MouseEventArgs e)
        {
            width=e.X;
            height=e.Y;
            this.Invalidate(this.ClientRectangle);

            DisplaySizeChangedEventArgs eventData=new DisplaySizeChangedEventArgs();
            eventData.Width=width;
            eventData.Height=height;

            this.OnDisplaySizeChanged(eventData);

            base.OnMouseDown(e);
        }

    }
}