厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(14)---Winform開發的常用類庫(終結篇,CHM文檔放送)


俗話說,一個好漢十個幫,眾人拾柴火焰高等都說明一個道理,有更多的資源,更豐富的積累,都是助你走向成功,走向頂峰的推動力。

本篇的公用類庫的介紹主題是程序開發中常用到的一些輔助類,在幫助文檔中歸類到其他目錄下面,本篇主要介紹在Winform開發用,常用到的一些類庫,包括Windows服務操作、DOS操作、串口操作、POS打印操作以及一些參加的界面控件的輔助類。

本篇繼續繼續整理優化已有的共用類庫,並繼續發表隨筆介紹公用類庫的接口方法以及詳細使用操作,力求給自己繼續優化,積攢更豐富的公用類庫資源,加深了解的同時,也給大家展現公用類庫好的方面。

厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(13)--- 各種常用的輔助類2

厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(12)--- 網絡相關操作輔助類
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(11)---各種線程相關操作類
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(10)---各種線程同步的集合類

厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(9)----各種常用輔助類
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(8)----非對稱加密、BASE64加密、MD5等常用加密處理
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(7)-----聲音播放、硬件信息、鍵盤模擬及鈎子、鼠標模擬及鈎子等設備相關 
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(6)----全屏截圖、圖標獲取、圖片打印、頁面預覽截屏、圖片復雜操作等
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(5)----熱鍵、多線程、窗體動畫凍結等窗體操作
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(4)----CSV、Excel、INI文件、獨立存儲等文件相關
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(3)----數據庫相關操作
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(2)----常用操作
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(1)----開篇總結

至此,整個厚積薄發的類庫整理也落下帷幕,整個過程歷時一年多,整理優化近兩百多個類庫,幫助說明近兩百個。本篇作為本系列的終結篇,貼出最終的CHM幫助文檔,以及最有的類庫DLL,如果需要進一步了解整個類庫的信息,可以隨時聯系我。

CHM幫助文檔持續更新中,統一下載地址是:  http://www.iqidi.com/download/commonshelp.rar 

最新公用類庫DLL+XML注釋文件下載地址是:http://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar

整個幫助類庫的CHM文件概況如下所示。

1、 Window服務輔助類WinServiceHelper,包括安裝、卸載、啟動、停止、重新啟動、判斷服務是否存在等操作。

本輔助類主要是用來方便實現Window服務的各種操作,包括安裝、卸載、啟動、停止、重新啟動、判斷服務是否存在等操作。 Window服務適用於個各種定時服務,或者數據同步的操作中。

1)輔助類提供的方法接口如下所示:

/// 安裝Windows服務    
/// </summary>    
/// <param name="serviceName">服務名稱</param>    
/// <param name="serviceFileName">服務文件路徑</param>    
/// <returns></returns>    
public static bool InstallService(string serviceName, string serviceFileName)    
   
/// <summary>    
/// 卸載Windows服務    
/// </summary>    
/// <param name="serviceName">服務名稱</param>    
/// <param name="serviceFileName">服務文件路徑</param>    
public static bool UnInstallService(string serviceName, string serviceFileName)    
   
/// <summary>    
/// 另外一種安裝、卸載Windows服務的方法    
/// </summary>    
/// <param name="install">安裝還是卸載,true為安裝,false為卸載</param>    
/// <param name="serviceFileName"></param>    
public static void InstallService2(bool install, string serviceFileName)    
   
/// <summary>    
/// 判斷window服務是否存在    
/// </summary>    
/// <param name="serviceName">window服務名稱</param>    
/// <returns></returns>    
public static bool ServiceIsExisted(string serviceName)    
   
/// <summary>    
/// 等待某種預期的狀態(如運行,停止等)    
/// </summary>    
/// <param name="serviceName">window服務名稱</param>    
/// <param name="status">預期的狀態</param>    
/// <param name="second">如果獲取不到預期的狀態,則等待多少秒</param>    
/// <returns></returns>    
public static bool WaitForStatus(string serviceName, ServiceControllerStatus status, int second)    
   
