C#实现Winform小数字键盘模拟器

目录
  • 一、构建计算器的界面
  • 二、构建控件的开放属性
  • 三、控件键盘输入
  • 四、让文本框处理焦点状态以及光标位置的处理
  • 五、实现退格、清除内容的功能
  • 六、实现Enter确认得到结果的功能

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

一、构建计算器的界面

要构建出一个好看点的计算器界面,还是需要颇费些小心思的,我做这个的时候,也花了两三个小时的时间构建这个界面。

其主要的使用控制是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>
/// 当使用实物键盘输入文本内容时触发
/// </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)));
}

四、让文本框处理焦点状态以及光标位置的处理

光标位置,需要特殊处理的,默认参数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>
/// 当迷你小键盘按下回车时触发事件
/// </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数字键盘模拟器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#中winform实现自动触发鼠标、键盘事件的方法

    程序触发鼠标.键盘事件是C#程序设计中比较常见的功能,本文实例展示了C#中winform实现自动触发鼠标.键盘事件的方法,有不错的实用价值.具体如下: 要想在C#程序中触发鼠标.键盘事件就必须要调用windows函数. 一.鼠标事件的触发 1.引用windows函数mouse_event /// <summary> /// 鼠标事件 /// </summary> /// <param name="flags">事件类型</param> /

  • 解读在C#中winform程序响应键盘事件的详解

    在winform程序中给form添加了keyup事件,但是程序却不响应键盘事件,解决办法是重写Form基类的ProcessCmdKey(ref Message msg, Keys keyData)方法. 复制代码 代码如下: protected override bool ProcessCmdKey(ref Message msg, Keys keyData)        {            if (keyData == Keys.F4)            {            

  • C# winform 模拟键盘输入自动接入访问网络的实例

    背景: 由于所在办公室网络限制,笔者每天都使用网络都要先连接无线网.如下图,输入授权用户信息登录后才能使用WIFI. 丧心病狂的是该网页Cookie 过期时间为24小时,所以每天重复以下动作:打开浏览器 -> 手动输入 工号密码.密码 -> 点击"登录"按钮. 作为一个懒出天际的程序员,逃避这种重复劳动是必须滴~~ 解决方案: 创建一个C# 应用程序,使用WebBrowser控件加载该页面,模拟键盘输入账号.密码,把用户配置分别赋值给两个控件,然后调用按钮的点击事件. 具体

  • C# Winform 实现屏蔽键盘的win和alt+F4的实现代码

    此时希望用户不能通过键盘alt+F4来结束程序及通过Win的组合键对窗口进行操作.我在网上搜索了一下,采用全局键盘钩子的方法可以做到屏蔽用户对键盘的操作..以下为相关代码,用到了Form1_load事件和Form1_FormClosing事件: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing

  • C#实现Winform小数字键盘模拟器

    目录 一.构建计算器的界面 二.构建控件的开放属性 三.控件键盘输入 四.让文本框处理焦点状态以及光标位置的处理 五.实现退格.清除内容的功能 六.实现Enter确认得到结果的功能 文章开始之前,先看一下效果图,看是不是您正所需要的: 一.构建计算器的界面 要构建出一个好看点的计算器界面,还是需要颇费些小心思的,我做这个的时候,也花了两三个小时的时间构建这个界面. 其主要的使用控制是TableLayoutPanel控件. 另外一个小难点则在于内容控件Textbox的显示,要让文字垂直居中,在没有

  • iOS开发之UIKeyboardTypeNumberPad数字键盘自定义按键

    最近做一个搜索用户的功能,这里使用了UISearchBar.由于搜索的方式只有手机号码,所以这里的键盘要限制为数字输入,可以这么做: self.searchBar.keyboardType = UIKeyboardTypeNumberPad;如果使用的不是搜索框而是textField输入框,可以设置textField的键盘属性来展示 self.textField.keyboardType = UIKeyboardTypeNumberPad;监听事件如下所示即可. 但是这里有个问题,就是数字键盘上

  • Android 高仿微信支付数字键盘功能

    现在很多app的支付.输入密码功能,都已经开始使用自定义数字键盘,不仅更加方便.其效果着实精致. 下面带着大家学习下,如何高仿微信的数字键盘,可以拿来直接用在自身的项目中. 先看下效果图: 1. 自定义布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  • Android开发之如何自定义数字键盘详解

    前言 这篇文章是介绍Android中自定义键盘的一些套路,通过定义一个数字键盘为例,本篇的文章语言是基于Kotlin实现的,如果还没有用或者不熟悉该语言的同学,可以自己补习,我之前也写过入门文章. 效果图 github:源码传送门 本地下载:源码传送门 加载键盘存储键属性的XML描述 我们下面的介绍都是依靠上图的实现来展开的,首先是软键盘的布局,我们需要我们的res/xml目录下创建一个xml文件,根节点就是Keyboard,然后就是键盘的每一行Row,每一行中可以指定每一列,也就是具体的键Ke

  • 使用Vue自定义数字键盘组件(体验度极好)

    为了满足用户体验,小编用vue写了一个自定义数字键盘组件,用户体验度还不错. 废话不多说,先上效果图吧~ 效果图 具体实现 布局排版 <div class='key-container'> <div class='key-title'>请输入金额</div> <div class='input-box'>{{ money }}</div> <div class='keyboard' @click.stop='_handleKeyPress'

  • JavaScript实现的可变动态数字键盘控件方式实例代码

    整理文档,搜刮出一个JavaScript实现的可变动态数字键盘控件方式实例代码,稍微整理精简一下做下分享. @sunRainAmazing JavaScript编写和实现的可变动态键盘密码输入控件,可以动态的生产数字键盘并显示,并且可以实现每次点击后密码键盘重新加载,可以手动刷新功能. 第一种方式,点击查看: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&qu

  • IOS数字键盘左下角添加完成按钮的实现方法

    IOS数字键盘左下角添加完成按钮的实现方法 实现代码: - (void)addDoneButtonToNumPadKeyboard { UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; if (systemVersion < 8.0){ doneButton.frame = CGRectMake(0, 163, 106, 53); }else{ doneButton.frame = CGRectMake(0,

  • 原生js制作简单的数字键盘

    一.起因 最近支付的同事说,数字键盘有些问题:在移动设备上有时候比较难出现点(.) 和数字在一起的格局:因此,考虑到这种情况,就建议手写个模拟键盘了.花了一晚上的时间,写了个简单的键盘,基本能用.考虑到有的开发者没有使用juqery,就使用原生的js了. Github地址:https://github.com/vczero/keyboard 二.截图如下 三.体验地址(需要点击input才能弹出数字键盘的哦) URL: http://vczero.github.io/num_key/index.

  • Android 仿微信自定义数字键盘的实现代码

    本文介绍了Android 仿微信自定义数字键盘的实现代码,分享给大家,希望对大家有帮助 最终效果: 实现这个自定义键盘的思路很简单: 要写出一个数字键盘的布局: 与 Edittext 结合使用,对每个按键的点击事件进行处理: 禁用系统软键盘. 有了思路,实现起来就不难了. 1. 实现键盘的 xml 布局 网格样式的布局用 GridView 或者 RecyclerView 都可以实现,其实用 GridView 更方便一些,不过我为了多熟悉 RecyclerView 的用法,这里选择用了 Recyc

  • Android自定义键盘的实现(数字键盘和字母键盘)

    在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 项目地址:https://github.com/xudjx/djkeyboard 键盘效果: 自定义键盘的实现步骤如下: 自定义CustomKeyboard, 继承自系统Keyboard,实现KeyboardView.OnKeyboardActionListener相关接口,以处理用户的点击回调: 自定义CustomKeyboardView, 继承自Key

随机推荐