當前位置:
首頁 > 知識 > winform製作小工具的技巧

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 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;
if (openFileDialog.ShowDialog == DialogResult.OK)
{
result.AddRange(openFileDialog.FileNames);
}
return result;
}

六、複製文件到指定目錄

將傳遞的文件複製到指定目錄並以Guid重命名,目錄不存在則自動創建 使用元組返回對應路徑鍵值對(Item1)及失敗路徑集合(Item2)

///

/// 複製文件到指定目錄並重命名
///

/// 要複製的文件路徑集合 /// 目標目錄 /// Item1:對應路徑,Item2:失敗文件路徑
public static Tuple, List> CopyFileToDir(List sourcePaths, string targetDir)
{
if (!Directory.Exists(targetDir))
{
Directory.CreateDirectory(targetDir);
}
var errorFiles = new List;
var saveDirs = new Dictionary;
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, List>(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;
///

/// 初始化IniHelper
///

/// ini文件保存路徑 /// 默認500 public IniHelper(string path, int? rl = null)
{
this._sPath = path;
this._retLength = rl.HasValue ? rl.Value : _retLength;
}
///

/// 設置Ini配置,默認配置節為Setting
///

/// 鍵名 /// 鍵值 /// 配置節 public void WriteValue(string key, string value, string section = "Setting")
{
// section=配置節,key=鍵名,value=鍵值,path=路徑
WritePrivateProfileString(section, key, value, _sPath);
}
///

/// 根據鍵名節點讀取Ini配置,默認節點為Setting
///

/// 鍵名 /// 配置節 ///
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");

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

vue.js+UEditor集成
JS基本類型和引用類型
Centos操作系統在虛擬機VMware上的安裝
PostgreSQL 使用 PreparedStatement 導致查詢慢的分析

TAG:科技優家 |

您可能感興趣

toString 小技巧
使用chrome的小技巧
PDF與office office 技巧
Spring Cloud實戰小技巧必殺技
Skimming技巧
npj Computational Materials:快速準確預測晶格熱導率的「小技巧」
Python 中查詢 sqlite3 的一些小技巧
Office常用操作技巧
小技巧:Windows 10 Mobile中啟用Microsoft Edge PWA服務
Jupyter Notebook數據科學高效技巧!
【Photoshop的小技巧】
Python 技巧總結
iPhone X的使用技巧
photoshop的六個實用小技巧
PS大神總結的Photoshop常用摳圖技巧
iPhone原生應用技巧Ⅱ:3D touch還有這些冷門技巧!
beautyblender美妝蛋 美妝達人都會的化妝小技巧!
5個CrossFit動作,掌握肌肉鍛煉技巧
數據科學家效率提升必備技巧之Jupyter Notebook篇
比拼脫褲技巧,節奏VR遊戲《Pants Pants Revolution》已推出