第六讲:子窗口控制

上传人:M****1 文档编号:490308047 上传时间:2022-11-01 格式:DOC 页数:22 大小:155.50KB
返回 下载 相关 举报
第六讲:子窗口控制_第1页
第1页 / 共22页
第六讲:子窗口控制_第2页
第2页 / 共22页
第六讲:子窗口控制_第3页
第3页 / 共22页
第六讲:子窗口控制_第4页
第4页 / 共22页
第六讲:子窗口控制_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《第六讲:子窗口控制》由会员分享,可在线阅读,更多相关《第六讲:子窗口控制(22页珍藏版)》请在金锄头文库上搜索。

1、第六讲:子窗口控制控制(控件)是一种特殊的子窗口,也属于某个窗口类,这个窗口类或者是已经预先定义好的,或者是由拥有者(开发者)定义。窗口类以及对应的窗口过程定义了控制的属性,包括其外观、行为、目的等。应用程序既可以通过在调用CreateWindow时指定窗口类的类名来单独创建一个控制,也可以在对话框模板中指定一些控制,然后由系统为其创建。预定义控制:操作系统为一些控制提供了已经定义好的窗口类及对应的窗口过程。属于这些窗口类的控制称为预定义控制。类名说明BUTTON按钮COMBOBOX组合框EDIT编辑框LISTBOX列表框RichEditRichEdit 1.0RICHEDIT_CLASSRi

2、chEdit 2.0或3.0SCROLLBAR滚动条STATIC静态控件表一、系统预定义的控制每个预定义控制窗口类都有一组相关的控制样式,使它们在应用程序中展现出不同的外观和行为,例如BUTTON窗口类支持push buttons, radio buttons, check boxes, group boxes等样式;每个预定义控制窗口类同时还有一组相关的通知和控制消息,应用程序通过这些消息确定用户何时及怎样对这些控制进行输入。通知消息:当系统为对话框创建了控制时,这些控制就成为对话框的子窗口;当应用程序创建控制时,这些控制就成为由应用程序指定的某个窗口的子窗口。这些子窗口控制接收到用户的输入

3、时,会向其父窗口发送通知消息。应用程序通过这些消息来确定用户想让它们完成什么工作。例如,当用户点击push button时,按钮会向父窗口发送BN_CLICKED消息。这些通知消息以WM_COMMAND形式出现,消息中包含子窗口控制标识和通知码。参数说明LOWORD(wParam)子窗口ID号HIWORD(wParam)通知码,告诉父窗口到底发生了什么变化,通知码和控件的类型以及事件相关,系统对每一类控件的每个事件的通知码都有明确的定义,用一个系统定义的整常量来表示LParam子窗口句柄表二、WM_COMMAND通知消息子窗口控制标识是一个由应用程序指定的唯一ID,用以代表这个控制,这个标识既

4、可以在CreateWindowEx的hMenu参数中指定,也可以在DLGITEMTEMPLATEEX结构的id成元中指定。由于控制本身并不知道其自身的标识,在向父窗口发送通知消息之前,必须查询其自身标识。以下是经常用到的与子窗口标识相关的API:知道子窗口ID号和父窗口句柄,找子窗口句柄:hwndChild=GetDlgItem(hwndParent,id);知道子窗句柄, 找子窗口ID:id=GetWindowLong(hwndChild,GWL_ID);id=GetDlgCtrlID(hwndChild);知道子窗句柄, 找父窗口句柄:hwndParent =GetParent(hwndC

5、hild);控制消息:应用程序可以利用SendMessage向子控制发送消息,来指导子窗口控制完成特定的任务。每种控制消息的目的和功能是与特定控制的窗口类相关的,并且由窗口类对应的窗口过程定义。控制消息既可以是预先定义好的如WM_GETTEXT和 WM_GETDLGCODE等,也可以由应用程序自定义。通常情况下,对于由应用程序创建的控制,窗口过程应当处理如下消息:消息说明WM_GETDLGCODEProcess if the control uses the ENTER, ESC, TAB, or arrow keys. The IsDialogMessage function sends t

6、his message to controls in a dialog box to determine whether to process the keys or pass them to the control.WM_GETFONTProcess if the WM_SETFONT message is also processed.WM_GETTEXTProcess if the control text is not the same as the title specified by the CreateWindowEx function.WM_GETTEXTLENGTH同上WM_

7、SETTEXT同上WM_SETFOCUSProcess if the control displays a caret, a focus rectangle, or another item to indicate that it has the input focus.WM_KILLFOCUS同上WM_SETFONTProcess if the control displays text. The system sends this message when creating a dialog box that has the DS_SETFONT style.对于由应用程序自定义的控制消息

8、,必须通过调用SendMessage或SendDlgItemMessage来显式发送给控制。每条消息的标识ID必须唯一并且不能与已知的其它窗口消息ID相冲突,自定义消息一般以WM_USER开始加上某个数值。自定义控制:应用程序可以创建自定义控制,以实现预定义控制不支持的功能,Windows提供三种创建自定义控制的方式。1、 利用所有者绘制控制按钮、列表框和组合框都可以采用所有者绘制样式,以使得它们在将要被绘制时,会把消息发送给父窗口,应用程序接收到这些消息时,可以进行自定义绘制,以改变这些控制的外观。例如,在列表框中每个元素之前都显示一个小位图。2、 窗口子类化子类化一个预定义控制是创建自定义

9、控制的另一种方式。子类化窗口过程可以通过处理控制的某些特定消息来改变其行为,而其它未处理的消息仍然转发给原来的窗口过程。例如,应用程序可以处理编辑框的WM_PAINT消息来显示不同的字体和字号。3、 应用程序自定义窗口类自定义控制窗口类与普通窗口类一样,需要指定类名及实现对应的窗口过程,然后可以在CreateWindowEx的参数中指定类名,或者在对话框模板中指定类名。对于这种自定义控制,其对应的窗口过程最少需要对其绘制,如果想接收输入,还需要处理鼠标和键盘消息,并且向父窗口发送通知消息。按钮:按钮的样式包括BS_CHECKBOX、BS_DEFPUSHBUTTON、BS_GROUPBOX、BS

10、_PUSHBUTTON、BS_RADIOBUTTON、BS_AUTOCHECKBOX、BS_3STATE等。按钮接受用户输入或将要进行绘制时向父窗口发送BN_CLICKED、BN_PAINT、BN_DISABLE、BN_PUSHED、BN_UNPUSHED、BN_DBLCLK、BN_SETFOCUS、BN_KILLFOCUS 、WM_CTLCOLORBTN等消息。父窗口向按钮发送BM_GETCHECK、BM_SETCHECK、BM_GETSTATE、BM_SETSTATE、BM_SETSTYLE、BM_CLICK、BM_GETIMAGE、BM_SETIMAGE等消息来改变按钮的外观或行为。所有

11、者绘制按钮:使用BS_OWNERDRAW风格创建的按钮,在需要重新绘制其窗口时会向它的父窗口发送一个WM_DRAWITEM消息,如:当按钮被创建时;当按钮被按下或者被释放时;当按钮被得到或者失去输入焦点时;当按钮的客户区有无效区域时。WM_DRAWITEM消息的第二个参数lParam是一个指向系统定义的DRAWITEMSTRUCT结构的指针,该结构包含的部分成员如下:typedef struct tagDRAWITEMSTRUCT UINT CtlID; /控件的ID号 UINT itemState; /当前窗口的视觉状态 HDC hDC; /控件窗口的设备环境描述表句柄 RECT rcIte

12、m; /控件窗口的绘图区域 DRAWITEMSTRUCT;所有者绘制按钮举例:The parent window of an owner-drawn button typically responds to at least three messages for the button: WM_INITDIALOG WM_COMMAND WM_DRAWITEM When you must paint an owner-drawn button, the system sends the parent window a WM_DRAWITEM message whose lParam parame

13、ter is a pointer to a DRAWITEMSTRUCT structure. Use this structure with all owner-drawn controls to provide the application with the information it requires to paint the control. The itemAction and itemState members of the DRAWITEMSTRUCT structure define how to paint an owner-drawn button. The follo

14、wing example shows how to process WM_INITDIALOG, WM_DRAWITEM, and WM_COMMAND messages for owner-drawn buttons. This example demonstrates how to draw one of two bitmaps for a control, depending on whether the control is selected. You would typically use the wParam parameter of the WM_DRAWITEM message

15、 to identify the control; in this example, only one control is assumed. BOOL CALLBACK OwnDrawProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) HDC hdcMem; LPDRAWITEMSTRUCT lpdis; switch (message) case WM_INITDIALOG: / hinst, hbm1 and hbm2 are defined globally. hbm1 = LoadBitmap(HANDLE) hinst, OwnBit1); hbm2 = LoadBitmap(HANDLE) hinst, OwnBit2); return TRUE; case WM_DRAWITEM:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号