Windows系统的消息机制资料_第1页
Windows系统的消息机制资料_第2页
Windows系统的消息机制资料_第3页
Windows系统的消息机制资料_第4页
Windows系统的消息机制资料_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 1 章 Windows 系统的消息机制对诸如 PowerBuilder (后文简写为PB)、 Visual Basic 和 Dephi 等大多数可视化程序设计语言来讲,程序设计的核心是对象的事件、属性和方法,但对Windows 系统本身而言,却是以消息处理为其控制机制。Windows把系统中的对象都作为窗口来对待,每个窗口都有一个用来标识其身份的句柄。Windows通过向窗口发送消息,在开发语言中转化为对象的事件,然后驱动对象,响应用户的动作。在许多面向对象的可视化程序设计语言中,Windows的众多消息已经演变成了对象的属性或方法。本章内容包括Windows 系统的消息机制、消息的发送、

2、消息的应用实例等。1.1Windows 的工作机制1.1.1Windows的工作方式窗口、事件和消息全面地讨论Windows 的内部工作机制需要很大的篇幅,对于一般的PB 用户当然没有必要深入了解所有的技术细节。Windows 系统的工作机制,简单地说就是3 个关键的概念:窗口、事件和消息。不妨简单地将窗口看做带有边界的矩形区域。读者也许已经了解多种不同类型的窗口,如 Windows 系统的“资源管理器”窗口、文字处理程序中的文档窗口或者弹出提示有约会信息的消息对话框窗口等。 除了这些最普通的窗口外, 实际上还有许多其他类型的窗口。 命令按钮是一个窗口,图标、文本框、选项按钮和菜单条也都是窗口

3、。Windows操作系统通过给每一个窗口指定一个惟一的标识号(窗口句柄,常用hWnd 表示)来管理所有的窗口。操作系统连续地监视每一个窗口的活动或事件的信号。事件可以通过诸如单击鼠标或按下按键的操作而产生,也可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。每发生一次事件,将引发一条消息发送至操作系统。操作系统处理该消息并广播给其他窗口。 然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如, 当窗口解除了其他窗口的覆盖时,重新绘制自身窗口)。可以想象,处理各种窗口、事件和消息的所有可能的组合将有惊人的工作量。幸运的是,PB 使用户摆脱了所有的低层消息处理。许多消息由

4、PB 自动处理了,其他的作为事件过程由编程者自行处理,这样可以快速创建强大的应用程序,而毋需涉及不必要的细节。1.1.2句柄的概念在解释消息之前,首先了解系统如何准确地将消息发送到指定的窗口。当一个应用或多第 1 章Windows系统的消息机制 3个应用运行后,会同时创建许多个窗口,Windows作为系统的“大总管”,那么它又是如何识别每一个窗口呢?在程序设计时,通过窗口的名称属性,为每个窗口命名,然后在程序其他部分把窗口名作为识别窗口的标识。这种通过为窗口命名来识别不同窗口的方法,对 Windows系统来讲显然是不现实的。Windows 系统是通过称之为句柄的标识符来识别每一个窗口。句柄是系

5、统动态分配给窗口的32 位整型数标识值,常用hWnd 表示,即英文handle to awindow 的缩写。大量API 函数都需要窗口句柄作参数,或返回一个窗口或设备场境的句柄。句柄可以通俗地理解为Windows 为系统中所有存在的窗口动态分配的身份识别号码。在 PB 中,可以通过handle 函数来取得窗口和控件的句柄,当声明API 函数时,常把保存句柄的变量声明为Long 或 Ulong 长整型数据类型。Windows 为窗口和控件分配句柄标识是动态,同样的程序每次运行时和在不同计算机上运行时所分配的窗口句柄标识可能是完全不一样的。窗口的句柄属性仅能在运行时访问,该属性对窗口的外观并没有

6、任何影响,它仅作为API函数调用的参数或返回值,或其他需识别窗口或对象的地方。在后面章节中, 读者将会看到几乎所有涉及窗口的API 函数都需要传递hWnd 参数,以便函数准确获得用户要处理的窗口或对象。句柄作为由操作系统定义的惟一的长整型值,可以用它来引用窗体和控件等对象。在Windows 系统中, API 函数的调用常用的句柄包括窗口句柄,菜单句柄、 设备对象句柄、设备场景句柄, 等等。 如果函数需要用句柄作为参数,则应该把参数声明为传值,对于返回句柄的API 函数,应将返回的句柄值声明为Long 或 Ulong 类型数据类型。句柄是一种标识符(ID )编号,而不是指针或者数值,不要试图对它

