在使用winfrom制作一些工具的时候,一些基本设置都是去属性里面找来找去,一段时间就忘了,记录记录以备不时之需。

一、窗体绘制的常用设置

窗体的设置应当在窗体构造函数中InitializeComponent()方法前执行

    public frmMain()
{
this.StartPosition = FormStartPosition.CenterScreen;//窗体居中显示
this.MaximizeBox = false;//不显示最大化按钮
this.FormBorderStyle = FormBorderStyle.FixedSingle;//禁止放大缩小
InitializeComponent();
}

二、winform文本框全选功能

Control_ControlAdded事件在InitializeComponent()调用之前注册

    public frmMain()
{
this.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.Control_ControlAdded);
InitializeComponent();
}
private void Control_ControlAdded(object sender, ControlEventArgs e)
{
//使“未来”生效
e.Control.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.Control_ControlAdded);
//使“子孙”生效
foreach (Control c in e.Control.Controls)
{
Control_ControlAdded(sender, new ControlEventArgs(c));
}
//使“过去”生效
TextBox textBox = e.Control as TextBox;
if (textBox != null)
{
textBox.KeyPress += TextBox_KeyPress;
}
}
private void TextBox_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox textBox = sender as TextBox;
if (textBox == null)
return;
if (e.KeyChar == (char)1)
{
textBox.SelectAll();
e.Handled = true;
}
}

三、设置一个显示日志的文本框

首先在页面中放置一个文本框,设置Multiline=true后拖动到合适大小

然后在加载事件中进行设置

private static int _maxLogmsgTextLength = 10000;//日志框最大输入
private void frmMain_Load(object sender, EventArgs e)
{
this.txtLogMsg.Multiline = true;//多选, 一般在界面中就设置了
this.txtLogMsg.ScrollBars = ScrollBars.Vertical;//日志输出显示纵向滚动条
this.txtLogMsg.ReadOnly = true; //输出日志只读
this.txtLogMsg.TextChanged += txtLogMsg_TextChanged;//注册改变事件
int.TryParse(System.Configuration.ConfigurationManager.AppSettings["MAX_LOGMSG_TEXT_LENGTH"], out _maxLogmsgTextLength);//优先使用配置文件配置的值
}
//文本框事件 使追加日志后滚动光标到末尾
void txtLogMsg_TextChanged(object sender, EventArgs e)
{
txtLogMsg.SelectionStart = txtLogMsg.Text.Length + 10;//设置选中文字的开始位置为文本框的文字的长度,如果超过了文本长度,则默认为文本的最后。
txtLogMsg.SelectionLength = 0;//设置被选中文字的长度为0(将光标移动到文字最后)
txtLogMsg.ScrollToCaret();//将滚动条移动到光标位置
}
//追加日志方法 在非UI线程中直接AppendText调试会异常
private void AppendLogMsg(string msg)
{
//在UI线程中执行
txtLogMsg.BeginInvoke(new Action(() =>
{
txtLogMsg.AppendText(msg);
txtLogMsg.AppendText(Environment.NewLine);//追加换行符
}));
}

四、开启一个线程执行任务

避免界面卡死

var askThread=new Thread(() =>
{
//TODO
//AppendLogMsg("添加日志,调试时不会报错~~~");
}
askThread.Start();
//.NET Framework 4.5+
//Task.Run(()=>{
// //TODO
//})

五、打开图片选择对话框

默认为多选,返回选择的文件路径集合,可使用FirstOrDefault()方法判断是否选择了文件

private List<string> OpenImagesDialog(bool isMulti = true)
{
var openFileDialog = new OpenFileDialog();
const string imgExts = "图像文件 (*.bmp;*.ico;*.gif;*.jpeg;*.jpg;*.png)|*.bmp;*.ico;*.gif;*.jpeg;*.jpg;*.png";
openFileDialog.Filter = imgExts;
openFileDialog.Multiselect = isMulti;
openFileDialog.RestoreDirectory = true;
openFileDialog.FilterIndex = 1;
var result = new List<string>();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
result.AddRange(openFileDialog.FileNames);
}
return result;
}

六、复制文件到指定目录

将传递的文件复制到指定目录并以Guid重命名,目录不存在则自动创建

使用元组返回对应路径键值对(Item1)及失败路径集合(Item2)

/// <summary>
/// 复制文件到指定目录并重命名
/// </summary>
/// <param name="sourcePaths">要复制的文件路径集合</param>
/// <param name="targetDir">目标目录</param>
/// <returns>Item1:对应路径,Item2:失败文件路径</returns>
public static Tuple<Dictionary<string, string>, List<string>> CopyFileToDir(List<string> sourcePaths, string targetDir)
{
if (!Directory.Exists(targetDir))
{
Directory.CreateDirectory(targetDir);
}
var errorFiles = new List<string>();
var saveDirs = new Dictionary<string, string>();
sourcePaths.ForEach(item =>
{
//路径不存在或者路径已存在则失败
if (!File.Exists(item) || saveDirs.ContainsKey(item))
{
errorFiles.Add(item);
}
else
{
var saveName = Guid.NewGuid() + Path.GetExtension(item);
var savePath = Path.Combine(targetDir, saveName);
File.Copy(item, savePath);
saveDirs.Add(item, savePath);
}
});
var result = new Tuple<Dictionary<string, string>, List<string>>(saveDirs, errorFiles);
return result;
}

调用示例 ( AppendLogMsg 为追加日志方法)

var selectImgs = OpenImagesDialog(true);//五、打开图片选择对话框方法
var result = FileHelper.CopyFileToDir(selectImgs, txtSaveDir.Text);
result.Item1.Keys.ToList().ForEach(item => AppendLogMsg(item + ":" + result.Item1[item]));//成功时输出
result.Item2.ForEach(item => AppendLogMsg("文件复制失败:" + item));//文件错误输出

七、使用Ini文件存取配置

保存一些配置到ini文件,是自己的工具更佳灵活

ini操作类

public class IniHelper
{
// 声明INI文件的写操作函数 WritePrivateProfileString()
[System.Runtime.InteropServices.DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 声明INI文件的读操作函数 GetPrivateProfileString()
[System.Runtime.InteropServices.DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath); private readonly int _retLength = 500;
private readonly string _sPath = null;
/// <summary>
/// 初始化IniHelper
/// </summary>
/// <param name="path">ini文件保存路径</param>
/// <param name="rl">默认500</param>
public IniHelper(string path, int? rl = null)
{
this._sPath = path;
this._retLength = rl.HasValue ? rl.Value : _retLength;
}
/// <summary>
/// 设置Ini配置,默认配置节为Setting
/// </summary>
/// <param name="key">键名</param>
/// <param name="value">键值</param>
/// <param name="section">配置节</param>
public void WriteValue(string key, string value, string section = "Setting")
{
// section=配置节,key=键名,value=键值,path=路径
WritePrivateProfileString(section, key, value, _sPath);
}
/// <summary>
/// 根据键名节点读取Ini配置,默认节点为Setting
/// </summary>
/// <param name="key">键名</param>
/// <param name="section">配置节</param>
/// <returns></returns>
public string ReadValue(string key, string section = "Setting")
{
// 每次从ini中读取多少字节
System.Text.StringBuilder temp = new System.Text.StringBuilder(_retLength);
// section=配置节,key=键名,temp=上面,path=路径
GetPrivateProfileString(section, key, "", temp, _retLength, _sPath);
return temp.ToString();
}
}

IniHelper使用示例

string savePath = AppDomain.CurrentDomain.BaseDirectory + "config.ini";
IniHelper _iniHelper = new IniHelper(savePath);//初始化
_iniHelper.WriteValue("txtGitAddress");//写入
_iniHelper.ReadValue("txtGitAddress");//读取

其他

调用本地程序:System.Diagnostics.Process.Start("E:\\程序.exe", "c:\\windows");

打开目录:System.Diagnostics.Process.Start("Explorer.exe", “目录路径E:\abc\”);

工具示例

Coding :https://coding.net/u/yimocoding/p/ImgsDownloadClient/git

Github :https://github.com/yimogit/ImgsDownloadClient

winform制作小工具的技巧的更多相关文章

  1. 程序员实用JDK小工具归纳,工作用得到

    在JDK的安用装目录bin下,有一些有非常实用的小工具,可用于分析JVM初始配置.内存溢出异常等问题,我们接下来将对些常用的工具进行一些说明. JDK小工具简介 在JDK的bin目录下面有一些小工具, ...

  2. C#在透明窗体WinForm上面画图(电子尺小工具的实现)

    前几天要做一个微信调一调的外挂,里面用到了尺子测量距离,然后就自己下载了一个电子尺,最近要升级我的跳一跳外挂,然后就准备自己做一个电子尺,嵌入到我的外挂里面,在嵌入到我的外挂之前,我自己做了一个完整版 ...

