亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實現Winform小數字鍵盤模擬器

 更新時間:2021年11月14日 15:57:37   作者:中洲少年  
本文主要介紹了C#實現Winform小數字鍵盤模擬器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

文章開始之前,先看一下效果圖,看是不是您正所需要的:

一、構建計算器的界面

要構建出一個好看點的計算器界面,還是需要頗費些小心思的,我做這個的時候,也花了兩三個小時的時間構建這個界面。

其主要的使用控制是TableLayoutPanel控件。

另外一個小難點則在于內容控件Textbox的顯示,要讓文字垂直居中,在沒有重寫Textbox控件的情況下要達到這個效果,也是花了些小心思。

其它的界面則沒有什么的。至于加減號嘛,則用輸入法的特殊符號即可。

二、構建控件的開放屬性

一共開放了3個屬性,不夠自己加。這3個如下,看注釋應該能懂:

/// <summary>
/// 可接受的最小值,最小為-3.402823E+38
/// </summary>
[Browsable(true)]
[Category("Zhongzhou")]
[DefaultValue(0)]
[Description("可接受的最小值,最小為-3.402823E+38")]
public float Min { get; set; } = 0;
 
/// <summary>
/// 可接受的最大值,最大為3.402823E+38
/// </summary>
[Browsable(true)]
[Category("Zhongzhou")]
[DefaultValue(0)]
[Description("可接受的最大值,最大為3.402823E+38")]
public float Max { get; set; } = 0;
 
/// <summary>
/// 設置小數點的精度位數,默認為2位小數點
/// </summary>
[Browsable(true)]
[Category("Zhongzhou")]
[DefaultValue(2)]
[Description("設置小數點的精度位數,默認為2位小數點")]
public int Precision { get; set; } = 2;

三、控件鍵盤輸入

我們的目的是讓小鍵盤來輸入數字,所以需要禁止實體鍵盤輸入文字字母等信息,以及小數字點最多只能出現一次,具體邏輯如下:

/// <summary>
/// 當使用實物鍵盤輸入文本內容時觸發(fā)
/// </summary>
/// <param name="e"></param>
private void OnKeyPressed(KeyPressEventArgs e)
{
    //13表示回車
    if (e.KeyChar == 13)
    {
        this.OnEntered();
        e.Handled = true;
        return;
    }
    //48代表0,57代表9,8代表空格,46代表小數點
    if ((e.KeyChar < 48 || e.KeyChar >= 57) && (e.KeyChar != 8) && (e.KeyChar != 46))
    {
        e.Handled = true;
        return;
    }
 
    //判斷多次輸入小數點,僅允許出現1次小數點
    if (e.KeyChar == 46)
    {
        this.PointHandle();
        this.SetContentFocus();
        e.Handled = true;
        return;
    }
}
 
/// <summary>
/// 處理小數點
/// </summary>
/// <returns><see langword="true"/>表示處理成功,<see langword="false"/>表示未處理</returns>
private bool PointHandle()
{
    string content = this.ContentTextBox.Text;
    if (content.IndexOf('.') != -1)
    {
        return false;
    }
 
    if (string.IsNullOrEmpty(content))
    {
        this.SetContent("0.");
        return true;
    }
 
    //取光標位置
    int index = this.ContentTextBox.SelectionStart;
    string str = this.ContentTextBox.Text.Substring(0, index);
    if (str == "+" || str == "-")
    {
        return this.SetContent(string.Join(string.Empty, str, "0.", this.ContentTextBox.Text.Substring(index, this.ContentTextBox.Text.Length - index)));
    }
 
    return this.SetContent(string.Join(string.Empty, str, ".", this.ContentTextBox.Text.Substring(index, this.ContentTextBox.Text.Length - index)));
}

四、讓文本框處理焦點狀態(tài)以及光標位置的處理

光標位置,需要特殊處理的,默認參數cursorPosition=-1時,光標位置始終移到最末尾處。但是有些情況,比如你要讓光標在數字中間刪除幾個數字或者添加幾個數字,就不能讓光標自動跑到最末尾處了。

/// <summary>
/// 設置新值
/// </summary>
/// <param name="newContent">表示新值</param>
private bool SetContent(string newContent)
{
    int precision = this.Precision;
 
    if (string.IsNullOrEmpty(newContent))
    {
        this.ContentTextBox.Text = string.Empty;
        return true;
    }
 
    var scheme = newContent.Split('.');
    if (scheme.Length == 2)
    {
        var realPrecision = scheme[1].Length;
        if (realPrecision > precision)
        {
            return false;
        }
    }
 
    this.ContentTextBox.Text = newContent;
    return true;
}

