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