7、们进行任何数学运算。1.1.3消息的概念Windows 系统是以消息处理为其控制机制, 系统通过消息为窗口过程 ( windows procedure )传递输入。 系统和应用两者都可以产生消息。 对于每个输入事件, 例如用户按下了键盘上的某个键、移动了鼠标、单击了一个控件上的滚动条,等等,系统都将产生一系列消息。此外,对于应用带给系统的变化,如字体资源的改变、应用本身窗口的改变,系统都将通过消息以响应这种变化。应用通过产生消息指示应用的窗口完成特定的任务,或与其他应用的窗口进行通信。每个窗口都有一个处理 Windows 系统发送消息的处理程序,称为窗口程序。它是隐含在窗口背后的一段程序脚本,

8、其中包含对事件进行处理的代码。Windows 系统为每条消息指定了一个消息编号,例如当一个窗口变为活动窗口时,它事实上是收到一条来自 Windows 系统的 WM_ACTIVATE 消息,该消息的编号为 6,它对应于 PB 窗口的 Activate 事件。对于窗口来说,诸如 Open、Activate 、MouseDown 、Resize 等事件,实际上对应的是窗口内部的消息处理程序,这些程序对于用户来讲是不可见的。类似地,命令按钮也有消息处理程序, 它的处理程序响应诸如WM_LBUTTONDOWN和 WM_RBUTTONDOWN类的消息,即激活命令按钮的MouseDown 事件。3之1)窗口

9、句柄( a window handle ):窗口句柄用来标识消息将要发送到的窗口对象,系统使用窗口句柄来确定哪一个窗口句柄应该接收该消息。 4PowerBuilder Win32 API程序设计(高级卷)2)消息标识符( a message identifier):消息标识符是用来区分不同消息的命名常量,当窗口过程接收到一个消息时, 它使用消息标识符来确定如何处理该消息。例如,消息标识符WM_PAINT告诉窗口过程“窗口的客户区已经发生变化,窗口必须进行重新绘制”。3)消息参数( message parameters):消息参数用来表述窗口过程处理消息时所使用的数据或数据的位置, 通常用一对参

10、数表示。 消息参数的意义和取值取决于消息。 消息参数取值可以是整型数、 Bit 位标识、指向结构的指针,等等,当不需要使用消息参数时,通常将其设置为 NULL 。窗口过程必须通过检查消息标识符来确定如何对消息参数进行解释。有关消息标识符、消息参数的具体使用,将在后面介绍解释。Sendmessage 函数时给予进一步1.1.4消息的类型1系统定义的消息当系统与应用进行通信时,系统将发送或邮寄消息。系统通过这些消息控制应用的运行,并为应用的进程提供输入或其他信息。应用内部也可发送或邮寄系统定义的消息,应用通常使用这些消息控制由预先注册的窗口类创建的窗口的操作。每一个系统定义的消息都有一个惟一的消息

11、标识符(值),并用一个表明消息用途标识符常量表示(这些在SDK 的头文件中定义)。如WM_PAINT消息标识符表示要求窗口进行重绘的消息。消息标识符常量前缀表示消息所属的消息类别,如WM_ 表示窗口类消息,BM_ 表示按钮类消息,表1-1 给出了不同类别消息的前缀。在 PB 中,消息标识符常量通常声明为窗口或对象的实例常量,例如:CONSTANT long WM_MOUSEMOVE= 512CONSTANT long WM_LBUTTONDOWN = 513CONSTANT long WM_LBUTTONUP= 514CONSTANT long WM_LBUTTONDBLCLK= 515CON

12、STANT long WM_RBUTTONDOWN= 516CONSTANT long WM_RBUTTONUP= 517CONSTANT long WM_RBUTTONDBLCLK= 518表 1-1Windows系统定义的消息类别消息标识符前缀消息分类ABM应用桌面工具栏消息BM按钮控件消息CB组合框控件消息CBEM扩展组合框控件消息CDM通用对话框消息DBT设备消息DL拖曳列表框控件消息DMDTM默认按钮控件消息日期时间选取控件消息消息标识符前缀EMHDMHKMIPMLBLVMMCMPBMPGMPSMRBSBSBMSTMTBTBMTCMTTMTVMUDMWM第 1 章Windows 系统

13、的消息机制 5续表消息分类编辑控件消息头控件消息热键控件消息IP 地址控件消息列表框控件消息列表视图控件消息月历控件消息进度条控件消息Pager 控件消息属性页面消息Rebar 控件消息状态栏窗口消息滚动条控件消息静态控件消息工具栏消息跟踪条控件消息Tab 控件消息Tooltip 控件消息树形控件消息Up-down控件消息普通窗口消息Windows系统使用了成千上万条消息。从窗口到控件都有一组可接收和响应的消息。在Visual Basic 的 API 浏览器中,以常量的方式列出了Windows 的大部分消息。据粗略统计,微软在MSDN 中列出的消息约有数千种,全部弄清楚这么多种消息是不现实的,