/// <summary>    
/// 啟動window服務    
/// </summary>    
/// <param name="serviceName"></param>    
public static bool StartService(string serviceName)    
   
/// <summary>    
/// 停止服務    
/// </summary>    
/// <param name="serviseName"></param>    
/// <returns></returns>    
public static bool StopService(string serviseName)    
   
/// <summary>    
/// 修改服務的啟動項 2為自動,3為手動    
/// </summary>    
/// <param name="startType"></param>    
/// <param name="serviceName"></param>    
/// <returns></returns>    
public static bool ChangeServiceStartType(int startType, string serviceName)    
   
/// <summary>    
/// 獲取服務啟動類型 2為自動 3為手動 4 為禁用    
/// </summary>    
/// <param name="serviceName"></param>    
/// <returns></returns>    
public static string GetServiceStartType(string serviceName)    
   
/// <summary>    
/// 驗證服務是否啟動    
/// </summary>    
/// <returns></returns>    
public static bool ServiceIsRunning(string serviceName)   

2)輔助類的使用例子代碼如下所示

private void CheckServcieStatus()    
{    
    string serviceName = this.txtServiceName.Text;    
    bool exist = WinServiceHelper.ServiceIsExisted(serviceName);    
    if (exist)    
    {   
        #region 獲取轉換狀態    
        string startType = WinServiceHelper.GetServiceStartType(serviceName);    
        string startTypeStatus = "";    
        if (startType == "2")    
        {    
            startTypeStatus = "自動";    
        }    
        else if (startType == "3")    
        {    
            startTypeStatus = "手動";    
        }    
        else if (startType == "4")    
        {    
            startTypeStatus = "禁用";    
        }    
        #endregion    
   
        bool running = WinServiceHelper.ServiceIsRunning(serviceName);    
        this.txtServiceStatus.Text = string.Format("啟動類型:{0} 狀態:{1}", startTypeStatus, running ? "正在運行" : "已停止");    
        this.txtServiceStatus.BackColor = Color.FromArgb(255, 255, 192);    
   
        this.btnStartService.Enabled = !running;    
        this.btnStopService.Enabled = running;    
        this.btnReset.Enabled = true;    
        this.btnInstallService.Enabled = false;    
        this.btnUnInstallService.Enabled = true;    
    }    
    else   
    {    
        this.txtServiceStatus.BackColor = Color.Red;    
        this.txtServiceStatus.Text = string.Format("{0} 服務不存在", serviceName);    
        this.btnStartService.Enabled = false;    
        this.btnStopService.Enabled = false;    
        this.btnReset.Enabled = false;    
        this.btnInstallService.Enabled = true;    
        this.btnUnInstallService.Enabled = false;    
    }                
}  

以上代碼摘自我的《 Winform開發框架之通用定時服務管理

2、DOS操作封裝輔助類 DosHelper。

本輔助類主要是用來方便實現DOS操作。DOS操作在自定義安裝數據庫腳本、運行特殊命令、后台注冊控件、操作Windows Service等方面都有用到。在另一個輔助類SqlScriptHelper,就是采用運行DOS命令方式進行Sql腳本的數據庫安裝。

1)輔助類提供的方法接口如下所示

/// <summary>    
/// 后台執行DOS文件    
/// </summary>    
/// <param name="fileName">文件名(包含路徑)</param>    
/// <param name="argument">運行參數</param>    
/// <param name="hidden">是否隱藏窗口</param>    
public static void RunDos(string fileName, string argument, bool hidden)    
   
/// <summary>       
/// 運行指定DOS命令行       
/// </summary>       
/// <param name="fileName">命令</param>       
/// <param name="argument">命令行參數</param>       
/// <param name="hidden">是否隱藏窗口</param>     
/// <param name="confirm">寫入命令行的確認信息</param>       
/// <returns></returns>       
public static string ExecuteCMD(string fileName, string argument, bool hidden, string confirm)    
   
/// <summary>    
/// 同步方式執行DOS命令    
/// </summary>    
/// <param name="command">DOS命令</param>    
public static void ExecuteCommandSync(object command)    
   
