FormMDI.cs

using System;
using System.Data;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace WinFormMDIImage
{
    public partial class FormMDI : Form
    {
        #region
        private DataTable table;
        private OpenFileDialog openFile;

        [DllImport("user32.dll", EntryPoint = "AnimateWindow")]
        private static extern bool AnimateWindow(IntPtr handle, int ms, int flags);
        #endregion

        public FormMDI()
        {
            #region
            InitializeComponent();
            GridView();
            openFile = new OpenFileDialog();
            openFile.Filter = "ImageFormat (*.BMP;*.GIF;*.JPG;*.PNG)|*.bmp;*.gif;*.jpg;*.png";
            openFile.Multiselect = true;
            this.AllowDrop = true; // 允许拖放操作。
            this.DoubleBuffered = true; // 双缓冲绘图。
            this.IsMdiContainer = true; // MDI 窗体。
            this.BackgroundImageLayout = ImageLayout.Zoom; // 图像按其原有的大小比例缩放。
            this.DesktopBounds = Screen.GetWorkingArea(this);
            this.Text = Environment.UserName;
            #endregion
        }

        #region DataGridViewStyle
        private void GridView()
        {
            table = new DataTable("Image");
            table.Locale = System.Globalization.CultureInfo.InvariantCulture;
            DataColumn column = table.Columns.Add("Name", typeof(String));
            table.Columns.Add("Bytes", typeof(Byte[]));
            table.Constraints.Add("PK", column, true); // 创建主键。
            table.DefaultView.ApplyDefaultSort = true; // 使用默认排序。
            DataGridView gridView = new DataGridView();
            DataGridViewImageColumn imgColumn = new DataGridViewImageColumn();
            imgColumn.DataPropertyName = "Bytes";
            imgColumn.ImageLayout = DataGridViewImageCellLayout.Zoom; // 将图形按比例放大,直到达到其所在单元格的宽度或高度。
            imgColumn.Width = 128; // 设置图片宽度。
            gridView.Columns.Add(imgColumn);
            gridView.RowTemplate.Height = 128; // 设置图片高度。
            gridView.Width = 148; // 设置控件宽度。
            gridView.BorderStyle = BorderStyle.Fixed3D;
            gridView.BackgroundColor = SystemColors.Window;
            gridView.Dock = DockStyle.Left;
            gridView.AutoGenerateColumns = false; // 禁用自动创建列。
            gridView.AllowUserToAddRows = false; // 隐藏添加行。
            gridView.AllowUserToResizeColumns = false; // 禁用调整列的大小。
            gridView.AllowUserToResizeRows = false; // 禁用调整行的大小。
            gridView.ColumnHeadersVisible = false; // 隐藏列标题。
            gridView.RowHeadersVisible = false; // 隐藏行标题。
            gridView.MultiSelect = false; // 用户仅能选择一个单元格、行或列。
            gridView.ShowCellToolTips = true; // 显示单元格工具提示。
            gridView.CellToolTipTextNeeded += new DataGridViewCellToolTipTextNeededEventHandler(gridView_CellToolTipTextNeeded);
            gridView.SelectionChanged += new EventHandler(gridView_SelectionChanged);
            gridView.KeyDown += new KeyEventHandler(gridView_KeyDown);
            gridView.DataSource = table.DefaultView;
            this.Controls.Add(gridView);
        }

        private void gridView_CellToolTipTextNeeded(object sender, DataGridViewCellToolTipTextNeededEventArgs e)
        {
            e.ToolTipText = table.DefaultView[e.RowIndex][0] as string; // 设置工具提示文本。
        }

        private void gridView_SelectionChanged(object sender, EventArgs e)
        {
            DataGridViewCell cell = (sender as DataGridView).CurrentCell;
            if (cell != null)
            {
                this.Text = Path.GetFileName(cell.ToolTipText);
                this.BackgroundImage = cell.FormattedValue as Image;
            }
        }

        private void gridView_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyData)
            {
                case (Keys.Control | Keys.C):
                    Clipboard.SetImage(this.BackgroundImage); // 图片存储到剪贴板。
                    e.SuppressKeyPress = true;
                    break;
                case (Keys.Control | Keys.V):
                    if (Clipboard.ContainsImage())
                        this.BackgroundImage = Clipboard.GetImage();
                    break;
                case (Keys.Control | Keys.O):
                    if (openFile.ShowDialog(this) == DialogResult.OK)
                        foreach (string filePath in openFile.FileNames)
                        {
                            if (table.DefaultView.Find(filePath) < 0)
                                table.Rows.Add(filePath, File.ReadAllBytes(filePath));
                        }
                    break;
                case (Keys.Control | Keys.S):
                    Environment.CurrentDirectory = Application.StartupPath;
                    BackgroundImage.Save("Image.png", BackgroundImage.RawFormat);
                    System.Diagnostics.Process.Start("Image.png");
                    break;
                case Keys.X:
                    BackgroundImage.RotateFlip(RotateFlipType.RotateNoneFlipX); // 水平对称图片。
                    this.Refresh(); // 刷新图片。
                    break;
                case Keys.Y:
                    BackgroundImage.RotateFlip(RotateFlipType.RotateNoneFlipY); // 垂直对称图片。
                    this.Refresh(); // 刷新图片。
                    break;
                case Keys.L:
                    BackgroundImage.RotateFlip(RotateFlipType.Rotate90FlipXY); // 逆时针旋转图片90°
                    this.Refresh(); // 刷新图片。
                    break;
                case Keys.R:
                    BackgroundImage.RotateFlip(RotateFlipType.Rotate90FlipNone); // 顺时针旋转图片90°
                    this.Refresh(); // 刷新图片。
                    break;
                case Keys.Left:
                    --(BindingContext[table.DefaultView] as CurrencyManager).Position;
                    break;
                case Keys.Right:
                    ++(BindingContext[table.DefaultView] as CurrencyManager).Position;
                    break;
                case Keys.Enter:
                    this.DesktopBounds = Screen.GetWorkingArea(this);
                    this.BackgroundImageLayout = ImageLayout.Stretch;
                    e.SuppressKeyPress = true;
                    break;
                case Keys.Escape:
                    this.DesktopBounds = Screen.GetWorkingArea(this);
                    this.BackgroundImageLayout = ImageLayout.Zoom;
                    e.SuppressKeyPress = true;
                    break;
            }
        }
        #endregion

        #region DragEnter
        protected override void OnDragEnter(DragEventArgs e)
        {
            base.OnDragEnter(e);
            this.Activate(); // 激活窗体并给予它焦点。
            DataObject data = e.Data as DataObject;
            if (data.ContainsFileDropList())
            {
                foreach (string filePath in data.GetFileDropList())
                {
                    if (Regex.IsMatch(Path.GetExtension(filePath), @".(bmp|gif|jpg|png)", RegexOptions.IgnoreCase)) // 指定不区分大小写的匹配。
                    {
                        if (table.DefaultView.Find(filePath) < 0)
                            table.Rows.Add(filePath, File.ReadAllBytes(filePath));
                    }
                }
            }
        }
        #endregion

        #region FormLoad
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            AnimateWindow(this.Handle, 1000, 0x20010); // 居中逐渐显示。
        }
        #endregion

        #region FormClosing
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            base.OnFormClosing(e);
            switch (e.CloseReason)
            {
                case CloseReason.TaskManagerClosing:
                case CloseReason.UserClosing:
                    if (MessageBox.Show(this, "确实要退出图片管理系统吗?", "系统提示!", MessageBoxButtons.YesNo) == DialogResult.Yes)
                        AnimateWindow(this.Handle, 1000, 0x10010); // 居中逐渐隐藏。
                    else
                        e.Cancel = true;
                    break;
            }
        }
        #endregion
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值