闲着没事,学习了一下自定义控件相关的内容,从网上找了一个例子,并拓展了一些简单的功能,在此记录一下下。
1.自定义控件
1.1图片信息显示
(1)创建Windows窗体控件库,控件名称命名为UCPicture
(2)添加1个PictureBox控件,用来显示图片(pictureBox)。
添加4个lable,分别是:图片名称、图片大小、图片尺寸、图片路径。
添加3个TextBox,分别用来显示图片名称信息(txtName)、图片大小信息(txtLength)、图片尺寸信息(txtSize)。
添加1个RichTextBox(txtPath),用来显示图片路径信息。
添加1个按钮(btnOpen),用来选择需要查看的图片。
(3)添加程序处理代码
/// <summary>
/// 打开图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click(object sender, EventArgs e)
{
//选择图片
OpenFileDialog fileDialog = new OpenFileDialog();
//设置选择图片的格式
fileDialog.Filter = "JPG(*.JPG;*.JPEG);gif文件(*.GIF);PNG(*.PNG)|*.jpg;*.jpeg;*.gif;*.png";
fileDialog.FilterIndex = 1;
fileDialog.RestoreDirectory = true;
fileDialog.FileName = string.Empty;
if (fileDialog.ShowDialog() == DialogResult.OK)
{
//文件路径
path = fileDialog.FileName.ToString();
FileInfo fileInfo = new FileInfo(path);
//文件大小
long picLong = fileInfo.Length / 1024;
//文件名称
fileName = fileInfo.Name;
Bitmap bmPic = new Bitmap(path);
Point location = new Point(bmPic.Size);
if (location.X > pictureBox.Size.Width || location.Y > pictureBox.Size.Height)
{
//设置pictureBox的显示模式
pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
}
else
{
pictureBox.SizeMode = PictureBoxSizeMode.CenterImage;
}
//异步加载图像
pictureBox.LoadAsync(path);
//图片名称
this.txtName.Text = fileName;
//图片路径
this.txtPath.Text = path;
//图片大小
this.txtLength.Text = picLong.ToString() + "KB";
//图片尺寸
this.txtSize.Text = bmPic.Size.Width.ToString() + "x" + bmPic.Size.Height.ToString();
}
}
(4)测试控件。
重新生成一下UCPicture控件,设置UCPicture控件为启动项,f5运行。
(5)使用控件
创建一个Windows窗体,此时会在工具箱中看到新增加的自定义控件UCPicture,直接将这个控件拖拽到窗体上即可。选择一个图片,显示该图信息,则测试成功。
1.2图片查看方式
(1)在UCPicture控件中新增加ContextMenuStrip控件
手动添加菜单项
(2)具体代码
/// <summary>
/// 给各个右键菜单项一次性添加自定义事件
/// </summary>
/// <param name="m"></param>
private void AddMenuEvent(ContextMenuStrip m)
{
//一层菜单的处理
//foreach (ToolStripMenuItem item in contextMenuStrip1.Items)
//{
// item.Click += new EventHandler(MenuEvent);
//}
//二层菜单处理
foreach (ToolStripMenuItem item in contextMenuStrip1.Items)
{
ChildMenu(item);
}
}
/// <summary>
/// 子菜单
/// </summary>
/// <param name="item"></param>
private void ChildMenu(ToolStripMenuItem item)
{
if (item.HasDropDownItems)
{
//如果有子菜单
foreach (ToolStripMenuItem m in item.DropDownItems)
{
ChildMenu(m);
}
}
else
{
//如果没有子菜单就直接添加自定义事件 MenuEvent
item.Click += new EventHandler(MenuEvent);
}
}
/// <summary>
/// 右键菜单事件方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuEvent(object sender, EventArgs e)
{
ToolStripMenuItem ts = (sender as ToolStripMenuItem);
//获取子菜单的上一级菜单 string oweraitem=ts.OwnerItem.Text;
string thecmdstr = ts.Text;
switch (thecmdstr)
{
case "画图工具":
PictureDraw();
break;
case "图片查看器":
PictureViewer();
break;
case "重命名":
ReName(path);
break;
default:
break;
}
}
/// <summary>
/// 图片查看器查看图片
/// </summary>
private void PictureViewer()
{
Process proc = new Process();
proc.StartInfo.WorkingDirectory = path;
proc.StartInfo.FileName = "rundll32.exe";
proc.StartInfo.Arguments = @"C:\WINDOWS\system32\shimgvw.dll,ImageView_Fullscreen " + path;
proc.Start();
}
/// <summary>
/// 使用画图工具显示图片
/// </summary>
private void PictureDraw()
{
System.Diagnostics.Process.Start("mspaint.exe", path);
}
1.3图片重命名
具体代码如下:
/// <summary>
/// 重命名
/// </summary>
private void ReName(string filePath)
{
this.txtName.ReadOnly = false;
//默认选中文本
this.txtName.Select();
}
/// <summary>
/// 重命名后,回车键确认
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lblName_KeyPress(object sender, KeyPressEventArgs e)
{
//回车键确认
if (e.KeyChar == 13)
{
string newFileName = this.txtName.Text;
Computer MyComputer = new Computer();
MyComputer.FileSystem.RenameFile(path, newFileName);
this.txtName.ReadOnly = true;
}
}
2.换肤
暂时是用的IrisSkin进行换肤。IrisSkin4.dll和皮肤文件都是从网上下载的。
将IrisSkin4.dll和皮肤文件放到bin/debug目录下。
(1)添加下拉框,用来显示所有的皮肤
(2)在程序的资源管理器中的【引用】上单击右键,选择【添加引用】,找到刚才复制过来的IrisSkin4.dll文件,点击【确定】
(3)【工具】——>【选择工具箱项——>【.NET Framework组件】——>【浏览】——>找到IrisSkin4.dll——>点击【确定】,SkinEngine控件加入到工具箱
(4)具体代码实现
SkinEngine skinEngine = new SkinEngine();
private void Form1_Load(object sender, EventArgs e)
{
skinEngine.SkinAllForm = true;
}
/// <summary>
/// 获取所有皮肤文件
/// </summary>
private void GetSkin()
{
string path = System.Environment.CurrentDirectory + "\\Skins"; //选择皮肤文件
DirectoryInfo folder = new DirectoryInfo(path);
foreach (FileInfo file in folder.GetFiles("*.ssk"))
{
this.cbxSkin.Items.Add(file.Name);
}
}
/// <summary>
/// 皮肤选择事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cbxSkin_SelectedIndexChanged(object sender, EventArgs e)
{
string name = this.cbxSkin.SelectedItem.ToString();
string skinInfo = string.Format("Skins/{0}", name);
skinEngine.SkinFile = skinInfo;
}
(5)最终效果