14、也是没有必要的。这是因为PB 已经将很多消息封装为了对象的“属性”(例如窗口的Title 和 WindowState 属性)和“方法(函数)”(例如关闭窗口函数Close)。可以发现,消息可能演变成PB 对象的属性、方法(函数)和事件。既然PB 已经对消息进行了封装,那么又何必使用消息来进行程序设计呢?这时因为,PB 提供的事件、属性和方法并未完全涵盖所有消息,为了弥补PB 在某些功能的不足,常使用系统消息或应用自定义的消息来强化PB 的程序设计。2应用定义的消息应用也可以创建自己的消息,并将消息应用于它的窗口或与其他窗口的进程进行通信。如果应用创建了自己的消息,接收消息的窗口过程必须解释消息

15、,同时对消息进行恰当的处理。系统保留的消息标识符的取值范围为0 x0000 0 x03FF( 0 1023),专门用于系统定义的消息;应用定义的消息不能使用这些值,应用定义的消息取值范围为0 x0400 0 x7FFF( 0 32767)。RegisterWindowMessage 函数提供了分配消息编号的功能,该函数用一个消息名称作为参 6PowerBuilder Win32 API程序设计(高级卷)数,并为这个名称分配一个惟一的、尚未使用过的编号。1.1.5用于发送消息的API 函数Windows 应用程序允许应用程序向自己或其他应用程序发送消息,甚至可以向Windows操作系统本身发送消

16、息(比如要求关闭操作系统或重新启动操作系统)。Windows提供了2个专门用于发送消息的API 函数 SendMessage 和 PostMessage。1 SendMessage函数SendMessage 函数发送指定的消息到窗口或Windows 系统,然后函数调用窗口的处理消息的过程,并等待窗口过程处理完消息后返回。原型LRESULTSendMessage(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam );PB 声明FUNCTIONLong SendMessage(Long hwnd, Long wMsg, Long wParam,

17、Long lParam) LIBRARYuser32.dllALIAS FOR SendMessageA参数hWnd为接收消息窗口的句柄;wMsg指定要发送的消息;wParam依赖于消息wMsg 的其他信息;lParam依赖于消息wMsg 的其他信息。返回值函数返回消息的处理结果,该值取决于消息的类型。wParam 和 lParam 两个参数的含义随消息wMsg 参数不同而改变, 因此每当向窗口传递某种消息时,除了要了解该消息的含义外,还要注意wParam 和 lParam 的含义和设置。SendMessage 函数会返回一个Long 值,由于这个函数是直接调用窗口程序,因此窗口程序可以返回一

18、个值, 把它作为 SendMessage 函数的返回值, 这个返回值的具体含义由消息决定。不过,除非在MSDN 明确列出了该消息的返回值,否则,返回值就没有具体意义,应该忽略。此外,在使用返回值时,通常调用SendMessageTimeOut 函数检查是否超时,因为只有在消息完全处理完毕后,才能得到一个有效返回值。前面曾提到默认的窗口过程函数DefWindowProc用来处理应用程序无法处理的消息,该函数确保所有消息都要处理,无论这些消息是否对窗口有用。调用DefWindowProc函数时,需要传入与窗口消息处理过程相同的参数。C 原型LRESULTDefWindowProc ( HWND h

19、Wnd, UINT Msg, WPARAM wParam, LPARAM lParam );PB 声明FUNCTIONLong DefWindowProc (Long hwnd,Long wMsg,Long wParam,Long lParam)LIBRARYuser32.dllALIAS FOR DefWindowProcA参数第 1 章Windows系统的消息机制 7hWndwMsgwParamlParam窗口句柄;指定要发送的消息;依赖于消息wMsg依赖于消息wMsg的其他信息;的其他信息。返回值函数返回消息的处理结果,该取决于消息的类型。2. PostMessage函数PostMess

20、age函数同 SendMessage 类似,它把消息放在指定窗口创建的线程的消息队列中,然后不等消息处理完就返回,而不像 SendMessage 那样必须等到消息处理完毕才返回。目标窗口通过 GetMessage 或 PeekMessage从消息队列中取出并处理。原型LRESULTPostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );PB 声明FUNCTIONLong PostMessage (Long hwnd,Long wMsg,Long wParam,Long lParam)LIBRARYuser32.dllAL

21、IAS FOR PostMessageA参数hWnd为接收消息窗口的句柄;Msg指定要发送的消息;wParam依赖于消息Msg 的其他信息;lParam依赖于消息Msg 的其他信息。返回值如果函数调用成功,函数返回值为非0;如果调用失败,函数返回0。示例下面代码演示了如何通过发送消息,在PB 应用中关闭另外运行的第三方程序。1)运行 Windows 的系统的记事本程序 NotePad,并创建一个未命名的文档。2)在 PB 中新建一个窗口,为窗口声明如下对象级外部函数和实例变量:FUNCTIONLong FindWindow(StringlpClassName,StringlpWindowNam

22、e) LIBRARYuser32.dllALIASFOR FindWindowAFUNCTIONLong PostMessage(Longhwnd, Long wMsg, Long wParam, Long lParam)LIBRARYuser32.dllALIAS FOR PostMessageAConstant long WM_QUIT = 18(3)在窗口上放置一个按钮控件,为按钮的Clicked事件加入如下脚本:String ls_sTitle, pbNullStringLong ll_iHwnd, ll_ihTaskLong ll_iReturnSetNull(pbNullStrin

23、g)ls_sTitle = 未定标题 记事本 ll_iHwnd = FindWindow(SetNull, ls_sTitle) 8PowerBuilder Win32 API程序设计(高级卷)ll_iReturn = PostMessage(ll_iHwnd, WM_QUIT, 0, 0)MessageBox( 提示信息 , 记事本已经关闭!)上述代码运行后,使用 FindWindow 函数获取 Windows 记事本程序窗口的句柄,然后向记事本窗口发送 WM_QUIT 消息,记事本程序将被关闭。1.2事件与消息1.2.1从消息到事件虽然在前面提到 Windows 系统会产生事件来驱动对象,