/// <summary>    
/// 異步方式執行DOS命令    
/// </summary>    
/// <param name="command">DOS命令字符串</param>    
public static void ExecuteCommandAsync(string command)  

2)輔助類的使用例子代碼如下所示

private void btnInstallService_Click(object sender, EventArgs e)    
{    
    if (CheckInput())    
    {    
        DosHelper.RunDos(servicefile, "-i", false);    
   
        WinServiceHelper.WaitForStatus(this.txtServiceName.Text, ServiceControllerStatus.Running, 10);    
   
        CheckServcieStatus();    
    }    
}    
   
private void btnUnInstallService_Click(object sender, EventArgs e)    
{    
    if (CheckInput())    
    {    
        DosHelper.RunDos(servicefile, "-u", false);    
        Thread.Sleep(1000);    
   
        CheckServcieStatus();    
    }    

以上代碼摘自我的《 Winform開發框架之通用定時服務管理

3、串口開發輔助類 SerialPortUtil

 

一般人可能開發C#相關的項目很多年,不一定會接觸到串口的開發,了解熟悉對硬件串口的開發,串口也不再是什么神秘的東西,利用SerailPort組件,對串口的各種操作也非常的方便,由於本人總是喜歡把一些常用的東西封裝成可供重復利用的類庫,因此,在閱百家代碼,項目積累總結的基礎上,提煉總結優化,把對串口的操作封裝成一個公用的類庫,應付日常的串口編程開發,也算是工作的一個階段性總結吧。

微軟在 .NET FrameWork2.0中對串口通訊進行了封裝,我們可以在.net2.0及以上版本開發時直接使用SerialPort類對串口進行讀寫操作。
 
SerialPort類的屬性主要包括:
    1)串口名稱(PortName) 
    2)波特率(BaudRate)
    3)數據位 DataBits
    4)停止位 StopBits
    5)奇偶校驗 Parity 
 
SerialPort類的事件主要包括:
    DataReceived:用於異步接收串口數據事件

    ErrorReceived:錯誤處理事件

SerialPort類的方法主要包括: 

    Open();Close();Read();Write()、DiscardInBuffer()、DiscardOutBuffer()等

從上面的測試例子圖中,我們可以看到,一般對串口的操作,需要提供串口號、波特率、數據位、停止位、奇偶校驗的參數,用來構造一個串口操作類,以便實現具體的串口操作,而這些參數有的是系統內置的枚舉參數,我們可以通過遍歷枚舉對象來綁定下來列表(如停止位、奇偶校驗);但有些參數卻不是系統內置的枚舉類型,例如波特率、數據位等,而且對這些參數操作也是串口開發經常用到的,因此,第一步,我對這些參數的綁定做了一個簡單的封裝。

