第3讲事件和用户交互
本章介绍LabWmdows/CVI中面板和控件事件的概念、分类和功能,以及如何将鼠标集成到应用程序中去,并且简要介绍了控件响应函数的构成和功能。学习完本章的内容,读者可以深入理解LabWindows/CVI编程的结构并且能更为熟练地应用LabWindows/CVI面板和控件的事件.
3.1.1理解事件(什么叫事件)
LabWindows/CVI应用程序是以事件的方式驱动的。这是理解LabWindows/CVI 编程的基础,可以帮助用户理解程序的整个运行机制。
LabWindows/CVI中的事件可以是以下三种情况:
?外界用户操作引起的事件?(最常见的有鼠标点击、键盘按键等)。
操作系统发送的消息?(例如时钟信号等)。
应用程序之间的相互发送消息或者程序本身向自己发送的消息在LabWindows/CVI中用回调函数来对发生的事件作出响应,。
也就是说在事件发生后执行相应的回调函数中的语句
LabWndows/CVI和许多Windows下可视化编程软件一样,都是以事件和事件驱动为基础的。“事件驱动”的意思是说只有在事件发生时,程序才会运行。在没有事件发生时,整个程序是处于停滞状态的。
。
而事件本身在程序设计中是非常常见的。在LabWindows/CVI中,面板的移动、缩放、关闭、控件的单击、双击等等都是事件。
3.1.2面板事件
LabWndows/CVI中的面板事件是指对激活面板的操作而产生的事件。面板事件包括以下类型,如表3.1所示。
控件事件和面板事件非常类似,除EVENT_CLOSE 、EVENT_PANEL_SIZE 和 EVENT_PANEL_MOVE
三种事件外,控件还具有其他各种面板事件。面板所具有的事件在控件中都适用。另外,某些控件具有如表3-2所示的几种事件。 3.1.4 用户事件及其意义
1. EVENT_CLOSE
应用于面板对象。当用户从系统菜单执行关闭命令或点击窗口右上角的关闭按钮时产生此事件。
回调函数中的事件数据无意义。
2. EVENT_COMMIT
应用于菜单、数值控件、颜色选择数值控件(color numeric )、数值滑动条(numericslide )、字符串、文本框、命令按钮、图形按钮(picture button )、文本按钮(text button )、单选控件(radio button )、指示灯(LED )、二值开关、下拉列表(ring )、滑动列表(ring slide )、图片列表(picture ring )、列表框、曲线图和表格控件。
当用户在界面上提交一项操作时会产生此事件,如选择菜单项或在输入框中输入数值后按
当选择菜单项产生 COMMIT 事件时,传递给主回调函数的事件数据
eventData1 为产生事件的面板或菜单条的标识,eventData2 为被选择的菜单项的回调函数产生的数据(callbackData )。控件回调函数和主回调函数的关系将在下一节介绍。
当表格控件产生 COMMIT 事件时,事件数据eventData1 为产生事件的表格单元的行号,eventData2 为列号。如果事件涉及了多个表格单元,例如对多个单元排序或粘贴数据,eventData1 和eventData2 都会是0。
3. EVENT_DISCARD
应用于面板和各种控件。
当面板或控件被从内存中放弃的时候产生此事件。
回调函数中的事件数据无意义。
4. EVENT_END_TASK
当windows 要退出程序时,LabWindows/CVI 将此事件传递给主回调函数。忽略此事件可以避免windows 退出程序。
回调函数中的事件数据无意义。
5. EVENT_GOT_FOCUS
应用于面板、数值控件、颜色选择数值控件、数值滑动条、字符串、文本框、命令按钮、图形按钮、双值按钮、文本按钮、单选控件、指示灯、二值开关、下拉列表、滑动列表、图形列表、列表框、曲线图、画布和表格控件。
当控件并非当前激活控件(active control),而用户通过鼠标点击、按
6. EVENT_IDLE
只要LabWindows/CVI 处理事件,这个事件就会定期传递给主回调函数,可以通过SetIdleEventRate 函数设定此事件产生的频率。这个事件已经废弃,建议使用定时器控件。
回调函数中的事件数据无意义。
7. EVENT_KEYPRESS
应用于面板、数值控件、颜色选择数值控件、数值滑动条、字符串、文本框、命令按钮、图形按钮、双值按钮、文本按钮、单选控件、指示灯、二值开关、下拉列表、滑动列表、图形列表、列表框、曲线图、画布和表格控件。
按键事件被传递给当前激活控件对应的回调函数。如果忽略此事件,LabWindows/CVI不对此事件进行进一步处理。
如果用户在控件中输入了双字节字符,回调函数会接收到两次
VENT_KEYPRESS事件,在这种情况下应该忽略第一次事件,可以用函数KeyPressEventIsLeadByte来判断接收到的是否是双字节字符的第一个字节。当接收到第二次事件时,KeyPressEventIsTrailByte函数返回值为真(TRUE),这时可以用GetKeyPressEventCharacter函数来获取完整的双字节字符。
事件数据eventData1 为键码,eventData2 为指向键码的指针。
8. EVENT_LEFT_CLICK
应用于面板和各种控件。
当用户在面板上任何地方点击鼠标左键的时候,将产生此事件,它被传递到面板的回调函数和被点击控件的回调函数。
事件数据eventData1 为鼠标垂直坐标,eventData2 为鼠标水平坐标。
9. EVENT_LEFT_DOUBLE_CLICK
应用于面板和各种控件。
当用户在面板上任何地方双击鼠标左键的时候,将产生此事件,它被传递到面板的回调函数和被点击控件的回调函数。
事件数据eventData1 为鼠标垂直坐标,eventData2 为鼠标水平坐标。
10. EVENT_LOST_FOCUS
应用于面板、数值控件、颜色选择数值控件、数值滑动条、字符串、文本框、命令按钮、图形按钮、双值按钮、文本按钮、单选控件、指示灯、二值开关、下拉列表、滑动列表、图形列表、列表框、曲线图、画布和表格控件。
当控件是当前激活控件(active control),而用户通过鼠标点击、按
11. EVENT_PANEL_MOVE
应用于面板对象。
当用户移动面板时产生此事件,它被传递给面板的回调函数。
回调函数中的事件数据无意义。
12. EVENT_PANEL_SIZE
应用于面板对象。
当用户改变面板大小时产生此事件,它被传递给面板的回调函数。
回调函数中的事件数据无意义。
13. EVENT_RIGHT_CLICK
应用于面板和各种控件。
当用户在面板上任何地方点击鼠标右键的时候,将产生此事件,它被传递到面板的回调函数和被点击控件的回调函数。
事件数据eventData1 为鼠标垂直坐标,eventData2 为鼠标水平坐标。
14. EVENT_RIGHT_DOUBLE_CLICK
应用于面板和各种控件。
当用户在面板上任何地方双击鼠标右键的时候,将产生此事件,它被传递到面板的回调函数和被点击控件的回调函数。
事件数据eventData1 为鼠标垂直坐标,eventData2 为鼠标水平坐标。
15. EVENT_TIMER_TICK
应用于定时器控件。
定时器控件每隔一定时间间隔(可以通过定时器属性来设定)就会产生此事件,请参考第4章定时器控件编程部分。
事件数据eventData1 为指向当前时间的指针,eventData2 为一个指针,其指向的数据为从该控件上次接收到此事件到当前一共经历的时间。
16. EVENT_VAL_CHANGED
应用于数值控件、颜色选择数值控件、数值滑动条、字符串、文本框、图形按钮、双值按钮、文本按钮、单选控件、指示灯、二值开关、下拉列表、滑动列表、图形列表、列表框、曲线图和表格控件。
当用户连续动作,使控件的值连续发生变化时,此事件也将连续产生。这样的动作包括:操作数值控件、下拉列表或表格控件的上/下箭头;按住鼠标左键选择列表框中的多个条目;拖动曲线图控件上的光标等。
对于表格控件,调用控件回调函数时的事件数据eventData1 为产生事件的表格单元的行号,eventData2 为列号,如果事件涉及了多个表格单元,例如对多个单元排序或粘贴数据,eventData1 和eventData2 都会是0。
3.1.5、用户界面控件模式
用户界面上的控件可以设置为Normal、Indicator、Hot、Validate 等操作模式,这些操作模式可以在控件属性面板中确定,也可以通过编程确定。各种操作模式决定了用户可以以何种方式操作控件,控件可以产生哪些用户界面事件。
1. Normal 模式:用户可以操作控件,控件可以产生除COMMIT之外的所有事件。
2. Indicator 模式:用户不能操作控件,控件不能产生COMMIT 或VAL_CHANGED 事件。带状图(strip chart)和文本信息(text message)控件只能用于此种模式。
3. Hot 模式:这是默认的控件模式,它基本上与Normal 模式相同,但是这种模式的控件可以产生COMMIT 事件。通常,Hot 模式的控件当状态变化的时候就会产生COMMIT事件。例如,如果用户拖动二值开关(binary switch)控件使其改变状态,当用户释放鼠标按键的时候,COMMIT 事件就会产生。下列类型的控件被设置为Hot 模式时有其各自特有的产生COMMIT 事件的规则:
对于数值(numeric)、字符串(string)和文本框(text box)控件,当用户向控件中输入一个值后按下
列表框(list box)如果不是设置为选择方式(check mode),那么当用户在此控件处于激活状态的时候按下
C#委托及事件 在C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。 简单的讲委托(delegate)是一种类型安全的函数指针,首先,看下面的示例程序,在C++中使用函数指针。 首先,存在两个方法:分别用于求两个数的最大值和最小值。 int Max(int x,int y) { return x>yx:y; } int Min(int x,int y) { return x
案例操作020601:利用委托实现方法的 动态调用 首先,添加如下控件: 两个RadioButton,分别用来让用户选 择求最大值以及求最小值 二个TextBox,用来输入两个操作数 一个TextBox,用来显示运算结果 一个Button,用来执行运算 界面如下图所示: 下一步,在窗口中添加两个方法:Max,Min,这两方法的代码如下: int Max(int x,int y) { return x>yx:y; } int Min(int x,int y) { return x
V B编程的键盘控制Prepared on 21 November 2021
VB编程的键盘控制 我们利用VisualBASIC编写程序,多数情况只涉及到鼠标操作(如单击、双击、拖动等),但如果程序中需要实现文本编辑、热键激活或利用键盘进行游戏控制等功能时,将不可避免地碰到键盘捕获及处理的问题。下面,我们就来看一看VB编程中如何进行键盘控制。 一、概述 在VB中,很多控件都提供了键盘输入功能(如文本框、组合框等),但它们对键盘的处理较简单,遇到复杂一点的要求即无能为力。因而VB提供了KeyPress、KeyUp、KeyDown三种键盘事件,当用户按键时,会触发这三种事件,而且窗体和接受键盘输入的控件都识别这三种事件。下表对这些事件作了描述。 键盘事件触发原因 KeyPress按下某ASCII字符键 KeyDown按下键盘的任意键 KeyUp释放键盘的任意键 KeyPress事件无法检测到的情况: SHIFT、CTRL和ALT键的特殊组合。 光标控制键。 HOME、END、PAGEUP、PAGEDOWN等。 数字小键盘的数字键与打字键盘数字键的区别。 不仅响应按键操作而且响应释放键操作(KeyPress只响应按键操作)。 键盘事件彼此不相互排斥。按下某键时将生成KeyDown和KeyPress事件,而松开此键时生成KeyUp事件。当用户按下一个KeyPress不能检测的键时将触发KeyDown事件,松开此键时生成KeyUp事件。若使用KeyUp和KeyDown事件应确保KeyPress事件的功能不够用,通常编写KeyPress事件的代码比较容易。 二、KeyPress事件 在按下与ASCII字符对应的键时将触发KeyPress事件。ASCII字符集代表标准键盘的字母、数字和标点符号以及部分控制键(ENTER、TAB、BACKSPACE键等)。KeyDown和KeyUp事件能够检测其它功能键、编辑键和光标定位键。当处理标准ASCII字符时应使用KeyPress事件。例如,如果希望将输入到文本框中的所有字符都强制转换为大写字符,则可在输入时使用此事件转换大小写:PrivateSubText1_KeyPress(KeyAsciiAsInteger) KeyAscii=Asc(Ucase(Chr(KeyAscii))) EndSub KeyAscii参数返回对应所按键的ASCII代码。 也可通过KeyPress事件识别部分控制键。例如,下述事件过程使用KeyPress检测用户是否正在按BACKSPACE键: PrivateSubText1_KeyPress(KeyAsciiAsInteger) IfKeyAscii=8ThenMsgBox"YouPressedtheBACKSPACEkey." EndSub 注:BACKSPACE键的ASCII值为8。 还可用KeyPress事件改变某些键的缺省行为。例如,当在文本框内按ENTER键就会结束当前行输入并将光标转到下一行(Multiline属性设为True)。在KeyPress事件中截断ENTER键(ASCII 值为13)就可避免这种情况:
C# 中的委托和事件 引言 委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。 将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语: public void GreetPeople(string name) { // 做某些额外的事情,比如初始化之类,此处略 EnglishGreeting(name); } public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } 暂且不管这两个方法有没有什么实际意义。GreetPeople用于向某人问好,当我们传递代表某人姓名的name参数,比如说“Jimmy”,进去的时候,在这个方法中,将调用EnglishGreeting方法,再次传递name参数,EnglishGreeting则用于向屏幕输出“Morning, Jimmy”。
现在假设这个程序需要进行全球化,哎呀,不好了,我是中国人,我不明白“Morning”是什么意思,怎么办呢?好吧,我们再加个中文版的问候方法: public void ChineseGreeting(string name){ Console.WriteLine("早上好, " + name); } 这时候,GreetPeople也需要改一改了,不然如何判断到底用哪个版本的Greeting问候方法合适呢?在进行这个之前,我们最好再定义一个枚举作为判断的依据: public enum Language{ English, Chinese } public void GreetPeople(string name, Language lang){ //做某些额外的事情,比如初始化之类,此处略 swith(lang){ case Language.English: EnglishGreeting(name); break; case Language.Chinese: ChineseGreeting(name); break; } } OK,尽管这样解决了问题,但我不说大家也很容易想到,这个解决方案的可扩展性很差,如果日后我们需要再添加韩文版、日文版,就不得不反复修改枚举和GreetPeople()方法,以适应新的需求。 在考虑新的解决方案之前,我们先看看 GreetPeople的方法签名:
iOS中的键盘事件 键盘事件 在涉及到表单输入的界面中,我们通常需要监听一些键盘事件,并根据实际需要来执行相应的操作。如,键盘弹起时,要让我们的UIScrollView自动收缩,以能看到整个UIScrollView的内容。为此,在UIWindow.h中定义了如下6个通知常量,来配合键盘在不同时间点的事件处理: 1.UIKeyboardWillShowNotification // 键盘显示之前 2.UIKeyboardDidShowNotification // 键盘显示完成后 3.UIKeyboardWillHideNotification // 键盘隐藏之前 4.UIKeyboardDidHideNotification // 键盘消息之后 5.UIKeyboardWillChangeFrameNotification // 键盘大小改变之前 6.UIKeyboardDidChangeFrameNotification // 键盘大小改变之后 7. 8.这几个通知的object对象都是nil。而userInfo字典都包含了一些键盘的信息,主要是键 盘的位置大小信息,我们可以通过使用以下的key来获取字典中对应的值:9. 10.// 键盘在动画开始前的frame 11.let UIKeyboardFrameBeginUserInfoKey: String 12. 13.// 键盘在动画线束后的frame 14.let UIKeyboardFrameEndUserInfoKey: String 15. 16.// 键盘的动画曲线 17.let UIKeyboardAnimationCurveUserInfoKey: String 18. 19.// 键盘的动画时间 20.let UIKeyboardAnimationDurationUserInfoKey: String 在此,我感兴趣的是键盘事件的调用顺序和如何获取键盘的大小,以适当的调整视图的大小。 从定义的键盘通知的类型可以看到,实际上我们关注的是三个阶段的键盘的事件:显示、隐藏、大小改变。在此我们设定两个UITextField,它们的键盘类型不同:一个是普通键盘,一个是数字键盘。我们监听所有的键盘事件,并打印相关日志(在此就不贴代码了),直接看结果。 1) 当我们让textField1获取输入焦点时,打印的日志如下:
一、在控制台下使用委托和事件 我们都知道,C#中有“接口”这个概念,所谓的“接口”就是定义一套标准,然后由实现类来具体实现其中的方法,所以说“接口,是一组类的抽象”。同样道理,我们可以将“委托”理解为“方法的抽象”,也就是说定义一个方法的模板,至于这个方法具体是怎么样的,就由方法自己去实现。 我们知道接口的最大好处就是可以实现多态,同理,“委托”是可以实现方法的多态,当我们想调用某个具体方法的时候,我们不直接调用这个方法,而是去调用这个委托。当然,我们必须在具体方法和委托之间建立某种关联。 下面我们来看例子。 首先,我们定义一个委托: public delegate void SaySomething(string name); 这跟抽象方法的语法格式很相似,只是多了一个关键字delegate。既然是对方法的一种抽象,那么我们最关注的当然就是方法的返回值以及方法的参数了。所以上面红色的部分就是我们定义出来的一个规矩,如果某个方法想委托我去做事,那么请你遵循我的规矩,就是返回值为void,参数为一个字符串。我们这个委托的含义是,当某个人来了,就向他说点东西。 好,既然我们已经定义了这个规矩,下面我们就定义具体的方法了。 public void SayHello(string name) { Console.WriteLine("Hello," + name + "!"); } public void SayNiceToMeetYou(string name) { Console.WriteLine("Nice to meet you," + name + "!"); } 我们这里一共定义了两个方法,一个是向某人说Hello,另一个是向某人说Nice to meet you。我们看到,这里定义的两个方法的返回值和参数跟我们前面定义的“委托”是一致的。 接下来,我们来看事件。 public event SaySomething come;
YUI 3 学习笔记(1)-YUI Global对象 YUI模块是YUI3中的单一核心,所有需要使用YUI3的页面都必须包含该 模块,该模块提供加载功能,可以使用该功能动态加载指定模块,其依 赖模块会被自动加载,所以YUI模块可以看成YUI的一个种子。 YUI模块创建了一个全局对象:YUI,一个页面可以共享一个YUI实例,也 可以使用多个实例。 1 要使用YUI全局对象,只需添加如下引用: Html代码 2 如果你想要使用拖放和动画功能,可以使用use()方法加载: Javascript代码 该方法的最后一个参数是一个回调函数,该函数在完成所有指定模块的加载 后被调用,调用时传递一个参数:一个YUI的实例。 3 YUI全局对象有一个Lang对象,其中没有设什么新鲜东西,就是javascript 语言 本身的一些功能,但是在这里做了一个统一以便于使用: Javascript代码 YUI 3 学习笔记(2)- Node Node是用来操作DOM node的工具,实际上每一个Node实例都代表着一个DOM node,每一 个NodeList都代表着一组DOM node. 从YUI2.x到YUI3.0相关的api发生了一些变化,具体可以参见本文的最后部分。 1. 要使用Node,首先要引入YUI3的种子文件: Html代码
然后加载相应模块: Javascript代码 2. 获得Node 可以使用YUI.one()获取Node,该方法的参数可以是一个Node,也可以是一个选择器(selector), 在使用选择器时,返回第一个匹配的元素。默认情况下css3选择器不被支持,如果要使用,需要 加载“selector-css3”模块。关于css3 selector可以参见这里: https://www.doczj.com/doc/702935216.html,/TR/css3-selectors 以下是使用YUI.one()的例子: Javascript代码 3. 访问Node属性 可以使用Node的set,get方法访问Node的属性,需要注意的是如果返回节点的话返回的是 YUI Node而不是DOM node,这一点在其他地方也要注意。 以下是相关的例子: Javascript代码 4. 事件监听 可以用on方法添加事件监听器: Javascript代码 5. DOM方法 Y.Node提供了所有DOM node的原有方法
利用VB建立鼠标键盘操作回放 很多的教学软件或系统监视软件可以自动记录回放用户的输入文字或点击按钮等操作操作,这个功能的实现是使用了Windows的Hook函数。本文介绍如何通过使用VB来实现鼠标键盘操作的纪录和回放。Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows消息,函数语法为: Public Declare Function SetWindowsHookEx Lib "user32" _ Alias "SetWindowsHookExA" _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long 其中参数idHook指定建立的监视函数类型。通过Windows MSDN帮助可以看到,SetwindowsHookEx函数提供15种不同的消息监视类型,在这里我们将使用WH_JOURNALRECORD和WH_JOURNALPLAYBACK来监视键盘和鼠标操作。参数lpfn 指定消 息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。函数的一般形式为: Hookproc (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall; 其中code为系统指示标记,wParam和lParam为附加参数,根据不同的消息监视类型而不同。只要在程序中建立这样 一个函数再通过SetwindowsHookEx函数将它加入到消息监视链中就可以处理消息了。 在不需要监视系统消息时需要调用提供UnHookWindowsHookEx来解除对消息的监视。WH_JOURNALRECORD和WH_JOURNALPLAYBACK类型是两种相反的Hook类型,前者获得鼠标、键盘动作消息,后者回放鼠 标键盘消息。所以在程序中我们需要建立两个消息函数,一个用于纪录鼠标键盘操作并保存到一个数组中,另一个用于 将保存的操作返给系统回放。 下面是具体的程序实现:首先建立一个新工程,在Form1中加入三个CommandButton控件用于控制消息钩子,另外还 可以增加若干Command或者TextBox控件用于检验操作回放的效果。然后在工程中增加一个模块文件,在模块中加入以下 定义和代码: Option Explicit Public Type EVENTMSG message As Long paramL As Long paramH As Long time As Long hwnd As Long End Type Public Declare Function CallNextHookEx Lib "user32" _ (ByVal hHook As Long, _
九年级数学竞赛专题 第三讲 非负数 一、选择题 1.若|2x - 3| > 2x – 3,那么这个不等式的解集为( ) A .x > 2 3; B .x = 2 3; C .x < 2 3; D .解集为空集 2.若-3 < x < 4,则满足5|4|962=--++x x x 的x 值为( ) A .2 B .3 C .4 D .5 3.对于实数x ,x x x 120002000+ -+ -=( ) A .0; B .2000; C .-2000; D . 2000 1 4.若|a – x – x 1| + 0132 2 =+ -x x ,那么 2 ) 2(-a 等于( ) A .5-2; B .2-5; C .±5-2; D .5±2 5.已知:|x – 1 | + |x – 5 | = 4,则x 的取值范围是( ) A .1≤x ≤5; B .x ≤1; C .1 < x < 5; D .x ≥5 二、填空题 1.若a,b 为非零实数,则 ab ab b b a a ||||||- ++ =__________。 2.设0 < x < 1,化简4) 1(4) 1(2 2 -+ -+- x x x x =_____________。 3.若y = |x + 1 | -2 |x| + |x – 2 |,且-1≤x ≤2,那么y 的最大值是___________。 4.如果a,b,c 都是整数,且满足c b ab c b a 124213332 2 2 ++<+++,则a=____________,b=_______,c=____________。 5.若 11 ||=-x x ,则 x x 21||+的值为___________。 三、解答题 1.求方程|x – 2 | + |x – 3 | = 3的实数解。
委托 定义委托的语法和定义方法比较相似,只是比方法多了一个关键字delegate,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int、string等等;而委托是将方法参数化,说了上面的那个类型参数化之后,相信你也能猜到方法参数化的意思了,对,就是将方法作为一个参数传到一个委托中。 首先来看看声明委托的语句: public deletate void MyDelegate(); public:访问修饰符delegate:关键字void:返回类型MyDelegate:委托名称( ):参数列表 看到声明大家会想了,为什么该委托的返回值,参数列表要这样的,我不能返回一个string,一个int么?我不能给委托加几个参数么?答案是:当然可以,但委托的定义是相对于方法来说的,因为得你的委托最终是要来注册方法的,而你的方法是具有某种签名的,所以你要给怎样签名的方法来声明一个委托,该委托就要和该方法具有同等的签名,就类似于你用一个int 类型的变量去接受一个string类型的值,显然是不行的(个人理解).... * 委托只要定义就可以了,我们并不需要关心他的实现 委托的使用 注册委托有两种方法: 第一种:直接将方法赋值[=]或者用“+=”给一个委托==>委托名=[+=] 方法名 第二种:委托本质也是一个类,只是一个特殊的类,所以我们也可以实例化一个委托对象通过委托构造函数来注册委托==》委托名对象名= new 委托名(方法名)
了解了委托的声明和使用,我们就可以来看小例子来加深理解了 首先看看界面: 界面上就是简单的四个按钮两个属于委托,两个属于事件,都是一个用来执行,一个用来干扰,以便于来理解委托事件 然后看后台代码,首先我定义了一个Test类,声明委托,实例了委托,还声明了事件,写了个方法用来触发事件,代码如下: 1public class Test 2 { 3//声明一个委托 4public delegate void MyDelegate(); 5 6//创建一个委托实例 7public MyDelegate myDel; 8//声明一个事件 9public event MyDelegate EventMyDel; 10 11//事件触发机制(必须和事件在同一个类中) 外界无法直接用EventMyDel()来触发事件 12public void DoEventMyDel() 13 { 14 EventMyDel(); 15 } 16 }
Python中使用PyHook监听鼠标和键盘事件实例 PyHook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件。这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台。关于PyHook的使用,在它的官方主页上就有一个简单的教程,大体上来说,可以这样使用 ?123456789101112131415161718192021222324252627282930 313233343536373839404142434445464748495051525354555 6 # -*- coding: utf-8 -*- # 3import pythoncom 4import pyHook 5def onMouseEvent(event): # 监听鼠标事件print "MessageName:",event.MessageName print "Message:", event.Message print "Time:", event.Time print "Window:", event.Window print "WindowName:", event.WindowName print "Position:", event.Position print "Wheel:", event.Wheel print "Injected:", event.Injected print"---" # 返回
True 以便将事件传给其它处理程序# 注意,这儿如果返回False ,则鼠标事件将被全部拦截# 也就是说你的鼠标看起来会僵在那儿,似乎失去响应了return True 23def onKeyboardEvent(event): # 监听键盘事件print "MessageName:", event.MessageName print "Message:", event.Message print "Time:", event.Time print "Window:", event.Window print "WindowName:", event.WindowName print "Ascii:", event.Ascii, chr(event.Ascii) print "Key:", event.Key print "KeyID:", event.KeyID print "ScanCode:", event.ScanCode print "Extended:", event.Extended print "Injected:", event.Injected print "Alt", event.Alt print "Transition", event.Transition print "---" # 同鼠标事件监听函数的返回值return True 42def main(): # 创建一个“钩子”管理对象hm = pyHook.HookManager() # 监听所有键盘事件 hm.KeyDown = onKeyboardEvent # 设置键盘“钩子”hm.HookKeyboard() # 监听所有鼠标事件 hm.MouseAll = onMouseEvent # 设置鼠标“钩子”hm.HookMouse() # 进入循环,如不手动关闭,程序将一直处于监听状态pythoncom.PumpMessages() 56if __name__ == "__main__": main()
VB编程的键盘控制 我们利用Visual BASIC编写程序,多数情况只涉及到鼠标操作(如单击、双击、拖动等),但如果程序中需要实现文本编辑、热键激活或利用键盘进行游戏控制等功能时,将不可避免地碰到键盘捕获及处理的问题。下面,我们就来看一看VB编程中如何进行键盘控制。 一、概述 在VB中,很多控件都提供了键盘输入功能(如文本框、组合框等),但它们对键盘的处理较简单,遇到复杂一点的要求即无能为力。因而VB提供了KeyPress、KeyUp、KeyDown 三种键盘事件,当用户按键时,会触发这三种事件,而且窗体和接受键盘输入的控件都识别这三种事件。下表对这些事件作了描述。 KeyDown和KeyUp事件提供了最低级的键盘响应,可用这些事件检测KeyPress事件无法检测到的情况: ◆SHIFT、CTRL和ALT键的特殊组合。 ◆光标控制键。 ◆HOME、END、PAGEUP、PAGEDOWN等。 ◆数字小键盘的数字键与打字键盘数字键的区别。 ◆不仅响应按键操作而且响应释放键操作(KeyPress只响应按键操作)。 键盘事件彼此不相互排斥。按下某键时将生成KeyDown和KeyPress事件,而松开此键时生成KeyUp事件。当用户按下一个KeyPress不能检测的键时将触发KeyDown事件,松开此键时生成KeyUp事件。若使用KeyUp和KeyDown事件应确保KeyPress事件的功能不够用,通常编写KeyPress事件的代码比较容易。 二、KeyPress事件 在按下与ASCII字符对应的键时将触发KeyPress事件。ASCII字符集代表标准键盘的字母、数字和标点符号以及部分控制键(ENTER、TAB、BACKSPACE键等)。KeyDown 和KeyUp事件能够检测其它功能键、编辑键和光标定位键。当处理标准ASCII字符时应使用KeyPress事件。例如,如果希望将输入到文本框中的所有字符都强制转换为大写字符,则可在输入时使用此事件转换大小写: Private Sub Text1_KeyPress(KeyAscii As Integer) KeyAscii = Asc(Ucase(Chr(KeyAscii))) End Sub KeyAscii参数返回对应所按键的ASCII代码。 也可通过KeyPress事件识别部分控制键。例如,下述事件过程使用KeyPress检测用户是否正在按BACKSPACE键:
Flex4.6事件监听机制的测试和总结 在Flex和Actionscript3中,事件的类型有很多,比如单击的click、鼠标移动的mouseEvent、改变大小等。开发人员需要注意的是,某个组件如何设置监听、发出事件,以及事件的响应操作。这种方式被称之为“事件驱动”方式。事件驱动涉及到的有关概念包括: 1、事件对象,即event object。所有的事件对象都是flash.events.Event或者其子类。每个事件对象都包含事件类型(type)和事件源(target),便于event listener知道事件的类型以及事件发出者。事件对象是Event类或者某个子类的实例,不但存储了有关特定事件的信息,还包括便于操作事件对象的方法。 2、事件源,即event dispatchers。是事件发起的主体,所有的dispatcher都是eventdispatcher或其子类。 3、事件监听器,即event listeners。它表现为一个函数,当事件发生时,事件源dispatcher通知该监听器去处理特定的事件。为对象添加监听器的方法是:addEventListener(type, function)。 当指定类型的事件发生时,事件监听器以事件对象eventObject为参数传递给事件响应函数。同一时刻同一组件可能有多个事件发生,因此这里指定事件类型是非常有必要的。 4、事件流,当一个组件触发事件时,这个事件会沿着一定的顺序流动,每经过一个组件,就会检测这个组件是否注册了该事件类型的监听器,如果注册了,就会响应,并调用事件处理函数。事件流分为三个阶段: (1)捕获阶段,Flex应用程序从根显示元素(如Application)逐层向下寻找,直到找到事件产生的源头。 (2)目标匹配阶段,在该阶段,Flex应用程序会调用目标对象自身注册的监听程序。 (3)冒泡阶段,在该阶段,从目标节点到根节点,逐层向上检测每个节点是否注册了监听器,相当于捕获阶段的逆过程。Flex应用程序可以在addEventListener()函数中的第三个参数设置事件获取的阶段,如果为true,则关闭捕获阶段,开启目标匹配和冒泡阶段。 如果要阻断事件流继续流动,可以在监听器的响应函数中添加: event.stopPropagation(); 由于Flex设置的监听事件类型比较少,如果需要设置组件的特殊响应事件,或者为自定义组件添加自定义的响应事件,我们需要设计自定义类型的Event对象。 下面我们以一个由button和textInput控件组成的自定义组件InputButtonComp为例,为该组件设置按钮单击时的响应事件。 第一步:设计自定义组件。 (1)新建InputButtonComp.as类文件,继承自BorderContainer容器,并定义自定义组件中需要包含的控件。 public class InputButtonComp extends BorderContainer {
#include
高三新数学第一轮复习教案(讲座3) 函数的基本性质 一.课标要求 1.通过已学过的函数特别是二次函数,理解函数的单调性、最大(小)值及其几何意义; 2.结合具体函数,了解奇偶性的含义; 二.命题走向 从近几年来看,函数性质是高考命题的主线索,不论是何种函数,必须与函数性质相关联,因此在复习中,针对不同的函数类别及综合情况,归纳出一定的复习线索。 预测2007年高考的出题思路是:通过研究函数的定义域、值域,进而研究函数的单调性、奇偶性以及最值。 预测明年的对本讲的考察是: (1)考察函数性质的选择题1个或1个填空题,还可能结合导数出研究函数性质的大题; (2)以中等难度、题型新颖的试题综合考察函数的性质,以组合形式、一题多角度考察函数性质预计成为新的热点。 三.要点精讲 1.奇偶性 (1)定义:如果对于函数f (x )定义域内的任意x 都有f (-x )=-f (x ),则称f (x )为奇函数;如果对于函数f (x )定义域内的任意x 都有f (-x )=f (x ),则称f (x )为偶函数。 如果函数f (x )不具有上述性质,则f (x )不具有奇偶性.如果函数同时具有上述两条性质,则f (x )既是奇函数,又是偶函数。 注意: ○ 1 函数是奇函数或是偶函数称为函数的奇偶性,函数的奇偶性是函数的整体性质; ○ 2 由函数的奇偶性定义可知,函数具有奇偶性的一个必要条件是,对于定义域内的任意一个x ,则-x 也一定是定义域内的一个自变量(即定义域关于原点对称)。 (2)利用定义判断函数奇偶性的格式步骤: ○ 1 首先确定函数的定义域,并判断其定义域是否关于原点对称; ○ 2 确定f (-x )与f (x )的关系; ○ 3 作出相应结论: 若f (-x ) = f (x ) 或 f (-x )-f (x ) = 0,则f (x )是偶函数; 若f (-x ) =-f (x ) 或 f (-x )+f (x ) = 0,则f (x )是奇函数。 (3)简单性质: ①图象的对称性质:一个函数是奇函数的充要条件是它的图象关于原点对称;一个函数是偶函数的充要条件是它的图象关于y 轴对称; ②设()f x ,()g x 的定义域分别是12,D D ,那么在它们的公共定义域上: 奇+奇=奇,奇?奇=偶,偶+偶=偶,偶?偶=偶,奇?偶=奇 2.单调性 (1)定义:一般地,设函数y =f (x )的定义域为I , 如果对于定义域I 内的某个区间D 内的任意两个自变量x 1,x 2,当x 1 这些很重要在MVC EF4.1 里都会有很多拉姆达表达式的影子在做组件开发用户控件开发事件的运用一定也是少不了的稍微深入点儿的说用于两个对象之间的通讯用来解耦用委托事件是很不错的选择而设计模式里的观察者模式也是基于委托事件的应用还有做winform 开发的里的线程WPF SL 的异步调用等都是有这委托的影子的所以这个还是很重要的。也是一定要掌握的~ 希望通过这篇文章能让大家更加了解委托以及如何运用~ 一.委托以及延伸 先看下MSDN 的介绍吧~------ delegate 通俗的说委托就是可以实现把方法做为变量来传递 1.先写个最简单的委托的用法 静态的和非静态方法的 结果会输出 您好wlf Hello wlf 这是最原始的委托 2. 进化为匿名方法 声明完委托后还要声明方法是不是很麻烦如果不声明方法用匿名方法可以帮我们看 代码减少了很多吧~ 3.再进化为拉姆达表达式 上面的虽然简单了不少但是还能更简单的用拉姆达表达式~ 看这就是拉姆达表达式的演变一定要会这个~ 因为在EF LINQ 等有很多用拉姆达表达式的~ 4.用Action 和Func继续简化 上面的代码以及很简单了但是还有个很不爽的一点~ 要声明委托!可以不声明么?当然可以~ 先看MSDN介绍Action和Func 通俗的讲这两个都是用来帮你声明委托 Action 用于帮你声明没用返回值的委托Func则是有返回值的最后一个参数为返回值 看~ 以前的版本总是要声明一个HelloWorld 的委托现在只有两行代码就可以了下面顺便掩饰了有返回值的func 的例子。第一个参数是传递 参数的类型第二个是返回值的类型~ 这里说下这俩函数都有16个重载~ 所以多个参数是没问题的~ 5.说说委托的好处 委托的好处应用文章开始已经说了很多了这里就拿文章开头的例子体会下委托的好处 当我们再多一种语言来问好时只需增加一种Action 即可而不需要改动sayHello 方法否则这里将充满了if else 的判断 6.工作里的应用 再LINQ 或EF 里都有个很重要的数据刷选的功能WHERE 它的参数就是Func 直接上代码自己看注释~ 概述 防盗报警主机是集多项先进技术、功能于一体的卓越的智能安全技术防范产品。防盗系统由控制键盘、用户主机、遥控器、红外探测器、门磁、烟雾探测器和强音警笛等组成。安装方便、操作简捷,可同时储存8个报警电话(如:110指挥中心、用户移动电话号码、固定电话号码等)。既可单独不联网使用,亦可通过电话线实现区域联网,是家居、营业场所、金融系统等单位安装防盗报警设备的理想选择。 1.日常操作名词解释: 布防:布置安全防范任务(指防盗),使主机进入警戒状态,也叫做设防、警戒或开机。 撤防:撤消安全防范任务(指防盗),也叫做解除警戒或关机。 防区旁路:暂时关闭防区,当某些防区有故障或有人活动影响布防时,可将其旁路,使其不起作用。 撤防一次,取消已旁路的防区。 防区触发:在撤防状态,探测器检测到有人,不为报警。例如门被打开门磁的磁铁与主体部份分开,即为门磁触发。退出延时:主机布防后,提供一段时间给用户离开。 进入延时:用户外出回来,从大门进入触发探测器后,主机不会立即报警,提供一段时间给用户将主机撤防,超时不能撤防主机才会报警。(建议退出/进入延时设置为20~30秒) 2.使用前注意事项: ●设定公安局110指挥中心报警电话号码之前,应征得公安部门的同意后,方可将“110”号码存入用户主机内, 否则由此产生的一切后果本公司不负责。 ●请仔细阅读及保管<<用户一本通>>,以便您更好掌握日常使用操作方法。 ●为确保主机24小时不间断运行,请保持市电正常供电。 ●如果市电经常停电,将会缩短内部备用蓄电池的使用寿命。 ●不要随意拆卸用户主机,以免发生意外和人为的损坏。 ●如用户主机发生故障,请持购机票据和保修卡与销售代理或我公司联系。 - 1 - 目录 第一章中国古代史之遗址总结 (1) 第二章中国古代史之战役总结 (2) 第三章中国古代史之治世、盛世总结 (3) 第四章中国古代史之农民起义、三大叛乱总结 (6) 第五章中国古代史之中央官制总结 (8) 第六章中国古代史之税收土地制度总结 (9) 第一章中国古代史之遗址总结 1、蓝田猿人遗址,旧石器时期,位于今陕西蓝田,直立人化石(距今约110万年至115万年)。 2、周口店遗址,旧石器时期,位于今北京房山区,北京人(距今70万年至20万年前)、山顶洞人(距今3万年左右)。 3、半坡遗址,新石器时期,位于今陕西西安,属仰韶文化(黄河中游地区一种重要的新石器时代彩陶文化)。 4、仰韶遗址,新石器时期,位于今河南省渑池县仰韶村。 5、河姆渡遗址,新石器时期,位于今浙江余姚,长江流域。 6、大汶口遗址,新石器时期,位于今山东泰安。 7、三星堆遗址,公元前5000-3000年,位于四川广汉,是迄今在西南地区发现的范围最大、延续时间最长、文化内涵最丰富的古城、古国、古蜀文化遗址。 8、二里头遗址,夏中晚期和商初期,位于今河南洛阳。 第二章中国古代史之战役总结 上古时代 1、涿鹿之战,炎黄部落(黄帝)VS东夷集团(蚩尤),炎黄部族获得胜利,华夏集团收复中原。 商周时期 2、牧野之战,周武王VS商纣王,纣王兵败自焚,周灭商;以少胜多著名战役,“临阵倒戈”。 春秋战国时期著名战役 3、城濮之战,晋、楚两国在魏国城濮地区进行的争夺中原霸权的首次大战,“退避三舍”。 4、桂陵之战,齐国围魏救赵,著名截击战。 5、长平之战,秦军(白起)VS赵军(赵括“纸上谈兵”,替代廉颇),秦军大胜,坑杀40万降卒;赵国经此一战元气大伤,加速了秦国统一中国的进程,长平之战是战国历史的最后转折,至此秦国的统一只是时间问题(见战国历史分期)。此战是中国古代军事史上最早、规模最大、最彻底的大型歼灭战。 秦汉时期 6、巨鹿之战,楚军为首的义军(项羽)VS秦军,打败秦军主力,决定秦亡C#委托与事件以及应用
红外报警说明书
第03讲 中国古代史(三)