1.初衷

主要是想设计一个自带添加工具按钮和按钮的快捷键的基窗体。这样以后所设计的窗体只要继承自这个窗体就可以实现热键响应和动态加工具按钮的功能了

写这边文章主要是为了以后使用的时候有个参考,因为这只是个demo,长时间不用总会忘记的。到时候可以翻看,同时也可以给博友借鉴。接下来,我详细说明这个窗体如何设计的

2.设计步骤

I.新建一个winform项目,此时默认自带form1窗体,放置一个toolstrip工具控件

II.引用程序集rabbit.core.dll,也就是我封装好的热键响应帮助类啦

点我下载

III.form1.cs文件代码如下

  1. using Rabbit.Core.HotKey;
  2. using Rabbit.UI;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12.  
  13. namespace HotKeyBindDemo
  14. {
  15. public partial class Form1 : Form
  16. {
  17. //存储所有注册后的热键
  18. Dictionary<int, ToolStripAndEvent> HotKeyDict = new Dictionary<int, ToolStripAndEvent>();
  19.  
  20. public Form1()
  21. {
  22. InitializeComponent();
  23. }
  24.  
  25. //窗体激活的时候,注册热键
  26. private void Form1_Activated(object sender, EventArgs e)
  27. {
  28.  
  29. }
  30.  
  31. //窗体失活时撤销热键
  32. private void Form1_Deactivate(object sender, EventArgs e)
  33. {
  34. keyBindHelper.UnregisterHotKey(this, );
  35. keyBindHelper.UnregisterHotKey(this, );
  36. }
  37.  
  38. /// <summary>
  39. /// 对工具栏增加一个按钮
  40. /// </summary>
  41. /// <param name="Caption">按钮标题</param>
  42. /// <param name="image">图案</param>
  43. /// <param name="ClickEvent">被按下的事件</param>
  44. /// <param name="Hotkey">快捷键</param>
  45. public ToolStripButton AddComandButton(string Caption, Image image, EventHandler ClickEvent, int Hotkey)
  46. {
  47.  
  48. ToolStripButton AddButton = new ToolStripButton(Caption, image, ClickEvent);
  49. try
  50. {
  51. AddButton.ImageTransparentColor = Color.Magenta;
  52. AddButton.Size = new System.Drawing.Size(, );
  53. AddButton.TextImageRelation = TextImageRelation.ImageAboveText;
  54. ToolStripAndEvent toolStripAndEvent = new ToolStripAndEvent()
  55. {
  56. BeClickEvent = ClickEvent,
  57. TargetButton = AddButton,
  58. };
  59. CommandtoolStrip.Items.Add(AddButton);
  60. HotKeyDict.Add(Hotkey, toolStripAndEvent);
  61.  
  62. }
  63. catch (Exception)
  64. {
  65.  
  66. }
  67. return AddButton;
  68.  
  69. }
  70.  
  71. /// <summary>
  72. /// window一个消息机制,会不停的循环执行该函数,一旦按下了快捷键,就会被捕捉
  73. /// </summary>
  74. /// <param name="m"></param>
  75. protected override void WndProc(ref Message m)
  76. {
  77. base.WndProc(ref m);
  78. if (m.Msg == keyBindHelper.WM_HOTKEY)//一旦按下了快捷键,那么当前消息就是热键相应,被匹配,进入if遇见内部
  79. {
  80. int id = m.WParam.ToInt32();
  81. keyBindHelper.HotKeyOperation(HotKeyDict, id);//响应id对应的点击事件
  82. }
  83. }
  84.  
  85. private void Form1_Load(object sender, EventArgs e)
  86. {
  87. #region 注册热键,其实就是F1与11绑定,F2与12绑定
  88. keyBindHelper.RegisterHotKey(this, , keyBindHelper.KeyModifiers.None, Keys.F1);//F1绑定了11
  89. keyBindHelper.RegisterHotKey(this, , keyBindHelper.KeyModifiers.None, Keys.F2);//F2绑定了12
  90. #endregion
  91.  
  92. #region 工具栏保存按钮点击事件与11绑定,打印单击事件与12绑定
  93. AddComandButton("保存(F1)", Rabbit.Core.Properties.Resources.保存, save_click, );//11绑定了save_click
  94. AddComandButton("打印(F2)", Rabbit.Core.Properties.Resources.打印, Print_click, );//12绑定了Print_click
  95. #endregion
  96.  
  97. //总结:这样按下F1时,F1会去匹配11这个数字,然后11去匹配了save_click这个事件然后响应这个事件
  98.  
  99. }
  100. //保存功能
  101. private void save_click(object sender, EventArgs e)
  102. {
  103. MessageBox.Show("保存功能被响应!");
  104. }
  105.  
  106. //打印功能
  107. private void Print_click(object sender, EventArgs e)
  108. {
  109. MessageBox.Show("打印功能被响应!");
  110. }
  111.  
  112. //关闭窗体注销热键
  113. private void Form1_FormClosed(object sender, FormClosedEventArgs e)
  114. {
  115. Form1_Deactivate(null, null);
  116. }
  117.  
  118. }
  119. }

慢慢看,注释写的很清楚,相信你能大致明白怎么使用

IV.运行效果如下

V.总结

简单数一下原理吧,要想实现热键响应,首先得注册热键,然后绑定事件,即热键-》id=》事件,这样消息机制就会捕捉到这样一个流程。

VI.关于

欢迎不是很明白的博友可以留言交流。我的qq:739462304

设计winform自带动态加载工具按钮和实现热键响应的更多相关文章

  1. C#自定义控件、用户控件、动态加载菜单按钮

    一.效果图,动态加载5个菜单按钮: 二.实现方法 1.创建用户控件 2.在用户控件拖入toolStrip 3.进入用户控件的Lood事件,这里自动添加5个选  ToolStripMenuItem,后期 ...

  2. 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载

    在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...

  3. C#动态加载树菜单

    在做权限系统的时候,需要有一个树形的菜单.下图就是一个树形菜单的样式 但问题是,我们可以实现写死的树形菜单.什么是写死的?就是在前台代码中写好要加载的树形菜单是什么样子的.但是我们权限系统的要求是动态 ...

  4. Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载

    在前面介绍的几篇关于CRM系统的开发随笔中,里面都整合了多个页面的功能,包括多文档界面,以及客户相关信息的页面展示,这个模块就是利用DevExpress控件的XtraTabPage控件的动态加载实现的 ...

  5. 动态加载与插件系统的初步实现(3):WinForm示例

    动态加载与插件系统的初步实现(三):WinForm示例 代码文件在此Download,本文章围绕前文所述默认AppDomain.插件容器AppDomain两个域及IPlugin.PluginProvi ...

  6. 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题

    继上一篇 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进.后 ...

  7. SpringBoot自带热加载开发工具

    SpringBoot自带热加载开发工具 maven配置: <!-- SpringBoot自带热加载开发工具 --> <dependency> <groupId>or ...

  8. Xib设计UITableViewCell然后动态加载

    转自: http://www.2cto.com/kf/201202/120764.html (注:环境Mac OS X Lion 10.7.3 + Xcode 4.2.1 + iOS SDK 5.0. ...

  9. Win8 Metro动态加载内容框架

    制作背景 为了参加ImagineCup 2013 世界公民类比赛,我们设计制作了一个可动态扩展的幼教类App.这个App需要能动态加载内容,内容包括带动画可交互的电子书,动画,视频,游戏. 技术支持 ...

随机推荐

  1. day1作业--三级菜单

    作业概述: 写一个三级菜单 实现如下功能: (1)可依次选择进入各子菜单 (2)在每一级按“b”都可以返回上一级,按“q"都可以退出 流程图: readme: 简介: three_menu. ...

  2. Spark Netty与Jetty (源码阅读十一)

    spark呢,对Netty API又做了一层封装,那么Netty是什么呢~是个鬼.它基于NIO的服务端客户端框架,具体不再说了,下面开始. 创建了一个线程工厂,生成的线程都给定一个前缀名. 像一般的n ...

  3. js多文件上传

    一.HTML 选择文件的时候可以选择多个文件,这个需要我们在input file 里面加入一个属性multiple="multiple" 这样就可以框选文件了 <!DOCTY ...

  4. (document).height()与$(window).height()

    jQuery(window).height()代表了当前可见区域的大小,而jQuery(document).height()则代表了整个文档的高度,可视具体情况使用. 注意当浏览器窗口大小改变时(如最 ...

  5. Stanford NLP 学习笔记2:文本处理基础(text processing)

    I. 正则表达式(regular expression) 正则表达式是专门处理文本字符串的正式语言(这个是基础中的基础,就不再详细叙述,不了解的可以看这里). ^(在字符前): 负选择,匹配除括号以外 ...

  6. U-Boot GOT表分析和u-boot.lds解读

    转自:http://blog.sina.com.cn/s/blog_70dd16910100zab6.html u-boot-2010.09/arch/powerpc/cpu/mpc86xx/star ...

  7. insertAdjacentHTML方法示例

    添加HTML内容与文本内容以前用的是innerHTML与innerText方法,最近发现还有insertAdjacentHTML和insertAdjacentText方法,这两个方法更灵活,可以在指定 ...

  8. eclipse下的webservice开发

    关于eclipse下的webservice开发,有非常多的教程,这里只记下学习过程中的弯路: 1.无论是CXF模式还是AXIS模式,在出现start server之后,点击next报错:"s ...

  9. 欧洲宇航局(ESA)的协同设计室(CDF)

    官方网站:http://www.esa.int/SPECIALS/CDF/

  10. GCC的gcc和g++区别

    看的Linux公社的一篇文章,觉得不错,内容复制过来了. 其实在这之前,我一直以为gcc和g++是一个东西,只是有两个不同的名字而已,今天在linux下编译一个c代码时出现了错误才找了一下gcc和g+ ...