1)輔助類的接口代碼如下所示。

    /// <summary>
    /// 串口開發輔助類
    /// </summary>
    public class SerialPortUtil
    {
        /// <summary>
        /// 接收事件是否有效 false表示有效
        /// </summary>
        public bool ReceiveEventFlag = false;
        /// <summary>
        /// 結束符比特
        /// </summary>
        public byte EndByte = 0x23;//string End = "#";

        /// <summary>
        /// 完整協議的記錄處理事件
        /// </summary>
        public event DataReceivedEventHandler DataReceived;
        /// <summary>
        /// 嚴重錯誤事件處理
        /// </summary>
        public event SerialErrorReceivedEventHandler Error;

        /// <summary>
        /// 串口號
        /// </summary>
        public string PortName

        /// <summary>
        /// 波特率
        /// </summary>
        public SerialPortBaudRates BaudRate

        /// <summary>
        /// 奇偶校驗位
        /// </summary>
        public Parity Parity

        /// <summary>
        /// 數據位
        /// </summary>
        public SerialPortDatabits DataBits

        /// <summary>
        /// 停止位
        /// </summary>
        public StopBits StopBits

        #endregion

        #region 構造函數

        /// <summary>
        /// 參數構造函數(使用枚舉參數構造)
        /// </summary>
        /// <param name="baud">波特率</param>
        /// <param name="par">奇偶校驗位</param>
        /// <param name="sBits">停止位</param>
        /// <param name="dBits">數據位</param>
        /// <param name="name">串口號</param>
        public SerialPortUtil(string name, SerialPortBaudRates baud, Parity par, SerialPortDatabits dBits, StopBits sBits)

        /// <summary>
        /// 參數構造函數(使用字符串參數構造)
        /// </summary>
        /// <param name="baud">波特率</param>
        /// <param name="par">奇偶校驗位</param>
        /// <param name="sBits">停止位</param>
        /// <param name="dBits">數據位</param>
        /// <param name="name">串口號</param>
        public SerialPortUtil(string name, string baud, string par, string dBits, string sBits)

        /// <summary>
        /// 默認構造函數
        /// </summary>
        public SerialPortUtil()

        #endregion

        /// <summary>
        /// 端口是否已經打開
        /// </summary>
        public bool IsOpen

        /// <summary>
        /// 打開端口
        /// </summary>
        /// <returns></returns>
        public void OpenPort()

        /// <summary>
        /// 關閉端口
        /// </summary>
        public void ClosePort()

        /// <summary>
        /// 丟棄來自串行驅動程序的接收和發送緩沖區的數據
        /// </summary>
        public void DiscardBuffer()

        #region 數據寫入操作

        /// <summary>
        /// 寫入數據
        /// </summary>
        /// <param name="msg"></param>
        public void WriteData(string msg)

        /// <summary>
        /// 寫入數據
        /// </summary>
        /// <param name="msg">寫入端口的字節數組</param>
        public void WriteData(byte[] msg)

        /// <summary>
        /// 寫入數據
        /// </summary>
        /// <param name="msg">包含要寫入端口的字節數組</param>
        /// <param name="offset">參數從0字節開始的字節偏移量</param>
        /// <param name="count">要寫入的字節數</param>
        public void WriteData(byte[] msg, int offset, int count)

        /// <summary>
        /// 發送串口命令
        /// </summary>
        /// <param name="SendData">發送數據</param>
        /// <param name="ReceiveData">接收數據</param>
        /// <param name="Overtime">重復次數</param>
        /// <returns></returns>
        public int SendCommand(byte[] SendData, ref  byte[] ReceiveData, int Overtime)

        #endregion

        #region 常用的列表數據獲取和綁定操作

        /// <summary>
        /// 封裝獲取串口號列表
        /// </summary>
        /// <returns></returns>
        public static string[] GetPortNames()

        /// <summary>
        /// 設置串口號
        /// </summary>
        /// <param name="obj"></param>
        public static void SetPortNameValues(ComboBox obj)

        /// <summary>
        /// 設置波特率
        /// </summary>
        public static void SetBauRateValues(ComboBox obj)

        /// <summary>
        /// 設置數據位
        /// </summary>
        public static void SetDataBitsValues(ComboBox obj)

        /// <summary>
        /// 設置校驗位列表
        /// </summary>
        public static  void SetParityValues(ComboBox obj)

        /// <summary>
        /// 設置停止位
        /// </summary>
        public static void SetStopBitValues(ComboBox obj)

        #endregion

        /// <summary>
        /// 檢查端口名稱是否存在
        /// </summary>
        /// <param name="port_name"></param>
        /// <returns></returns>
        public static bool Exists(string port_name)

        /// <summary>
        /// 格式化端口相關屬性
        /// </summary>
        /// <param name="port"></param>
        /// <returns></returns>
        public static string Format(SerialPort port)
    }

2)輔助類的使用代碼如下所示。

綁定相應的數據源(包括端口、波特率、數據位、校驗位等等)代碼如下所示,這樣我們在窗體界面代碼中,綁定相關參數的數據源就很方便了,如下所示。

