Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >winform制作小工具的技巧

winform制作小工具的技巧

作者头像
易墨
发布于 2018-09-14 07:48:15
发布于 2018-09-14 07:48:15
78700
代码可运行
举报
运行总次数:0
代码可运行

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

一、窗体绘制的常用设置

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public frmMain()
    {
        this.StartPosition = FormStartPosition.CenterScreen;//窗体居中显示  
        this.MaximizeBox = false;//不显示最大化按钮 
        this.FormBorderStyle = FormBorderStyle.FixedSingle;//禁止放大缩小 
        InitializeComponent();
    }

二、winform文本框全选功能

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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后拖动到合适大小 然后在加载事件中进行设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);//追加换行符
    }));
}

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

避免界面卡死

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var askThread=new Thread(() =>
{
  //TODO
  //AppendLogMsg("添加日志,调试时不会报错~~~");
}
askThread.Start();
//.NET Framework 4.5+
//Task.Run(()=>{
//  //TODO
//})

五、打开图片选择对话框

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <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 为追加日志方法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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操作类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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使用示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DB数据导出工具分享
开启线程执行导出的时候使用的是Task.Run(() =>{});若将框架版本改为4.0则需要将此处修改为new Thread(() =>{}).Start();
易墨
2018/09/14
1.6K0
DB数据导出工具分享
winform复制文件到指定目录
执行步骤 弹出选择对话框:var openFileDialog = new OpenFileDialog(); 设置选择内容,如所有图片:openFileDialog.Filter="图像文件 (*.bmp;*.ico;*.gif;*.jpeg;*.jpg;*.png)|*.bmp;*.ico;*.gif;*.jpeg;*.jpg;*.png"; 获取选择的路径集合:openFileDialog.FileNames 复制文件:File.Copy(sourcePath,targetPath);//目录重命
易墨
2018/09/14
2.2K0
C#操作INI文件的案例分享
kernel32.dll是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。 以上来自百度百科
用户7718188
2022/11/06
8100
IniHelper——INI操作辅助类
使用INI配置文件,简单便捷。 该辅助工具类为C#操作INI文件的辅助类,源码在某位师傅的基础上完善的来,因为忘记最初的来源了,因此不能提及引用,在此深感遗憾,并对贡献者表示感谢。 1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Runtime.InteropServices; 5 using System.Text; 6 7 names
用户1637609
2018/04/12
1.4K0
INI文件配置乱码——C#
在声明时加上参数CharSet = CharSet.Unicode [DllImport("kernel32", CharSet = CharSet.Unicode)] CharSet: 指示如何向方法封送字符串参数,并控制名称重整。 最后,附上读写ini文件,解决出现乱码的代码 [DllImport("kernel32", CharSet = CharSet.Unicode)] private static extern long WritePrivateProfileString(string sect
vv彭
2021/01/06
2.2K0
C# ini文件操作【源码下载】
来源:http://www.cnblogs.com/polk6/p/6052908.html
跟着阿笨一起玩NET
2018/09/20
1.1K0
C# ini文件操作【源码下载】
C#操作INI配置文件示例
该文章介绍了如何用C#操作INI配置文件,包括读取和写入配置项。文章首先介绍了INI文件的结构和配置项的命名,然后讲解了如何在C#中读取和写入配置项。最后,文章提供了一个示例,演示了如何使用这些API来读取和写入配置项。
CNXY
2017/12/25
1.3K0
C#操作INI配置文件示例
C# 读写Ini文件
ini文件在Win95以前比较盛行,之后由于出册表等技术的出现,ini技术主键退居二线,不过对于一些小项目,读写ini文件还是很适用的。
用户9127601
2021/11/01
1.7K0
C#常用操作类库二(ini配置文件读写)
public  class IniHelper     {          //文件INI名称          public string Path;         /**/////声明读写INI文件的API函数           [DllImport("kernel32")]         private static extern long WritePrivateProfileString(string section, string key, string val, string file
跟着阿笨一起玩NET
2018/09/18
1.3K0
C#*.bmp,*.jpg,*.png指定颜色,转换为透明背景的png[通俗易懂]
partial class Form1 { /// /// private System.ComponentModel.IContainer components = null;
全栈程序员站长
2022/09/13
3.9K0
C#*.bmp,*.jpg,*.png指定颜色,转换为透明背景的png[通俗易懂]
C# ini文件读写类
VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面是一个C# ini文件读写类, 从网上收集的,很全,就是没有对section的改名功能,高手可以增加一个。 using System; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Collections; using System.Collections.Specialized;
hbbliyong
2018/03/06
1.1K0
::WritePrivateProfileString()的用法,以及GetPrivateProfileString的用法注意事项
WritePrivateProfileString(_T(“Section1”),_T(“Field1”),Field,savePath);
全栈程序员站长
2022/09/07
8360
Hex转Bin小工具
不知道为什么我的MDK5生成的Bin文件始终有问题,重装了几次还是有问题,后来觉得可能系统有问题,然后在虚拟机里重新安装了一个系统,还是不行(很烦!!!)
知否知否应是绿肥红瘦
2025/02/19
870
C# WinForm 界面控件
1.首先插入新的子窗体form1,并设置IsMdiContainer = True 属性。
微软技术分享
2022/12/28
3.3K0
C# WinForm 界面控件
c# winform快捷键实现
你会注意到keyup和kedown事件的修饰符是protected,为什么要用protected呢?是因为窗体的一些输入控件的按键事件是不会传递到窗体的,比如textbox这些,所有需要手动指定一下
冰封一夏
2019/09/10
1.1K0
C#结合数据库开发通讯录管理系统
通讯录管理系统,数据库关系模式为:账户(账户名,登录密码,头像),联系人(ID,姓名,电话,QQ,Email)。主要功能包括:注册,登录,注销账号,修改账户名以及密码,更换头像,以及对联系人的增删改查。
全栈程序员站长
2022/07/22
2.4K0
C#结合数据库开发通讯录管理系统
winform 各种小功能
明志德道
2023/10/21
1910
基于Java制作的截屏小工具
1、首先是热键的注册用法,这里JIntellitype.getInstance()是一个单例模式,然后注册了两个快捷键:Ctrl+K和Ctrl+H
流年Felix
2023/05/14
1.1K0
基于Java制作的截屏小工具
Unity 数据读取|(三)ini文件解析(INIParser,StreamReader,System.Runtime.InteropServices)
游戏开发小Y
2024/01/18
3790
Silverlight:双向绑定综合应用-多集合的依赖绑定
这是上一篇“Silverlight:双向绑定综合应用-自动更新集合汇总字段”的续篇。需求场景如下: 一个公司,有N个员工,逢年过节时要搞一些抽奖活动,最终要公告收奖名单。 "员工"类如下: namespace CollectionBinding { /// <summary> /// 员工类 /// </summary> public class Employee : NotifyPropertyChangedObject { private str
菩提树下的杨过
2018/01/23
8870
Silverlight:双向绑定综合应用-多集合的依赖绑定
相关推荐
DB数据导出工具分享
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文