24、 但更严格的讲 Windows 息,然后由 PB 将其转化为驱动对象的事件。那么 PB 是如何将消息转换为事件呢?先产生消1.1 节介绍了消息的概念。也可以通俗地将消息理解为由Windows操作系统送往程序的事件。它是系统中各个控件(窗口)沟通的方式。举例来说,当移动鼠标、按下鼠标键、改变窗口视窗大小时,Windows 都会送出消息以通知程序。当然,为了要辨别事件的内容,Windows系统中预定义了许多的消息,如WM_PAINT , WM_CHAR等。当事件发生时, Windows 系统根据窗口的身份码句柄hWnd ,判断该事件必须由哪个窗口接收,然后将事件以消息的方式送往程序的窗口中。虽然在

25、Windows 系统中包含了数以百计的事件, 但是操作系统并没有为各个事件设计不同的消息结构,而是以一个一般性的结构来描述消息,Windows 使用了一个特殊的函数来实现这一过程,这个函数的名称叫做“窗口处理函数”或者叫做“窗口消息处理函数”,该函数就是 WindowProc 。LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );从函数的定义可以看出,任何要发送的消息都有4 个参数,其中:HWND hwnd发送窗口的句柄UINT uMsg消息代码Windows 中每一个消息都有惟一的一

26、个代码。在 Visual Basic 的 API 文本浏览器中以常量的格式列出了所有消息名和代码,在PB 中也可以直接利用Visual Basic 的 API 文本浏览器列出的这些消息,惟一需要做的就是将Visual Basic 十六进制消息代码转换为PB 的十进制,如在 Visual Basic 声明定义的有关鼠标移动的消息:Public Const WM_MOUSEMOVE = &H200在 PB 中应声明为:Constant Long WM_MOUSEMOVE = 512WPARAM wParam 和 LPARAM lParam 为两个 32 位的长整型值,用来指定当前发送消息时所带信息

27、,如在鼠标移动时返回鼠标的位置等。当 Windows 有消息需要通知程序的时候,它就会调用该函数,然后自己的程序就从中检第 1 章Windows系统的消息机制 9测发送的消息。Windows中消息的种类是很多的,不可能也没有必要检测所有的消息,只需要检测感兴趣的消息即可。检测消息的程序其实就是一个条件判断组合,如图1.1 所示。那 么 未 处 理 的 消 息 到 那 里 去 了 ? Windows系 统 为 窗 口 提 供 了 默 认 的 窗 口 过 程DefWindowProc,这个窗口过程将负责处理那些不需要的消息。正因为有了这个默认窗口过程,才可以利用 Windows 的窗口进行开发,而

28、不必过多关注窗口各种消息的处理。例如,窗口在被拖动时会有很多消息发送,可以不予理睬让系统自己去处理。接收消息是希望的是处理消息消息?否停止图 1.1消息处理流程从上面分析可以看出,事件驱动机制是针对诸如PB、Visual Basic 这类面向对象的开发环境而言,在其背后隐含的是Windows 系统的消息驱动机制,但Windows 系统的消息驱动应用范围要比高级开发语言定义的事件驱动范围广泛的多。1.2.2PB 事件对消息的封装在 PB 中,除了为窗口和控件预置的事件外,PB 还将 Windows 系统的许多消息封装为用户自选事件,根据与 Windows 系统的消息的对应关系,为每个事件定义了E

29、ventID ,如图 1.2所示。当窗口或控件的预置事件无法满足程序设计要求时,可以使用这些自选事件。如在设备场景中绘制的位图,当窗口大小改变时,位图并不会自动重绘。这时就需要使用窗口的事件ID号位 pbm_paint 事件,该事件与窗口的WM_PAINT消息相对应,当窗口发生变化时强迫窗口重绘。在 PB 中,事件 ID 的作用是把PB 的事件与系统消息联系起来,被用户的动作或其他系统活动触发的事件必须具有ID 号。对于 PB 的系统对象,如窗口、按钮等控件,定义好的系统事件通常都使用 ID 号。当用户使用自选事件时,可以使用如图 1.2 所示列在 Event Declaration 对话框中