private void Form1_Load(object sender, EventArgs e)    
  {    
      BindData();    
  }    
   
  private void BindData()    
  {    
      //綁定端口號    
      SerialPortUtil.SetPortNameValues(txtPort);    
      txtPort.SelectedIndex = 0;    
   
      //波特率    
      SerialPortUtil.SetBauRateValues(txtBaudRate);    
      txtBaudRate.SelectedText = "57600";    
   
      //數據位    
      SerialPortUtil.SetDataBitsValues(txtDataBits);    
      this.txtDataBits.SelectedText = "8";    
   
      //校驗位    
      SerialPortUtil.SetParityValues(txtParity);    
      this.txtParity.SelectedIndex = 0;    
   
      //停止位    
      SerialPortUtil.SetStopBitValues(txtStopBit);    
      this.txtStopBit.SelectedIndex = 1;    
        
      this.btnSend.Enabled = isOpened;    
  }

輔助類實現連接特定的窗口並處理數據的操作代碼如下所示。

 private void btnConnect_Click(object sender, EventArgs e)    
 {    
     try   
     {    
         if (serial == null)    
         {    
             try   
             {    
                 string portname = this.txtPort.Text;    
                 SerialPortBaudRates rate = (SerialPortBaudRates)Enum.Parse(typeof(SerialPortBaudRates), this.txtBaudRate.Text);//int.Parse(this.txtBaudRate.Text);    
                 SerialPortDatabits databit = (SerialPortDatabits)int.Parse(this.txtDataBits.Text);    
                 Parity party = (Parity)Enum.Parse(typeof(Parity), this.txtParity.Text);    
                 StopBits stopbit = (StopBits)Enum.Parse(typeof(StopBits), this.txtStopBit.Text);    
   
                 //使用枚舉參數構造    
                 //serial = new SerialPortUtil(portname, rate, party, databit, stopbit);    
                     
                 //使用字符串參數構造    
                 serial = new SerialPortUtil(portname, this.txtBaudRate.Text, this.txtParity.Text, this.txtDataBits.Text, this.txtStopBit.Text);    
                 serial.DataReceived += new DataReceivedEventHandler(serial_DataReceived);    
   
             }    
             catch (Exception ex)    
             {    
                 MessageBox.Show(ex.Message);    
                 serial = null;    
                 return;    
             }    
         }    
   
         if (!isOpened)    
         {                        
             serial.OpenPort();    
             btnConnect.Text = "斷開";    
         }    
         else   
         {    
             serial.ClosePort();    
             serial = null;    
   
             btnConnect.Text = "連接";    
         }    
             
         isOpened = !isOpened;    
         this.btnSend.Enabled = isOpened;    
         this.lblTips.Text = isOpened ? "已連接" : "未連接";    
     }    
     catch (Exception ex)    
     {    
         this.lblTips.Text = ex.Message;    
         MessageBox.Show(ex.Message);    
     }    
}  

4、POS打印機操作

本小節包括兩個POS打印類,USB接口方式的POS小票打印的打印預覽管理界面 FrmPosPrintPreview和基於並口接口方式的打印輔助類POSPrinter。

基於USB接口方式的POS小票打印該操作。很多基本上采用了GP5860這種POS打印機進行小票打印了。

執行打印預覽,USB接口方式的小票可以實現效果的預覽,如果是並口的只有直接輸出,沒有預覽效果。

1)USB的POS打印的輔助類FrmPosPrintPreview提供了幾個常用的參數進行配置,代碼如下所示。

/// <summary>    
/// POS小票打印的打印預覽管理界面    
/// </summary>    
public partial class FrmPosPrintPreview : Form    
{    
    /// <summary>    
    /// 設置待打印的內容    
    /// </summary>    
    public string PrintString = "";    
    /// <summary>    
    /// 指定默認的小票打印機名稱,用作快速POS打印    
    /// </summary>    
    public string PrinterName = "GP-5860III";    
   
    /// <summary>    
    /// POS打印機的邊距,默認為2    
    /// </summary>    
    public int POSPageMargin = 2;    
   
    /// <summary>    
    /// POS打印機默認橫向還是縱向,默認設置為縱向(false)    
    /// </summary>    
    public bool Landscape = false;  

2)並口的POS打印輔助類POSPrinter提供了兩個構造函數和一個打印操作,代碼如下。