  3. C#-用Winform制作一个简单的密码管理工具

    为什么要做? 首先是为了练习一下c#. 想必大家都有过记不起某个平台的账号密码的经历,那种感受着实令人抓狂.那这么多账号密码根本记不住!我之前用python写过一个超级简单(连账号信息都写在代码里那种 ...

  4. 用C#Winform写个简单的批量清空文件内容和删除文件的小工具

    用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013 ...

  5. ireport制作小技巧

    ireport制作小技巧 首先ireport中大小写问题: 1.parameter中如果小写,引用也小写 2.$F{},一般都大写 3.子报表中引用父报表中查询出来的值时,只需要小写即可,即在子报表的 ...

  6. OpenCV探索之路(二十五):制作简易的图像标注小工具

    搞图像深度学习的童鞋一定碰过图像数据标注的东西,当我们训练网络时需要训练集数据,但在网上又没有找到自己想要的数据集,这时候就考虑自己制作自己的数据集了,这时就需要对图像进行标注.图像标注是件很枯燥又很 ...

  7. 懒人小工具1:winform自动生成Model,Insert,Select,Delete以及导出Excel的方法

       懒人小工具2:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法    github地址:https://github.com/Jimmey-Jiang/J ...

  8. winform视频教程-任务定时循环执行小工具

    有时候,我们可能遇到这样的一种需求,就是需要有一个小工具,在服务器中不断的执行一些任务,那么这样的需求,我们可以做一个windows服务程序,或者做一个winform wpf等小程序,然后小程序里面开 ...

  9. 使用PyQt4制作一个正则表达式测试小工具

    最近在做一些网络爬虫的时候,会经常用到正则表达式.为了写出正确的正则表达式,我经常在这个网站上进行测试:Regex Tester.这个页面上面一个输入框输入正则表达式,下面一个输入框输入测试数据,上面 ...

随机推荐

  1. java面向对象--内部类

    将一个类定义在另一个类里面,里面的那个类称为内部类,与属性.方法等一样视作外部类的成员.内部类提供了更好的封装,不允许同包中的其他类访问该内部类. 内部类作为外部类的成员,同样可以被4个访问限定符修饰 ...

  2. 几张图带你轻轻松松了解小程序和APP的区别

    微信"小程序"的公测一开放,立即在朋友圈刷屏无数,仿佛人人都在互联网圈.但是因为微信限制,程序还不能发布使用,所以也极少人看到真正的小程序是怎么样的. 小程序驿站专注微信小程序的开 ...

  3. iOS textfield 限制输入字数长度

    iOS textfield限制输入的最大长度 [self.textFiled addTarget:self action:@selector(textFieldDidChange:) forContr ...

  4. redis入门指南-第7章-管理

    7.1 持久化 1.RDB方式 2.AOF方式 Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(poi ...

  5. sublime工具篇

    sublime快捷键的应用 熟悉掌握sublime快捷键,提高编码效率,享受编码乐趣. window操作系统常用快捷键 win+D:快速显示桌面     win+方向键:最大化最小化窗口  win+L ...

  6. web聊天室总结

    前言: 最近在写一个聊天室的项目,前端写了挺多的JS(function),导致有点懵比,出了BUG,也迟迟找不到.所以昨天把写过的代码总结了一下,写成博客. 项目背景 参考博客: http://www ...

  7. axis2 和 xfire 接口调用问题排查

    背景: 1个运营商厂家开发人员离职,我们为了上线对接接口,迁就对方客户端调用.对方客户端框架用的是xfire.调用方式基本为:   Service serviceModel = new ObjectS ...

  8. ATmega8仿真——外部中断的学习

    前面我们学习了ATmega8的I/O口作为通用数字输入/输出口来用时对LED数码管控制和扫描按键的应用: 但ATmega8多数的I/O口都是复用口,除了作为通用数字I/O使用,还有其第二功能,这里我们 ...

  9. vs2015未安装 Style 的 Visual Studio 语言支持

    解决方案:在浏览器搜索下载安装Microsoft ASP.NET and Web Tools即可 下载地址:https://www.microsoft.com/en-us/download/confi ...

  10. dedecms做好的网站怎么上传到网上?

    1.首先做好网站后把网站所有和数据库备份 dedecms  点击 系统 - 数据库备份/还原 - 全选  后---提交-----等待备份完全 备份文件在哪里:data/backupadta--- 2. ...