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

一、构建计算器的界面

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

其主要的使用控制是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();
}

最后附上源码下载:MiniKeyboard.Designer.zip-互联网文档类资源-CSDN下载

祝您用餐愉快

C# 提供一个Winform小数字键盘模拟器相关推荐

  1. 触摸板用不了,计算机数字键盘如何用,电脑小数字键盘不能使用的原因和解决方法

    触摸板用不了 去看看是不是没有触摸板的驱动,没有去官网下载一个对应电脑版本的,我的是看本人教程去下了半天驱动安装重启后,键盘和触摸板都不能用了-->卸载安装的驱动--再重启,一切貌似恢复正常,过 ...

  2. 联想小新Pro16,右侧小数字键盘启用不了【快速解决】

    开头必须先放解决方案:详细截图如下 Step:win键→设置→辅助功能→鼠标键(直接关闭即可) 此时,若Numlock键灯亮的情况,就可以正常使用数字键盘了(前提:键盘是正常的)!!! 点击[设置], ...

  3. visual studio 设计第一个WinForm小程序

    WinForm小程序之消息框 首先打开visual studio 软件,然后[文件]-[新建]-[项目]-[Visual C#]-[Windows],选择Windows窗体应用程序,根据自己的需要修改 ...

  4. 如何为我们的应用程序提供一个更小、更快的视频通话库

    正文字数:2848  阅读时长:4分钟 在研究如何使视频通话在未来更高效,更易于扩展时,Facebook意识到,最好的方法是从头开始重新设计库并重写整个库,也就是Rsys. 作者 / Ishan Kh ...

  5. 笔记本开机默认关闭小数字键盘

    1.BIOS法 F8系列的机器有些是可以直接用BIOS设置的开机按Del,进入BIOS设置, 找到"Boot UP NumLock Status"(启动数字键状态),只要将&quo ...

  6. QQ空间日志抓器---我的第一个winform小应用(多线程,附源码)

    http://www.cnblogs.com/think_fish/archive/2011/06/09/2076836.html (好几个博友都提到了假死的问题,可能是我之前测试的环境网络状态良好, ...

  7. 测试用例怎么写?这里提供一个测试用例小模板

    文章目录 模板 怎么写用例? 模板 用例编号 测试模块 用例名称(测试项目) 前置条件 操作步骤 预期结果 测试结果 重要程度 更新时间 测试人员 能否接口自动化 能否 UI 自动化 备注信息 项目代 ...

  8. mac数字键盘错乱_苹果手机数字键盘 苹果电脑键盘打不出数字解决办法

    苹果电脑跟苹果手机一样,是电子设备中的佼佼者.但也因为其好看的外表和出色的性能受到很多人的喜爱.那么苹果电脑键盘打不出数字解决办法有什么呢?下面就让afU123小编来告诉大家吧,欢迎阅读. 进行基本设 ...

  9. mac数字键盘错乱_苹果笔记本数字键盘打不出数字怎么办_苹果笔记本按不出数字如何解决-win7之家...

    苹果笔记本是款深受用户们喜欢的电脑,独特的个性个强大的功能深受用户们喜欢,不过近日有用户在使用苹果笔记本的时候,发现数字键盘打不出数字,这让用户们很是困扰,该怎么办呢,针对这个问题,本文就告诉大家苹果 ...

最新文章

  1. Java项目:CRM客户管理系统(java+SSM+jsp+mysql+maven)
  2. 十九种损失函数,你能认识几个?
  3. 收藏 | 2018年AI三大顶会中国学术成果全链接(附视频、PPT、论文)
  4. Qt学习五 - 对话框
  5. HJ37 统计每个月兔子的总数
  6. 各国家分析之 古埃及非洲经济
  7. python从字符串中提取数字_filter
  8. 【线上分享】安防视频上云趋势、痛点,华为云视频接入服务探索及实践
  9. Android 6.0 源代码编译实践
  10. 【Java】探究自增运算符++的原理
  11. [转]项目方面的做人处事
  12. 编程基础C——常量,变量,运算符个人总结
  13. spring基础知识总结
  14. 树莓派之Ubuntu安装远程桌面
  15. 生物信息学主要研究方向
  16. GPS NAME0183 详解
  17. Linux C/C++编程之(十六)进程及进程控制
  18. 【PR】PR剪辑视频编辑软件视频去字幕
  19. DynamoDB 如何做in查询
  20. 如何使用GoldWave中文版进行声道分离?

热门文章

  1. 电脑旧电脑,旧电脑怎么升级 旧电脑升级方法【详细步骤】
  2. 考试驾照驾校软件自己测试软件
  3. 苹果原壁纸高清_手机壁纸 | 高清风景全面屏壁纸
  4. JpGraph生成图表
  5. 每秒100W请求,携程如何支撑十一假期,抢票系统的?
  6. Powershell 脚本创建 iso 映像文件
  7. 人事文件签署单调、重复、繁重?君子签电子合同提升HR工作质效
  8. 惠普微型计算机型号,惠普笔记本所有型号以及简介【图文】
  9. 物联网APP:使用android studio实现阿里云物联网平台数字签名(Signature)(附源代码)
  10. Web前端设计开发规范