/// <summary>    
 /// 並口POS打印機操作輔助類    
 /// </summary>    
 public class POSPrinter    
 {    
     /// <summary>    
     /// 默認構造函數,打印並口名稱為LPT1    
     /// </summary>    
     public POSPrinter()    
   
     /// <summary>    
     /// 以指定的並口打印名稱構造函數    
     /// </summary>    
     /// <param name="prnPort">打印並口名稱,如LPT1</param>    
     public POSPrinter(string prnPort)    
   
     /// <summary>    
     /// 打印內容    
     /// </summary>    
     /// <param name="str">待打印的字符串</param>    
     /// <returns></returns>    
     public string PrintLine(string str)  

3)輔助類的使用例子代碼如下所示

private void btnPosPrint_Click(object sender, EventArgs e)    
{    
    if (this.lvwDetail.Items.Count == 0)    
    {    
        MessageUtil.ShowTips("沒有消費記錄");    
        return;    
    }    
   
    StringBuilder sb = new StringBuilder();    
    sb.AppendFormat("{0}\r\n\r\n", Portal.gc.gAppUnit);    
    sb.AppendFormat("客房消費\r\n");    
    sb.AppendFormat("結賬單號:{0}\r\n", this.lblCheckOutNo.Text);    
    sb.AppendFormat("客戶姓名:{0}\r\n", this.txtName.Text);    
    sb.AppendFormat("結賬客房:{0}\r\n", RoomInfo.RoomNo);    
    sb.AppendFormat("打印時間:{0}\r\n\r\n", DateTime.Now);    
   
    sb.AppendFormat("項目     單價  數量  金額\r\n");    
    for (int i = 0; i < lvwDetail.Items.Count; i++)    
    {    
        ListViewItem item = lvwDetail.Items[i];    
        string itemName = item.SubItems[1].Text;    
        if (itemName.Contains("買斷消費"))    
        {    
            itemName = "買斷消費";    
        }    
        sb.AppendFormat("{0}", itemName);    
        sb.AppendFormat(" {0}", item.SubItems[2].Text);    
        sb.AppendFormat(" {0}", item.SubItems[6].Text);    
        sb.AppendFormat(" {0}\r\n", item.SubItems[7].Text);    
    }    
    sb.AppendFormat("\r\n\r");    
    sb.AppendFormat("總 金 額:{0}\r\n", Convert.ToDecimal(this.lblConsume.Tag).ToString("C2"));    
    sb.AppendFormat("實收金額:{0}\r\n", Convert.ToDecimal(this.txtAmount.Text).ToString("C2"));    
    sb.AppendFormat("實收大寫:{0}\r\n", RMBUtil.CmycurD(this.txtAmount.Text));    
    sb.AppendFormat("現    金:{0}\r\n", Convert.ToDecimal(this.txtPay.Text).ToString("C2"));    
    sb.AppendFormat("找    零:{0}\r\n", Convert.ToDecimal(this.lblChange.Text).ToString("C2"));    
    sb.AppendFormat("\r\n\r");    
   
    Portal.gc.PosPrint(sb.ToString());    
}  
/// <summary>    
/// 提供通用的POS打印函數    
/// </summary>    
public void PosPrint(string printString)    
{    
    bool useUSB = SystemConfig.Default.IsUSBPOSPrinter;    
    if (!useUSB)    
    {    
        if (MessageUtil.ShowYesNoAndTips("您是否確定進行POS打印?") == DialogResult.No)    
        {    
            return;    
        }    
        POSPrinter print = new POSPrinter(SystemConfig.Default.PosPrintPort);    
        string error = print.PrintLine(printString);    
        if (error != "")    
        {    
            MessageUtil.ShowError(error);    
        }    
    }    
    else   
    {    
        FrmPosPrintPreview dlg = new FrmPosPrintPreview();    
        printString = "\r\n\r\n\r\n\r\n" + printString;    
        printString += string.Format("\r\n簽單金額:\r\n");    
        printString += string.Format("\r\n簽單單位:\r\n");    
        printString += string.Format("\r\n簽 單 人:\r\n");    
        dlg.PrintString = printString;    
        dlg.ShowDialog();    
    }    
}  