30、的事件ID号,用来响应某个系统消息。如果定义被系统消息触发的用户自选事件,可以从ID 号列表中选择事件 ID 号。其中,列在Event 对话框中的所有以pbm_前缀开始的ID 号,为映射到PB中的系统消息。在定义用户自选事件时,不能修改与事件ID 号相关的参数及返回值,因为这些是整个事件 ID 号的具体组成部分。如果与事件ID 号相应的系统消息发生时,PB 触发该事件,并为事件的参数赋值。如果用户自定义事件,并且与系统消息无关,则不为事件选择ID号。这样事件将不会被用户的动作或系统的活动触发,只能在应用中用脚本来触发。 10PowerBuilder Win32 API程序设计(高级卷)图 1.

31、2PB 的用户自选事件由于 PB 的技术开发文档中并未列出每个事件ID 的具体含义及与Windows 系统消息的对应关系,用户在使用这些自选事件时常常感到困惑。为此,笔者将这些事件与Windows 系统的消息的对应关系及具体含义逐一进行了分析,这些 PB 的自选事件ID 涵盖了窗口消息, 以及按钮、组合框、列表框、编辑掩码等控件的消息,下面逐一列在表1-2 1-8 中,供读者参考。(1) PB 的按钮自选事件及对应的系统消息,如表1-2 所示。(2) PB 的组合框控件(ComBox )自选事件及对应的系统消息,如表1-3 所示。表 1-2按钮事件及对应的系统消息PB 的事件 IDpbm_bm

32、getstatepbm_bmsetcheckpbm_bmsetstatepbm_bnclickedpbm_bndisablepbm_bndoubleclickedpbm_bndragdroppbm_bndragenterpbm_bndragleavepbm_bndragoverpbm_bnhilitepbm_bnpaintpbm_bnsetfocuspbm_bnunhilite对应的系统消息消息作用BM_GETSTATE按钮是否加亮BM_SETCHECK设置按钮的选中或未选中状态BM_SETSTATE加亮或不加亮按钮BN_CLICKED按钮控件被单击BN_DISABLE使按钮控件无效BN_DO

33、UBLECLICKED按钮控件被双击BN_DRAGDROP一个对象被放到按钮控件BN_DRAGENTER一个对象被拖到按钮控件BN_DRAGLEAVE一个对象被拖离按钮控件BN_DRAGOVER一个对象被拖经按钮控件BN_HILITE按钮控件被加亮BN_PAINT按钮控件被绘制BN_SETFOCUS按钮控件获得焦点BN_UNHILITE按钮控件不被加亮第 1 章 Windows 系统的消息机制11PB 的事件 ID pbm_cbaddstringpbm_cbdeletestringpbm_cbdirpbm_cbfindstringpbm_cbfindstringexactpbm_cbgetco

34、untpbm_cbgetcurselpbm_cbgetdroppedcontrolsetpbm_cbgeteditselpbm_cbgetextendeduipbm_cbgetitemdatapbm_cbgetitemheightpbm_cbgetlbtextpbm_cbgetlbtextlenpbm_cbinsertstringpbm_cblimittextpbm_cbresetcontentpbm_cbselectstringpbm_cbsetcurselpbm_cbseteditselpbm_cbsetextendeduipbm_cbsetitemdatapbm_cbsetitemhei

35、ghtpbm_cbshowdropdownpbm_cbndblclkpbm_cbndragdroppbm_cbndragenterpbm_cbndragleavepbm_cbndragoverpbm_cbndropdownpbm_cbneditchangepbm_cbneditupdatepbm_cbnerrspacepbm_cbnkillfocuspbm_cbnselchangepbm_cbnselendcancelpbm_cbnselendokpbm_cbnsetfocus表 1-3组合框事件及对应的系统消息对应的系统消息消息作用CB_ADDSTRING将字符串加到组合框CB_DELETE

36、STRING从组合框删除一个字符串CB_DIR加一个目录列表到组合框CB_FINDSTRING搜索以一组字符开头的字符串CB_FINDSTRINGEXACT搜索与所提供的字符完全匹配的字符串CB_GETCOUNT列表框中的项数CB_GETCURSEL当前被选项的数目CB_GETDROPPEDCONTROLSET列表框在屏幕上的坐标位置CB_GETEDITSEL编辑器控件中被选字符的范围CB_GETEXTENDEDUI默认或扩展的用户界面CB_GETITEMDATA重画的列表框中的4 字节( 32 位)项CB_GETITEMHEIGHT列表框中某一项的高度CB_GETLBTEXT列表框中的文本C

