winform制作小工具的技巧

在使用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");

时间: 2024-08-07 12:36:12

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

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

有时候,我们可能遇到这样的一种需求,就是需要有一个小工具,在服务器中不断的执行一些任务,那么这样的需求,我们可以做一个windows服务程序,或者做一个winform wpf等小程序,然后小程序里面开启一个线程,在线程里面不断地执行一些代码 那么废话就不多说了,先看截图  www.it404.cn 程序很简单,但是基本的不断循环扫描的功能基本已经有了 首先在formload里面 我们开启一个子线程 private void FormMain_Load(object sender, EventAr

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

用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013创建一个项目并添加到Github的教程,请参考(http://www.admin10000.com/document/4004.html).简单来说,就是先用VS创建项目:然后在Github网站上创建一个Respo(本项目的代码托管项目),记下(https://*.git)那个地址:最后用"提交&q

Winform 的小技巧

1.窗体居中显示.Form的Propertity,StartPosition ----CenterScreen 2.窗体的位置  This.Left, This.Top 3.显示在其他窗口前 TopMost=true 4.窗体的位置由上次关闭时决定. 其实也很简单,在From 的Closed 事件中,记录下当前窗体的Left值和Top值.然后在窗体加载时(Load事件)中,获取记录的值,再改变Left和Top属性,就实现了该功能. 这里以记录到注册表为例: private void Form1_

python制作英语翻译小工具

用python爬虫可以制作英语翻译小工具.来看下代码吧- import requests,json #函数封装 def translator(): session=requests.session() i=input('请问你要翻译什么?') url='http://fanyi.youdao.com/translate' headers={ 'Referer': 'http://fanyi.youdao.com/', 'User-Agent': 'Mozilla/5.0 (Macintosh;

使用wxPython制作GUI小工具

我们项目客户端能看到的服务器列表由一个叫IPList.txt文本文件提供,每次启动客户端都会从CDN下载最新版本的IPList.txt.前两天运营同学那边提过来一个小工具需求,公测时对各个渠道需要提供不同的IPList.txt,如果临时加开新服或者修改老服状态(火爆/拥挤/顺畅),时间紧急手动修改容易出错,希望能有可视化工具修改. 这项工作到我手上之后,大致思索了下,决定用Python实现.用Python写过一些小工具,但没有做过GUI,查了下资料,采用了推荐比较多的wxPython库.工具逻辑

拾遗:shell 技巧之 yes 小工具

当需要在脚本中自动回答 'yes' 或 'no' 等选项时,就可以调用 yes 小工具,语法如下: 如(对于管道后面的命令执行过程中提出的每个询问,都发送定制的内容 no 过去): yes no | cp -i testfile /tmp 就等同于: cp -n testfile /tmp 对于没有像 cp 一样提供内置选项的工具,就可以使用 yes 工具自动回答任何需要的内容.

Python学习之旅:用Python制作一个打字训练小工具

一.写在前面 说道程序员,你会想到什么呢?有人认为程序员象征着高薪,有人认为程序员都是死肥宅,还有人想到的则是996和 ICU. 别人眼中的程序员:飞快的敲击键盘.酷炫的切换屏幕.各种看不懂的字符代码. 然而现实中的程序员呢?对于很多程序员来说,没有百度和 Google 解决不了的问题,也没有 ctrl + c 和 ctrl + v 实现不了的功能. 那么身为一个程序员,要怎么让自己看起来更加“专业”呢?答案就是加快自己的打字速度了,敲的代码可能是错的,但这个13却是必须装的! 然而还是有不少人

OpenCV与MFC实战之图像处理 样本采集小工具制作 c++MFC课程设计

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12111102.html 入门不久的人可以通过opencv实战来锻炼一下学习opencv的成果,百度云链接: 链接:https://pan.baidu.com/s/1jGOD97Zx96ZDAvlkQtaPYQ 提取码:afip 运行环境VS2017,需要配置库为:opencv 题目:样本采集小工具 需求: 用MFC和opencv完成样本采集小工具. 界面功能 1.选中原图片集的目录. 2.选

屏幕截图小工具的制作过程问题记录 python PIL pynput pyautogui pyscreeze

最近想做一个脚本小工具,方便写一些操作说明文档,它的功能很简单,就是把脚本打开之后,鼠标进行操作点击时,会在点击后进行截图,并在图上标记出点击的位置,有点类似于录屏软件的图片版,这样的话,如果要想用文档说明某些系统的操作步骤,就打开脚本一顿操作,操作完之后,每次步骤就自动记录下来了,带来方便.最后工具是做成了,但是中间的探索过程并不顺利,所以在这里记录一下思路和解决问题的过程. 大体思路:鼠标左键点击,能够获取点击的坐标,并在点击之后进行屏幕截图操作,之后再用图片处理库给鼠标点击位置加上某种标记