五、實現退格、清除內容的功能

 
/// <summary>
/// 清除內容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ClearButton_Click(object sender, EventArgs e)
{
    this.SetContent(string.Empty);
    this.SetContentFocus();
}
 
/// <summary>
/// 退格內容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BackButton_Click(object sender, EventArgs e)
{
    //取光標位置
    int index = this.ContentTextBox.SelectionStart;
    //剪切內容
    string cutStr = this.ContentTextBox.Text.Substring(0, index);
    //剩余內容
    string remainStr = this.ContentTextBox.Text.Substring(index, this.ContentTextBox.Text.Length - index);
    int position = this.SetContent(string.Join(string.Empty, cutStr.Substring(0, cutStr.Length - 1), remainStr)) ? index - 1 : index;
    this.SetContentFocus(position);
}

六、實現Enter確認得到結果的功能

原理是通過事件來實現的。代碼如下:

/// <summary>
/// 當按下回車按鈕時的事件委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void EnteredEventHandler(object sender, float e);
 
/// <summary>
/// 當按下回車按鈕時的事件
/// </summary>
public event EnteredEventHandler Entered;
 
/// <summary>
/// 當迷你小鍵盤按下回車時觸發(fā)事件
/// </summary>
protected virtual void OnEntered()
{
    float min = this.Min;
    float max = this.Max;
    var value = string.IsNullOrEmpty(this.ContentTextBox.Text) ? 0 : Convert.ToSingle(this.ContentTextBox.Text);
    if (max != 0 && value > max)
    {
        MessageBox.Show("值不在最大范圍內", "提示");
        return;
    }
    if (min != 0 && value < min)
    {
        MessageBox.Show("值不在最小范圍內", "提示");
        return;
    }
 
    this.Entered?.Invoke(this, value);
}
 
/// <inheritdoc cref="OnEntered"/>
private void EnterButton_Click(object sender, EventArgs e)
{
    this.OnEntered();
    this.SetContentFocus();
}

到此這篇關于C#實現Winform小數字鍵盤模擬器的文章就介紹到這了,更多相關C# Winform數字鍵盤模擬器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#中的委托數據類型簡介

    C#中的委托數據類型簡介

    委托是一個類型安全的對象,它指向程序中另一個以后會被調用的方法(或多個方法)。通過本文給大家介紹C#中的委托數據類型簡介,對c委托類型相關知識感興趣的朋友一起學習吧
    2016-03-03
  • .net中常用的正則表達式

    .net中常用的正則表達式

    這篇文章介紹了.net中常用的正則表達式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 在C#的類或結構中重寫ToString方法的用法簡介

    在C#的類或結構中重寫ToString方法的用法簡介

    這篇文章主要介紹了在C#的類或結構中重寫ToString方法的用法簡介,需要的朋友可以參考下
    2016-01-01
  • C# ConfigHelper 輔助類介紹

    C# ConfigHelper 輔助類介紹

    ConfigHelper(包含AppConfig和WebConfig), app.config和web.config的[appSettings]和[connectionStrings]節(jié)點進行新增、修改、刪除和讀取相關的操作。
    2013-04-04
  • 互斥量mutex的簡單使用(實例講解)

    互斥量mutex的簡單使用(實例講解)

    本篇文章主要是對互斥量mutex的簡單使用進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#字符串和Acsii碼相互轉換

    C#字符串和Acsii碼相互轉換

    本文主要介紹了C#字符串和Acsii碼相互轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • c#中分割字符串的幾種方法

    c#中分割字符串的幾種方法

    c#中分割字符串的幾種方法...
    2007-04-04
  • c#實現斷點續(xù)傳功能示例分享

    c#實現斷點續(xù)傳功能示例分享

    這篇文章主要介紹了c#實現的斷點續(xù)傳功能示例,斷點續(xù)傳就是在上一次下載時斷開的位置開始繼續(xù)下載。在HTTP協議中,可以在請求報文頭中加入Range段,來表示客戶機希望從何處繼續(xù)下載,下面是示例,需要的朋友可以參考下
    2014-03-03
  • C#校驗時間格式的場景分析

    C#校驗時間格式的場景分析

    本文通過場景分析給大家講解C#里如何簡單的校驗時間格式,本次的場景屬于比較常見的收單API,對第三方的訂單進行簽名驗證,然后持久化到數據庫,需要的朋友跟隨小編一起看看吧
    2022-08-08
  • C#中async/await之線程上下文工作原理

    C#中async/await之線程上下文工作原理

    這篇文章主要為大家介紹了C#中async/await之線程上下文工作原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2023-05-05

最新評論