37、B_GETLBTEXTLEN列表框中文本的长度CB_INSERTSTRING向列表框中插入新的字符串项CB_LIMITTEXT限制能被输入到列表框中的字符数CB_RESETCONTENT删除列表框中所有内容CB_SELECTSTRING搜索匹配的字符串并显示CB_SETCURSEL在列表框中选择并显示一项CB_SETEDITSEL在列表框的编辑区域中选择一块文本CB_SETEXTENDEDUI设置默认或扩展的用户界面CB_SETITEMDATA在列表框中设定4 字节( 32 位)项CB_SETITEMHEIGHT设置列表框中项的高度CB_SHOWDROPDOWN显示或隐藏列表框中下拉列表区域C

38、BN_DBLCLK用户在列表中某一项上双击鼠标CBN_DRAGDROP一个对象被放到组合框控件上CBN_DRAGENTER一个对象被拖到组合框控件上CBN_DRAGLEAVE一个对象被拖离组合框控件CBN_DRAGOVER一个对象被拖经组合框控件CBN_DROPDOWN列表框的下拉区域即将被显示CBN_EDITCHANGE编辑器控件中的文本发生变化CBN_EDITUPDATE列表框编辑器控件中的文本即将被改变CBN_ERRSPACE列表框满,不能再向其中加入项CBN_KILLFOCUS通用列表框失去焦点CBN_SELCHANGE列表框中被选文本被改变CBN_SELENDCANCEL用户按下了“

39、取消”按钮CBN_SELENDOK用户按下了“确认”按钮CBN_SETFOCUS通用对话控件拥有焦点 12PowerBuilder Win32 API程序设计(高级卷)( 3)PB 的编辑控件( EditMask )自选事件及对应的系统消息,如表1-4 所示。( 4)PB 的列表框控件(ListBox )自选事件及对应的系统消息,如表1-5 所示。表 1-4编辑控件事件及对应的系统消息PB 的自选事件ID对应的系统消息pbm_emcanundoEM_CANUNDOpbm_ememptyundobufferEM_EM_PTYUNDOBUFFERpbm_emfmtlinesEM_FMTLINESp

40、bm_emgetfirstvisiblelineEM_GETFIRSTVISIBLELINEpbm_emgethandleEM_GETHANDLEpbm_emgetlineEM_GETLINEpbm_emgetlinecountEM_GETLINECOUNTpbm_emgetmodifyEM_GETMODIFYpbm_emgetrectEM_GETRECTpbm_emgetselEM_GETSELpbm_emlimittextEM_LIMITTEXTpbm_emlinefromcharEM_LINEFROMCHARpbm_emlineindexEM_LINEINDEXpbm_emlinelen

41、gthEM_LINELENGTHpbm_emlinescrollEM_LINESCROLLpbm_emreplaceselEM_REPLACESELpbm_emsethandleEM_SETHANDLEpbm_emsetmodifyEM_SETMODIFYpbm_emsetpasswordcharEM_SETPASSWORDCHARpbm_emsetrectEM_SETRECTpbm_emsetrectnpEM_SETRECTNPpbm_emsetselEM_SETSELpbm_emsettabstopsEM_SETTABSTOPSpbm_emsetwordbreakEM_SETWORDBRE

42、AKpbm_emsetwordbreakprocEM_SETWORDBREAKPROCpbm_emundoEM_UNDOpbm_enchangeEN_CHANGEpbm_enerrspaceEN_ERRSPACEpbm_enhscrollEN_HSCROLLpbm_enmaxtextEN_MAXTEXTpbm_enupdateEN_UPDATEpbm_envscrollEN_VSCROLL消息作用编辑器控件是否能撤消上一次修改清空由 Windows 管理的取消操作的缓冲区在多行编辑器控件的行尾增加或删除回车换行返回编辑器控件中可见的第一行的行号获得编辑器控件使用的内存句柄从编辑器控件中复制一行

43、到内存缓冲区返回多行编辑器控件的行数文本是否被用户修改返回控件的长方形域返回被选文本的起始位置限制用户键入的文本长度返回被选文本的行号返回控件中被选行第一个字符在编辑串中的位置返回编辑器控件中被选行中的字符数水平或垂直卷滚编辑器控件从剪贴板或从键盘上用新文本替换被选文本设置编辑器控件的句柄设置编辑器控件的modified 标志设置用户输入任何文本时显示的字符,在输入密码时的显示设置 / 重置编辑器控件所在的长方形区域 ,编辑器控件中的文本被重画除了不重画文本,大致与setrect 相同选择字符在多行编辑器控件中设置tabstops设置新的词拆分函数设置新的词拆分过程撤消最近的编辑操作编辑器控件

44、中的文本发生改变编辑器控件内存缓冲区溢出用户点中上水平滚动条用户试图输入比允许更多的文本编辑器控件即将显示用户的修改用户点中垂直滚动条第 1 章 Windows 系统的消息机制13表 1-5列表框控件事件及对应的系统消息PB 的事件 ID对应的系统消息pbm_lbaddstringLB_ADDSTRINGpbm_lbdeletestringLB_DELETESTRINGpbm_lbdirLB_DIRpbm_lbfindstringLB_FINDSTRINGpbm_lbfindstringexactLB_FINDSTRINGEXACTpbm_lbgetcaretindexLB_GETCARETI

45、NDEXpbm_lbgetcountLB_GETCOUNTpbm_lbgetcurselLB_GETCURSELpbm_lbgethorizontalextentLB_GETHORIZONTALEXTENT消息作用向列表框控件中增加一项或一个字符串从列表框中删除一项或一个字符串用目录列表填充列表框在列表框中搜索与所给字符串匹配的项在列表框中搜索与所给字符串精确匹配的项在列表框中搜索拥有焦点的项确定列表框中的项数确定所选项是第几项获得列表框的宽度、计算水平卷滚pbm_lbgetitemheight pbm_lbgetitemrect pbm_lbgetsel pbm_lbgetselcount

46、pbm_lbgetselitems pbm_lbgettext pbm_lbgettextlen pbm_lbgettopindex pbm_lbinsertstring pbm_lbresetcontent pbm_lbselectstring pbm_lbselitemrange pbm_lbsetcaretindex pbm_lbsetcolumnwidth pbm_lbsetcurselpbm_lbsethorizontaltextpbm_lbsetitemdatapbm_lbsetitemheightpbm_lbsetselpbm_lbsettabstopspbm_lbsettopi

47、ndexpbm_endblclkpbm_enerrspacepbm_enselcancelpbm_enselchangeLB_GETITEMHEIGHTLB_GETITEMRECTLB_GETSELLB_GETSELCOUNTLB_GETSELITEMSLB_GETTEXTLB_GETTEXTLENLB_GETTOPINDEXLB_INSERTSTRINGLB_RESETCONTENTLB_SELECTSTRINGLB_SELITEMRANGELB_SETCARETINDEXLB_SETCOLUMNWIDTHLB_SETCURSELLB_SETHORIZONTALTEXTLB_SETITEMD

48、ATALB_SETITEMHEIGHTLB_SETSELLB_SETTABSTOPSLB_SETTOPINDEXLBN_DBLCLKLBN_ERRSPACELBN_SELCANCELLBN_SELCHANGE确定列表框控件中项的高度确定列表框的尺寸获得列表框中当前所选的项在多选列表框中获得所选项的数目用列表框中各自的项号填充给定的整数数组获得列表框中当前所选项的文本获得列表框中当前所选项的文本中的字符数确定列表框中可见的最上面一项的项号向列表框中加入一个新字符串重置(消除)列表框中的内容搜索并加亮与所给字符匹配的字符串选择 / 取消列表框中某一范围中的项设置列表框中的某一项拥有焦点设置列表框中

49、列的宽度在列表框中选择并加亮一项设置列表框中被水平卷滚的单元数设置与列表框相关的 32 位/4 字节值设置列表框中项的高度在列表框中选择一个字符串设置列表框控件中tabstops 的位置滚动列表框使特定的项成为可见的最上面项用户在列表框控件中的某一项上双击用户试图超越可在列表框中输入字符的最大限制当前选取文本被取消用户在列表框中选择或取消了一项(5) PB 的窗口自选事件及对应的系统消息,如表1-6 所示。 14PowerBuilder Win32 API程序设计(高级卷)表 1-6窗口事件及对应的系统消息PB 的事件 IDpbm_activateapppbm_askcbformatnamep

50、bm_charpbm_chartoitempbm_childactivatepbm_clearpbm_commandpbm_compactingpbm_compareitempbm_ctlcolorpbm_deadcharpbm_deleteitempbm_destroyclipboard pbm_devmodechanged pbm_drawclipboard pbm_drawitempbm_dropfilespbm_erasebkgndpbm_fontchangepbm_getdlgcodepbm_getfontpbm_getminmaxintopbm_gettextpbm_gettext

51、lengthpbm_hscrollclipboardpbm_iconerasebkgndpbm_initdialogpbm_initmenupbm_initmenupopuppbm_keydown对应的系统消息WM_ACTIVATEAPPWM_ASKCBFORMATNAMEWM_CHARWM_CHARTOITEM WM_CHILDACTIVATE WM_CLEAR WM_COMMANDWM_COMPACTINGWM_COMPAREITEMWM_CTLCOLORWM_DEADCHARWM_DELETEITEMWM_DESTROYCLIPBOARD WM_DEVMODECHANGED WM_DRA

52、WCLIPBOARD WM_DRAWITEMWM_DROPFILESWM_ERASEBKGNDWM_FONTCHANGEWM_GETDLGCODEWM_GETFONTWM_GETMINMAXINTOWM_GETTEXTWM_GETTEXTLENGTHWM_HSCROLLCLIPBOARDWM_ICONERASEBKGNDWM_INITDIALOGWM_INITMENUWM_INITMENUPOPUPWM_KEYDOWN消息作用被激活的窗口属于另外一个应用要求剪贴板中的内容被复制到一个使用自定义格式的文本缓冲区中传送键盘上按下的键通过转换键盘来的字符,帮助列表框定位其中的项一个子窗口被移动或激活

53、用户要删除当前编辑器控件中的内容用户选择了一个菜单项、控件或使用了加速键系统内存资源不足;当Windows 占用了多于1/8的 CPU 时间紧缩内存时,产生这条消息当新项被加入列表框或组合框时产生此消息,系统用这条消息进行项之间的比较一个控件即将被绘制,可在此时改变控件的颜色用户选择了一种非英语字符集或其他特殊字符集,这将改变下面将要输入的字符从列表框或组合框中移去一项剪贴板内容被清除WIN.INI中的一个设备名被修改剪贴板内容发生改变列表框或组合框的一项内容被改变当鼠标左键在一个注册为拖放文件接受器的应用上释放时,发出该消息窗口的客户区需要重画应用可用的字体数改变通知消息,说明当前使用哪种类

54、型的键盘获取当前激活的字体检索窗口可设置的最小或最大尺寸从一个控件 (如按钮或编辑器控件 )中复制文本到一个内存缓冲区用来确定一个控件中的字符数剪贴板的水平滚动条被使用一个最小化窗口需要重画背景一个对话框即将被显示一个菜单即将被显示一个弹出式窗口即将被显示键盘上的一个键被按下PB 的事件 IDpbm_keyuppbm_mdiactivepbm_mdicascadepbm_mdicreatepbm_mdidestroypbm_mdigetactivepbm_mdiiconrangepbm_mdimaximizepbm_mdinextpbm_mdirestorepbm_mdisetmenupbm_

55、mdifitlepbm_measureitempbm_menucharpbm_menuselectpbm_mouseactivatepbm_mousemovepbm_ncactivatepbm_nccalcsizepbm_nccreatepbm_ncdestroypbm_nchittestpbm_nclbuttondblclkpbm_ncpaintpbm_nextdlgctlpbm_paintclipboardpbm_paintPB 的事件 IDpbm_palettechangedpbm_paletteischangingpbm_parentnotifypbm_querydragiconpbm

56、_queryendsessionpbm_querynewpalettepbm_queryopenpbm_quit第 1 章 Windows对应的系统消息WM_KEYUPWM_MDIACTIVEWM_MDICASCADEWM_MDICREATEWM_MDIDESTROYWM_MDIGETACTIVEWM_MDIICONRANGEWM_MDIMAXIMIZEWM_MDINEXTWM_MDIRESTOREWM_MDISETMENUWM_MDIFITLEWM_MEASUREITEMWM_MENUCHARWM_MENUSELECTWM_MOUSEACTIVATEWM_MOUSEMOVEWM_NCACTI

57、VATEWM_NCCALCSIZEWM_NCCREATEWM_NCDESTROYWM_NCHITTESTWM_NCLBUTTONDBLCLKWM_NCPAINTWM_NEXTDLGCTLWM_PAINTCLIPBOARDWM_PAINT对应的系统消息WM_PALETTECHANGEDWM_PALETTEISCHANGINGWM_PARENTNOTIFYWM_QUERYDRAGICONWM_QUERYENDSESSIONWM_QUERYNEWPALETTEWM_QUERYOPENWM_QUIT系统的消息机制15续表消息作用键盘上的一个键被释放一个 MDI 子窗口(窗口)被激活以重叠的形式重排所有

58、的窗口创建一个窗口从 MDI 框架中移去一个窗口获得当前活动的 MDI 窗口的句柄在一个 MDI 框架中重排最小化窗口的图标最大化一个 MDI 子窗口激活下一个 MDI 子窗口(紧接着活动窗口的窗口)把 MDI 窗口恢复到它原来的大小将一个菜单与一个 MDI 窗口联系起来平铺所有的MDI 窗口这个消息被送给即将创建的、内有按钮或其他控件的窗口用户使用了一个快捷键 ,但系统不支持该快捷键用户选择了一个菜单项用户在一个非活动窗口中单击了鼠标用户移动了鼠标窗口的非客户区即将被激活窗口的尺寸需要重新计算窗口即将创建它的非客户区窗口的非共享区被析构每次非客户区被移动时都发送该消息用户在非客户区双击了鼠标

59、非客户需要画出在对话框中将焦点转给另一个控件剪贴板应用有剪贴操作,剪贴板查看器需重画窗口的客户区需要被画出消息作用系统调色板被改变系统调色板即将被改变通知父窗口一个子窗口即将被创建用户要拖动一个最小化窗口通知消息,说明窗口即将被关闭应用即将收到输入焦点, 应该执行必要的颜色调整一个最小化窗口即将被恢复应用处理的最后一个消息 16PB 的事件 IDpbm_renderallformatspbm_renderformatspbm_setcursorpbm_setfontpbm_setredrawpbm_settextpbm_sizeclipboardpbm_spoolerstatuspbm_syscharpbm_syscolorchangepbm_syscommandpbm_sysdeadcharpbm_syskeydownpbm_syskeyupp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论