收藏 分销(赏)

Windows系统的消息机制.doc

上传人:xrp****65 文档编号:7687225 上传时间:2025-01-12 格式:DOC 页数:18 大小:371.50KB 下载积分:10 金币
下载 相关 举报
Windows系统的消息机制.doc_第1页
第1页 / 共18页
Windows系统的消息机制.doc_第2页
第2页 / 共18页


点击查看更多>>
资源描述
·19· 第1章 Windows系统的消息机制 第1章 Windows系统的消息机制 对诸如PowerBuilder(后文简写为PB)、Visual Basic和Dephi等大多数可视化程序设计语言来讲,程序设计的核心是对象的事件、属性和方法,但对Windows系统本身而言,却是以消息处理为其控制机制。Windows把系统中的对象都作为窗口来对待,每个窗口都有一个用来标识其身份的句柄。Windows通过向窗口发送消息,在开发语言中转化为对象的事件,然后驱动对象,响应用户的动作。在许多面向对象的可视化程序设计语言中,Windows的众多消息已经演变成了对象的属性或方法。本章内容包括Windows系统的消息机制、消息的发送、消息的应用实例等。 1.1 Windows的工作机制 1.1.1 Windows 的工作方式——窗口、事件和消息 全面地讨论Windows的内部工作机制需要很大的篇幅,对于一般的PB用户当然没有必要深入了解所有的技术细节。Windows系统的工作机制,简单地说就是3个关键的概念:窗口、事件和消息。 不妨简单地将窗口看做带有边界的矩形区域。读者也许已经了解多种不同类型的窗口,如Windows系统的“资源管理器”窗口、文字处理程序中的文档窗口或者弹出提示有约会信息的消息对话框窗口等。除了这些最普通的窗口外,实际上还有许多其他类型的窗口。命令按钮是一个窗口,图标、文本框、选项按钮和菜单条也都是窗口。 Windows 操作系统通过给每一个窗口指定一个惟一的标识号(窗口句柄,常用hWnd表示)来管理所有的窗口。操作系统连续地监视每一个窗口的活动或事件的信号。事件可以通过诸如单击鼠标或按下按键的操作而产生,也可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。 每发生一次事件,将引发一条消息发送至操作系统。操作系统处理该消息并广播给其他窗口。然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如,当窗口解除了其他窗口的覆盖时,重新绘制自身窗口)。 可以想象,处理各种窗口、事件和消息的所有可能的组合将有惊人的工作量。幸运的是,PB使用户摆脱了所有的低层消息处理。许多消息由PB自动处理了,其他的作为事件过程由编程者自行处理,这样可以快速创建强大的应用程序,而毋需涉及不必要的细节。 1.1.2 句柄的概念 在解释消息之前,首先了解系统如何准确地将消息发送到指定的窗口。当一个应用或多个应用运行后,会同时创建许多个窗口,Windows作为系统的“大总管”,那么它又是如何识别每一个窗口呢?在程序设计时,通过窗口的名称属性,为每个窗口命名,然后在程序其他部分把窗口名作为识别窗口的标识。这种通过为窗口命名来识别不同窗口的方法,对Windows系统来讲显然是不现实的。Windows系统是通过称之为句柄的标识符来识别每一个窗口。 句柄是系统动态分配给窗口的32位整型数标识值,常用hWnd表示,即英文handle to a window的缩写。大量API函数都需要窗口句柄作参数,或返回一个窗口或设备场境的句柄。句柄可以通俗地理解为Windows为系统中所有存在的窗口动态分配的身份识别号码。 在PB中,可以通过handle函数来取得窗口和控件的句柄,当声明API函数时,常把保存句柄的变量声明为Long或Ulong长整型数据类型。Windows为窗口和控件分配句柄标识是动态,同样的程序每次运行时和在不同计算机上运行时所分配的窗口句柄标识可能是完全不一样的。 窗口的句柄属性仅能在运行时访问,该属性对窗口的外观并没有任何影响,它仅作为API函数调用的参数或返回值,或其他需识别窗口或对象的地方。在后面章节中,读者将会看到几乎所有涉及窗口的API函数都需要传递hWnd参数,以便函数准确获得用户要处理的窗口或对象。 句柄作为由操作系统定义的惟一的长整型值,可以用它来引用窗体和控件等对象。在Windows系统中,API函数的调用常用的句柄包括窗口句柄,菜单句柄、设备对象句柄、设备场景句柄,等等。如果函数需要用句柄作为参数,则应该把参数声明为传值,对于返回句柄的API函数,应将返回的句柄值声明为Long或Ulong类型数据类型。句柄是一种标识符(ID)编号,而不是指针或者数值,不要试图对它们进行任何数学运算。 1.1.3 消息的概念 Windows系统是以消息处理为其控制机制,系统通过消息为窗口过程(windows procedure)传递输入。系统和应用两者都可以产生消息。对于每个输入事件,例如用户按下了键盘上的某个键、移动了鼠标、单击了一个控件上的滚动条,等等,系统都将产生一系列消息。此外,对于应用带给系统的变化,如字体资源的改变、应用本身窗口的改变,系统都将通过消息以响应这种变化。应用通过产生消息指示应用的窗口完成特定的任务,或与其他应用的窗口进行通信。 每个窗口都有一个处理Windows系统发送消息的处理程序,称为窗口程序。它是隐含在窗口背后的一段程序脚本,其中包含对事件进行处理的代码。 Windows系统为每条消息指定了一个消息编号,例如当一个窗口变为活动窗口时,它事实上是收到一条来自Windows系统的WM_ACTIVATE消息,该消息的编号为6,它对应于PB窗口的Activate事件。对于窗口来说,诸如Open、Activate、MouseDown、Resize等事件,实际上对应的是窗口内部的消息处理程序,这些程序对于用户来讲是不可见的。类似地,命令按钮也有消息处理程序,它的处理程序响应诸如WM_LBUTTONDOWN和WM_RBUTTONDOWN之类的消息,即激活命令按钮的MouseDown事件。 系统向窗口发送的消息通常包含3个参数,分别是: (1)窗口句柄(a window handle):窗口句柄用来标识消息将要发送到的窗口对象,系统使用窗口句柄来确定哪一个窗口句柄应该接收该消息。 (2)消息标识符(a message identifier):消息标识符是用来区分不同消息的命名常量,当窗口过程接收到一个消息时,它使用消息标识符来确定如何处理该消息。例如,消息标识符WM_PAINT告诉窗口过程“窗口的客户区已经发生变化,窗口必须进行重新绘制”。 (3)消息参数(message parameters):消息参数用来表述窗口过程处理消息时所使用的数据或数据的位置,通常用一对参数表示。消息参数的意义和取值取决于消息。消息参数取值可以是整型数、Bit位标识、指向结构的指针,等等,当不需要使用消息参数时,通常将其设置为NULL。窗口过程必须通过检查消息标识符来确定如何对消息参数进行解释。 有关消息标识符、消息参数的具体使用,将在后面介绍Sendmessage函数时给予进一步 解释。 1.1.4 消息的类型 1.系统定义的消息 当系统与应用进行通信时,系统将发送或邮寄消息。系统通过这些消息控制应用的运行,并为应用的进程提供输入或其他信息。应用内部也可发送或邮寄系统定义的消息,应用通常使用这些消息控制由预先注册的窗口类创建的窗口的操作。 每一个系统定义的消息都有一个惟一的消息标识符(值),并用一个表明消息用途标识符常量表示(这些在SDK的头文件中定义)。如WM_PAINT消息标识符表示要求窗口进行重绘的消息。 消息标识符常量前缀表示消息所属的消息类别,如WM_表示窗口类消息,BM_表示按钮类消息,表1-1给出了不同类别消息的前缀。 在PB中,消息标识符常量通常声明为窗口或对象的实例常量,例如: CONSTANT long WM_MOUSEMOVE = 512 CONSTANT long WM_LBUTTONDOWN = 513 CONSTANT long WM_LBUTTONUP = 514 CONSTANT long WM_LBUTTONDBLCLK = 515 CONSTANT long WM_RBUTTONDOWN = 516 CONSTANT long WM_RBUTTONUP = 517 CONSTANT long WM_RBUTTONDBLCLK = 518 表1-1 Windows系统定义的消息类别 消息标识符前缀 消息分类 ABM 应用桌面工具栏消息 BM 按钮控件消息 CB 组合框控件消息 CBEM 扩展组合框控件消息 CDM 通用对话框消息 DBT 设备消息 DL 拖曳列表框控件消息 DM 默认按钮控件消息 DTM 日期时间选取控件消息 续表 消息标识符前缀 消息分类 EM 编辑控件消息 HDM 头控件消息 HKM 热键控件消息 IPM IP地址控件消息 LB 列表框控件消息 LVM 列表视图控件消息 MCM 月历控件消息 PBM 进度条控件消息 PGM Pager控件消息 PSM 属性页面消息 RB Rebar 控件消息 SB 状态栏窗口消息 SBM 滚动条控件消息 STM 静态控件消息 TB 工具栏消息 TBM 跟踪条控件消息 TCM Tab 控件消息 TTM Tooltip控件消息 TVM 树形控件消息 UDM Up-down 控件消息 WM 普通窗口消息 Windows系统使用了成千上万条消息。从窗口到控件都有一组可接收和响应的消息。在Visual Basic的API浏览器中,以常量的方式列出了Windows的大部分消息。 据粗略统计,微软在MSDN中列出的消息约有数千种,全部弄清楚这么多种消息是不现实的,也是没有必要的。这是因为PB已经将很多消息封装为了对象的“属性”(例如窗口的Title和WindowState属性)和“方法(函数)”(例如关闭窗口函数Close)。可以发现,消息可能演变成PB对象的属性、方法(函数)和事件。既然PB已经对消息进行了封装,那么又何必使用消息来进行程序设计呢?这时因为,PB提供的事件、属性和方法并未完全涵盖所有消息,为了弥补PB在某些功能的不足,常使用系统消息或应用自定义的消息来强化PB的程序设计。 2.应用定义的消息 应用也可以创建自己的消息,并将消息应用于它的窗口或与其他窗口的进程进行通信。如果应用创建了自己的消息,接收消息的窗口过程必须解释消息,同时对消息进行恰当的处理。 系统保留的消息标识符的取值范围为0x0000~0x03FF(0~1023),专门用于系统定义的消息;应用定义的消息不能使用这些值,应用定义的消息取值范围为0x0400~0x7FFF(0~32767)。 RegisterWindowMessage函数提供了分配消息编号的功能,该函数用一个消息名称作为参数,并为这个名称分配一个惟一的、尚未使用过的编号。 1.1.5 用于发送消息的API函数 Windows应用程序允许应用程序向自己或其他应用程序发送消息,甚至可以向Windows操作系统本身发送消息(比如要求关闭操作系统或重新启动操作系统)。Windows提供了2个专门用于发送消息的API函数SendMessage和PostMessage。 1.SendMessage函数 SendMessage函数发送指定的消息到窗口或Windows系统,然后函数调用窗口的处理消息的过程,并等待窗口过程处理完消息后返回。 C原型 LRESULT SendMessage(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam ); PB声明 FUNCTION Long SendMessage(Long hwnd, Long wMsg, Long wParam, Long lParam) LIBRARY "user32.dll" ALIAS FOR "SendMessageA" 参 数 hWnd 为接收消息窗口的句柄; wMsg 指定要发送的消息; wParam 依赖于消息wMsg的其他信息; lParam 依赖于消息wMsg的其他信息。 返回值 函数返回消息的处理结果,该值取决于消息的类型。 wParam和lParam两个参数的含义随消息wMsg参数不同而改变,因此每当向窗口传递某种消息时,除了要了解该消息的含义外,还要注意wParam和lParam的含义和设置。 SendMessage函数会返回一个Long值,由于这个函数是直接调用窗口程序,因此窗口程序可以返回一个值,把它作为SendMessage函数的返回值,这个返回值的具体含义由消息决定。不过,除非在MSDN明确列出了该消息的返回值,否则,返回值就没有具体意义,应该忽略。此外,在使用返回值时,通常调用SendMessageTimeOut函数检查是否超时,因为只有在消息完全处理完毕后,才能得到一个有效返回值。 前面曾提到默认的窗口过程函数DefWindowProc用来处理应用程序无法处理的消息,该函数确保所有消息都要处理,无论这些消息是否对窗口有用。调用DefWindowProc函数时,需要传入与窗口消息处理过程相同的参数。 C原型 LRESULT DefWindowProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); PB声明 FUNCTION Long DefWindowProc(Long hwnd,Long wMsg,Long wParam,Long lParam) LIBRARY "user32.dll" ALIAS FOR "DefWindowProcA" 参 数 hWnd 窗口句柄; wMsg 指定要发送的消息; wParam 依赖于消息wMsg的其他信息; lParam 依赖于消息wMsg的其他信息。 返回值 函数返回消息的处理结果,该取决于消息的类型。 2. PostMessage函数 PostMessage函数同SendMessage类似,它把消息放在指定窗口创建的线程的消息队列中,然后不等消息处理完就返回,而不像SendMessage那样必须等到消息处理完毕才返回。目标窗口通过GetMessage或PeekMessage从消息队列中取出并处理。 C原型 LRESULT PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); PB声明 FUNCTION Long PostMessage (Long hwnd,Long wMsg,Long wParam,Long lParam) LIBRARY "user32.dll" ALIAS FOR " PostMessageA" 参 数 hWnd 为接收消息窗口的句柄; Msg 指定要发送的消息; wParam 依赖于消息Msg的其他信息; lParam 依赖于消息Msg的其他信息。 返回值 如果函数调用成功,函数返回值为非0;如果调用失败,函数返回0。 示 例 下面代码演示了如何通过发送消息,在PB应用中关闭另外运行的第三方程序。 (1)运行Windows的系统的记事本程序NotePad,并创建一个未命名的文档。 (2)在PB中新建一个窗口,为窗口声明如下对象级外部函数和实例变量: FUNCTION Long FindWindow(String lpClassName, String lpWindowName) LIBRARY "user32.dll" ALIAS FOR "FindWindowA" FUNCTION Long PostMessage(Long hwnd, Long wMsg, Long wParam, Long lParam) LIBRARY "user32.dll" ALIAS FOR "PostMessageA" Constant long WM_QUIT = 18 (3)在窗口上放置一个按钮控件,为按钮的Clicked事件加入如下脚本: String ls_sTitle, pbNullString Long ll_iHwnd, ll_ihTask Long ll_iReturn SetNull(pbNullString) ls_sTitle = "未定标题 – 记事本" ll_iHwnd = FindWindow(SetNull, ls_sTitle) ll_iReturn = PostMessage(ll_iHwnd, WM_QUIT, 0, 0) MessageBox("提示信息","记事本已经关闭!") 上述代码运行后,使用FindWindow函数获取Windows记事本程序窗口的句柄,然后向记事本窗口发送WM_QUIT消息,记事本程序将被关闭。 1.2 事件与消息 1.2.1 从消息到事件 虽然在前面提到Windows系统会产生事件来驱动对象,但更严格的讲Windows先产生消息,然后由PB将其转化为驱动对象的事件。那么PB是如何将消息转换为事件呢? 1.1节介绍了消息的概念。也可以通俗地将消息理解为由Windows操作系统送往程序的事件。它是系统中各个控件(窗口)沟通的方式。举例来说,当移动鼠标、按下鼠标键、改变窗口视窗大小时,Windows都会送出消息以通知程序。当然,为了要辨别事件的内容,Windows系统中预定义了许多的消息,如WM_PAINT,WM_CHAR等。 当事件发生时,Windows系统根据窗口的身份码——句柄hWnd,判断该事件必须由哪个窗口接收,然后将事件以消息的方式送往程序的窗口中。虽然在Windows系统中包含了数以百计的事件,但是操作系统并没有为各个事件设计不同的消息结构,而是以一个一般性的结构来描述消息, Windows使用了一个特殊的函数来实现这一过程,这个函数的名称叫做“窗口处理函数”或者叫做“窗口消息处理函数”,该函数就是WindowProc。 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); 从函数的定义可以看出,任何要发送的消息都有4个参数,其中: HWND hwnd——发送窗口的句柄 UINT uMsg——消息代码 Windows中每一个消息都有惟一的一个代码。在Visual Basic的API文本浏览器中以常量的格式列出了所有消息名和代码,在PB中也可以直接利用Visual Basic的API文本浏览器列出的这些消息,惟一需要做的就是将Visual Basic十六进制消息代码转换为PB的十进制,如在Visual Basic声明定义的有关鼠标移动的消息: Public Const WM_MOUSEMOVE = &H200 在PB中应声明为: Constant Long WM_MOUSEMOVE = 512 WPARAM wParam和LPARAM lParam为两个32位的长整型值,用来指定当前发送消息时所带信息,如在鼠标移动时返回鼠标的位置等。 当Windows有消息需要通知程序的时候,它就会调用该函数,然后自己的程序就从中检测发送的消息。Windows中消息的种类是很多的,不可能也没有必要检测所有的消息,只需要检测感兴趣的消息即可。检测消息的程序其实就是一个条件判断组合,如图1.1所示。 那么未处理的消息到那里去了?Windows系统为窗口提供了默认的窗口过程DefWindowProc,这个窗口过程将负责处理那些不需要的消息。正因为有了这个默认窗口过程,才可以利用Windows的窗口进行开发,而不必过多关注窗口各种消息的处理。例如,窗口在被拖动时会有很多消息发送,可以不予理睬让系统自己去处理。 图1.1 消息处理流程 从上面分析可以看出,事件驱动机制是针对诸如PB、Visual Basic这类面向对象的开发环境而言,在其背后隐含的是Windows系统的消息驱动机制,但Windows系统的消息驱动应用范围要比高级开发语言定义的事件驱动范围广泛的多。 1.2.2 PB事件对消息的封装 在PB中,除了为窗口和控件预置的事件外,PB还将Windows系统的许多消息封装为用户自选事件,根据与Windows系统的消息的对应关系,为每个事件定义了EventID,如图1.2所示。 当窗口或控件的预置事件无法满足程序设计要求时,可以使用这些自选事件。如在设备场景中绘制的位图,当窗口大小改变时,位图并不会自动重绘。这时就需要使用窗口的事件ID号位pbm_paint事件,该事件与窗口的WM_PAINT消息相对应,当窗口发生变化时强迫窗口重绘。在PB中,事件ID的作用是把PB的事件与系统消息联系起来,被用户的动作或其他系统活动触发的事件必须具有ID号。对于PB的系统对象,如窗口、按钮等控件,定义好的系统事件通常都使用ID号。 当用户使用自选事件时,可以使用如图1.2所示列在Event Declaration对话框中的事件ID号,用来响应某个系统消息。如果定义被系统消息触发的用户自选事件,可以从ID号列表中选择事件ID号。其中,列在Event对话框中的所有以pbm_前缀开始的ID号,为映射到PB中的系统消息。在定义用户自选事件时,不能修改与事件ID号相关的参数及返回值,因为这些是整个事件ID号的具体组成部分。如果与事件ID号相应的系统消息发生时,PB触发该事件,并为事件的参数赋值。如果用户自定义事件,并且与系统消息无关,则不为事件选择ID号。这样事件将不会被用户的动作或系统的活动触发,只能在应用中用脚本来触发。 图1.2 PB的用户自选事件 由于PB的技术开发文档中并未列出每个事件ID的具体含义及与Windows系统消息的对应关系,用户在使用这些自选事件时常常感到困惑。为此,笔者将这些事件与Windows系统的消息的对应关系及具体含义逐一进行了分析,这些PB的自选事件ID涵盖了窗口消息,以及按钮、组合框、列表框、编辑掩码等控件的消息,下面逐一列在表1-2~1-8中,供读者参考。 (1)PB的按钮自选事件及对应的系统消息,如表1-2所示。 (2)PB的组合框控件(ComBox)自选事件及对应的系统消息,如表1-3所示。 表1-2 按钮事件及对应的系统消息 PB的事件ID 对应的系统消息 消息作用 pbm_bmgetstate BM_GETSTATE 按钮是否加亮 pbm_bmsetcheck BM_SETCHECK 设置按钮的选中或未选中状态 pbm_bmsetstate BM_SETSTATE 加亮或不加亮按钮 pbm_bnclicked BN_CLICKED 按钮控件被单击 pbm_bndisable BN_DISABLE 使按钮控件无效 pbm_bndoubleclicked BN_DOUBLECLICKED 按钮控件被双击 pbm_bndragdrop BN_DRAGDROP 一个对象被放到按钮控件 pbm_bndragenter BN_DRAGENTER 一个对象被拖到按钮控件 pbm_bndragleave BN_DRAGLEAVE 一个对象被拖离按钮控件 pbm_bndragover BN_DRAGOVER 一个对象被拖经按钮控件 pbm_bnhilite BN_HILITE 按钮控件被加亮 pbm_bnpaint BN_PAINT 按钮控件被绘制 pbm_bnsetfocus BN_SETFOCUS 按钮控件获得焦点 pbm_bnunhilite BN_UNHILITE 按钮控件不被加亮 表1-3 组合框事件及对应的系统消息 PB的事件ID 对应的系统消息 消息作用 pbm_cbaddstring CB_ADDSTRING 将字符串加到组合框 pbm_cbdeletestring CB_DELETESTRING 从组合框删除一个字符串 pbm_cbdir CB_DIR 加一个目录列表到组合框 pbm_cbfindstring CB_FINDSTRING 搜索以一组字符开头的字符串 pbm_cbfindstringexact CB_FINDSTRINGEXACT 搜索与所提供的字符完全匹配的字符串 pbm_cbgetcount CB_GETCOUNT 列表框中的项数 pbm_cbgetcursel CB_GETCURSEL 当前被选项的数目 pbm_cbgetdroppedcontrolset CB_GETDROPPEDCONTROLSET 列表框在屏幕上的坐标位置 pbm_cbgeteditsel CB_GETEDITSEL 编辑器控件中被选字符的范围 pbm_cbgetextendedui CB_GETEXTENDEDUI 默认或扩展的用户界面 pbm_cbgetitemdata CB_GETITEMDATA 重画的列表框中的4字节(32位)项 pbm_cbgetitemheight CB_GETITEMHEIGHT 列表框中某一项的高度 pbm_cbgetlbtext CB_GETLBTEXT 列表框中的文本 pbm_cbgetlbtextlen CB_GETLBTEXTLEN 列表框中文本的长度 pbm_cbinsertstring CB_INSERTSTRING 向列表框中插入新的字符串项 pbm_cblimittext CB_LIMITTEXT 限制能被输入到列表框中的字符数 pbm_cbresetcontent CB_RESETCONTENT 删除列表框中所有内容 pbm_cbselectstring CB_SELECTSTRING 搜索匹配的字符串并显示 pbm_cbsetcursel CB_SETCURSEL 在列表框中选择并显示一项 pbm_cbseteditsel CB_SETEDITSEL 在列表框的编辑区域中选择一块文本 pbm_cbsetextendedui CB_SETEXTENDEDUI 设置默认或扩展的用户界面 pbm_cbsetitemdata CB_SETITEMDATA 在列表框中设定4字节(32位)项 pbm_cbsetitemheight CB_SETITEMHEIGHT 设置列表框中项的高度 pbm_cbshowdropdown CB_SHOWDROPDOWN 显示或隐藏列表框中下拉列表区域 pbm_cbndblclk CBN_DBLCLK 用户在列表中某一项上双击鼠标 pbm_cbndragdrop CBN_DRAGDROP 一个对象被放到组合框控件上 pbm_cbndragenter CBN_DRAGENTER 一个对象被拖到组合框控件上 pbm_cbndragleave CBN_DRAGLEAVE 一个对象被拖离组合框控件 pbm_cbndragover CBN_DRAGOVER 一个对象被拖经组合框控件 pbm_cbndropdown CBN_DROPDOWN 列表框的下拉区域即将被显示 pbm_cbneditchange CBN_EDITCHANGE 编辑器控件中的文本发生变化 pbm_cbneditupdate CBN_EDITUPDATE 列表框编辑器控件中的文本即将被改变 pbm_cbnerrspace CBN_ERRSPACE 列表框满,不能再向其中加入项 pbm_cbnkillfocus CBN_KILLFOCUS 通用列表框失去焦点 pbm_cbnselchange CBN_SELCHANGE 列表框中被选文本被改变 pbm_cbnselendcancel CBN_SELENDCANCEL 用户按下了“取消”按钮 pbm_cbnselendok CBN_SELENDOK 用户按下了“确认”按钮 pbm_cbnsetfocus CBN_SETFOCUS 通用对话控件拥有焦点 (3)PB的编辑控件(EditMask)自选事件及对应的系统消息,如表1-4所示。 (4)PB的列表框控件(ListBox)自选事件及对应的系统消息,如表1-5所示。 表1-4 编辑控件事件及对应的系统消息 PB的自选事件ID 对应的系统消息 消息作用 pbm_emcanundo EM_CANUNDO 编辑器控件是否能撤消上一次修改 pbm_ememptyundobuffer EM_EM_PTYUNDOBUFFER 清空由Windows管理的取消操作的缓冲区 pbm_emfmtlines EM_FMTLINES 在多行编辑器控件的行尾增加或删除回车换行 pbm_emgetfirstvisibleline EM_GETFIRSTVISIBLELINE 返回编辑器控件中可见的第一行的行号 pbm_emgethandle EM_GETHANDLE 获得编辑器控件使用的内存句柄 pbm_emgetline EM_GETLINE 从编辑器控件中复制一行到内存缓冲区 pbm_emgetlinecount EM_GETLINECOUNT 返回多行编辑器控件的行数 pbm_emgetmodify EM_GETMODIFY 文本是否被用户修改 pbm_emgetrect EM_GETRECT 返回控件的长方形域 pbm_emgetsel EM_GETSEL 返回被选文本的起始位置 pbm_emlimittext EM_LIMITTEXT 限制用户键入的文本长度 pbm_emlinefromchar EM_LINEFROMCHAR 返回被选文本的行号 pbm_emlineindex EM_LINEINDEX 返回控件中被选行第一个字符在编辑串中的位置 pbm_emlinelength EM_LINELENGTH 返回编辑器控件中被选行中的字符数 pbm_emlinescroll EM_LINESCROLL 水平或垂直卷滚编辑器控件 pbm_emreplacesel EM_REPLACESEL 从剪贴板或从键盘上用新文本替换被选文本 pbm_emsethandle EM_SETHANDLE 设置编辑器控件的句柄 pbm_emsetmodify EM_SETMODIFY 设置编辑器控件的modified标志 pbm_emsetpasswordchar EM_SETPASSWORDCHAR 设置用户输入任何文本时显示的字符,在输入密码时的显示 pbm_emsetrect EM_SETRECT 设置/重置编辑器控件所在的长方形区域,编辑器控件中的文本被重画 pbm_emsetrectnp EM_SETRECTNP 除了不重画文本,大致与setrect相同 pbm_emsetsel EM_SETSEL 选择字符 pbm_emsettabstops EM_SETTABSTOPS 在多行编辑器控件中设置tabstops pbm_emsetwordbreak EM_SETWORDBREAK 设置新的词拆分函数 pbm_emsetwordbreakproc EM_SETWORDBREAKPROC 设置新的词拆分过程 pbm_emundo EM_UNDO 撤消最近的编辑操作 pbm_enchange EN_CHANGE 编辑器控件中的文本发生改变 pbm_enerrspace EN_ERRSPACE 编辑器控件内存缓冲区溢出 pbm_enhscroll EN_HSCROLL 用户点中上水平滚动条 pbm_enmaxtext EN_MAXTEXT 用户试图输入比允许更多的文本 pbm_enupdate EN_UPDATE 编辑器控件即将显示用户的修改 pbm_envscroll EN_VSCROLL 用户点中垂直滚动条 表1-5 列表框控件事件及对应的系统消息 PB的事件ID 对应的系统消息 消息作用 pbm_lbaddstring LB_ADDSTRING 向列表框控件中增加一项或一个字符串 pbm_lbdeletestring LB_DELETESTRING 从列表框中删除一项或一个字符串 pbm_lbdir LB_DIR 用目录列表填充列表框 pbm_lbfindstring LB_FINDSTRING 在列表框中搜索与所给字符串匹配的项 pbm_lbfindstringexact LB_FINDSTRINGEXACT 在列表框中搜索与所给字符串精确匹配的项 pbm_lbgetcaretindex LB_GETCARETINDEX 在列表框中搜索拥有焦点的项 pbm_lbgetcount LB_GETCOUNT 确定列表框中的项数 pbm_lbgetcursel LB_GETCURSEL 确定所选项是第几项 pbm_lbgethorizontalextent LB_GETHORIZONTALEXTENT 获得列表框的宽度、计算水平卷滚 pbm_lbgetitemheight LB_GETITEMHEIGHT 确定列表框控件中项的高度 pbm_lbgetitemrect LB_GETITEMRECT 确定列表框的尺寸 pbm_lbgetsel LB_GETSEL 获得列表框中当前所选的项 pbm_lbgetselcount LB_GETSELCOUNT 在多选列表框中获得所选项的数目 pbm_lbgetselitems LB_GETSELITEMS 用列表框中各自的项号填充给定的整数数组 pbm_lbgettext LB_GETTEXT 获得列表框中当前所选项的文本 pbm_lbgettextlen LB_GETTEXTLEN 获得列表框中当前所选项的文本中的字符数 pbm_lbgettopindex LB_GETTOPINDEX 确定列表框中可见的最上面一项的项号 pbm_lbinsertstring LB_INSERTSTRING 向列表框中加入一个新字符串 pbm_lbresetcontent LB_RESETCONTENT 重置(消除)列表框中的内容 pbm_lbselectstring LB_SELECTSTRING 搜索并加亮与所给字符匹配的字符串 pbm_lbselitemrange LB_SELITEMRANGE 选择/取消列表框中某一范围中的项 pbm_lbsetcaretindex LB_SETCARETINDEX 设置列表框中的某一项拥有焦点 pbm_lbsetcolumnwidth LB_SETCOLUMNWIDTH 设置列表框中列的宽度 pbm_lbsetcursel LB_SETCURSEL 在列表框中选择并加亮一项 pbm_lbsethorizontaltext LB_SETHORIZONTALTEXT 设置列表框中被水平卷滚的单元数 pbm_lbsetitemdata LB_SETITEMDATA 设置与列表框相关的32位/4字节值 pbm_lbsetitemheight LB_SETITEMHEIGHT 设置列表框中项的高度 pbm_lbsetsel LB_SETSEL 在列表框中选择一个字符串 pbm_lbsettabstops LB_SETTABSTOPS 设置
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服