5、玻璃效果圖片按鈕控件 VistaButton

本輔助類主要是用來方便實現美觀的圖片按鈕,類似玻璃效果的那種,圖片放上去可以帶有動態陰影效果。 這個是一個Vista樣式的控件,其代碼是在Codeproject上有的:http://www.codeproject.com/KB/buttons/VistaButton.aspx 

Screenshot - Screenshot.jpg

通過改變其顏色,就可以實現不同的效果,而且鼠標靠近或者離開都有特殊的效果,比較酷。例如我加上顏色圖片后,得到的效果如下所示:

 

使用說明:

在VS工具箱里面添加該共用類庫的程序集應用,然后添加VistaButton控件的使用即可。
可以在窗體的可視化設計界面中,編輯控件的背景色等圖片效果,實現更多美妙的特效。
該控件屬於界面控件,直接拖動到界面即可使用。

6、TreeView的包裝類,實現樹的DragDrop拖拉的操作的輔助類 TreeViewDrager 

1)輔助類提供的方法接口如下所示:

public class TreeViewDrager    
{    
    /// <summary>    
    /// 設置拖動樹的時候,顯示的圖片,顯示其中第一個    
    /// </summary>    
    public ImageList TreeImageList    
   
    /// <summary>    
    /// 默認構造函數    
    /// </summary>    
    public TreeViewDrager()    
   
    /// <summary>    
    /// 參數構造函數,設置操作的TreeView    
    /// </summary>    
    /// <param name="treeView"></param>    
    public TreeViewDrager(TreeView treeView)    
   
    /// <summary>    
    /// 處理拖動節點后的事件    
    /// </summary>    
    public event ProcessDragNodeEventHandler ProcessDragNode;    
}  

2)輔助類的使用例子代碼如下所示

private void Init()    
{    
    TreeViewDrager treeViewDrager = new TreeViewDrager(this.treeView1);    
    treeViewDrager.TreeImageList = this.imageList1;//不設置這個也可以,只是拖動的時候沒圖標。    
    treeViewDrager.ProcessDragNode += new ProcessDragNodeEventHandler(treeViewDrager_ProcessDragNode);    
}    
   
private bool treeViewDrager_ProcessDragNode(TreeNode from, TreeNode to)    
{    
    //這里根據from/to兩個節點記錄的信息去進行數據庫持久化的工作。    
    //根據持久化的結果決定節點是否會最終實現拖動操作。    
    return true;    
}  

實際上,我們需要處理拖動后的事件,一般來說,我們需要調整他們的父目錄就可以了,如我的通用字典管理模塊,就是利用這個控件實現拖動效果。

public FrmDictionary()    
{    
    InitializeComponent();    
   
    TreeViewDrager drager = new TreeViewDrager(this.treeView1);    
    drager.TreeImageList = this.imageList1;    
    drager.ProcessDragNode += new ProcessDragNodeEventHandler(drager_ProcessDragNode);    
}    
   
bool drager_ProcessDragNode(TreeNode dragNode, TreeNode dropNode)    
{    
    if (dragNode != null && dragNode.Text == "數據字典管理")    
        return false;    
   
    if (dropNode != null && dropNode.Tag != null)    
    {    
        string dropTypeId = dropNode.Tag.ToString();    
        string dragTypeId = dragNode.Tag.ToString();    
        //MessageUtil.ShowTips(string.Format("dropTypeId:{0} dragTypeId:{1}", dropTypeId, drageTypeId));    
   
        try   
        {    
            DictTypeInfo dragTypeInfo = BLLFactory<DictType>.Instance.FindByID(dragTypeId);    
            if (dragTypeInfo != null)    
            {    
                dragTypeInfo.PID = dropTypeId;    
                BLLFactory<DictType>.Instance.Update(dragTypeInfo, dragTypeInfo.ID);    
            }    
        }    
        catch (Exception ex)    
        {    
            LogHelper.Error(ex);    
            MessageUtil.ShowError(ex.Message);    
            return false;    
        }    
    }    
    return true;    
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM