第 9 章 子窗口控件

来源:互联网 发布:echo 数字数组 编辑:程序博客网 时间:2024/04/30 07:22

摘录于《Windows程序(第5版,珍藏版).CHarles.Petzold 著》P285

        回顾一下第 7 章讨论的 CHECKER 系列程序,它们显示一个矩形网格。当你在一个小矩形里单击鼠标时,程序会再那里画一个 X。当你再次单击时,这个 X 会消失。虽然 CHECKER1 和 CHECKER2 版本的程序只使用了一个主窗口,但是 CHECKER3 版本中的每一个矩形都使用了一个子窗口。这些矩形子窗口由一个单独的窗口过程 ChildProc 来维护。

        如果我们愿意,可以给 ChildProc 增加一个功能,每当小矩形被画上“X” 或去掉“X” 时,它都会向其父窗口过程(WndProc)发送一条消息。具体实现方法如下:子窗口过程可以调用GetParent 函数得到其父窗口的句柄

hwndParent = GetParent (hwnd);
这里的 hwnd 是子窗口的句柄。然后子窗口可以给父窗口过程发送消息:

SendMessage (hwndParent, message, wParam, lParam);

        此消息(message)将如何设置呢?实际上,可以把它设置为任何值,前提是只要它的数值等于 WM_USER 或者大于这个值。这些数值代表一系列消息,而这些消息不会与预先定义的 WM_ 消息冲突,一种可能的用法是,子窗口可以把 wParam 设置为子窗口的 ID。当子窗口被划上 X 时,把 lParam 设置为 1,当子窗口被去掉 X 时,把 lParam 设置为 0。

        以上做法实际是建立了“子窗口控件”。当子窗口的状态发生改变时,子窗口处理鼠标和键盘的消息,并且通知其父窗口这样一来子窗口就变为父窗口高级输入设备。同时,这种方法为子窗口增添了特殊功能:控制屏幕图形显示,响应用户的输入,以及在有重要输入事件出现时通知另一个窗口。

        虽然可以创建自己的子窗口控件,但是也可以利用一些预定义的窗口类和窗口过程,产生标准的子窗口控件。毫无疑问,你肯定看到过其他 Windows 程序产生的标准子窗口控件。这些控件种类有按钮(button)、复选框(check box)、编辑框(edit box)、列表框(list box)、组合框(combo box)、文本字符串(text string)和滚动条(scroll bar)。例如,如果想要把一个标有“重新计算”的按钮放在电子表格的一角,你可以简单地调用 CreateWindow 函数来创建它。你不必担心鼠标逻辑、按钮刷新逻辑或者按下按钮时产生按钮的闪烁,这些工作都由 Windows 来承担你只需要俘获 WM_COMMAND 消息——当该按钮被按下时,按钮会通过它来通知你的窗口过程。真的这么简单?对,几乎是这样。

        子窗口控件在对话框里使用最广。正如第 11 所述,子窗口控件的位置和大小是由该程序资源脚本的对话框模板所定义的。不过,也可以在正常窗口的客户区表面上产生预定义的子窗口控件。用 CreateWindow 创建每个子窗口,调用 MoveWindow 来调整其位置和大小。程序的父窗口发送消息给子窗口控件,子窗口控件将消息发送回父窗口过程

        正如我们从第 3 章开始一直在做的,为了创建正常显示的应用程序窗口,首先要定义一个窗口类,调用 RegisterClass 函数注册该窗口类。然后使用 CreateWindow 创建基于该注册类的窗口。在使用预定义的控件时,不需要注册相应子窗口的类。这些类已经存在于 Windows 中并已经有预定义的名称。在调用 CreateWindow 时,只需要使用该名称作为窗口类参数。CreateWindow 的窗口样式参数更精确地定义了子窗口的外观和功能。Windows 包含相应的窗口过程,在这些窗口类的基础上,窗口过程处理送往子窗口的消息

        在窗口表面直接使用子窗口,所涉及的任务比使用对话框内的子窗口控件更低层。对于对话框,对话框管理器在你的程序和空间之间增加了一个隔离层。具体说来,你会发现自己创建的子窗口控件没有内在机制来支持靠 Tab 键或光标移动键去把输入焦点从一个控件移动到另一个控件。子窗口控件可以得到输入焦点,可是一旦得到焦点,它就无法把输入焦点交回给其父窗口。这的确是个问题,我们将在本章的许多地方碰到它。

        Windows 编程文档主要在两个地方讨论了子窗口控件:第一,在无数对话框中看到的标准的简单控件,它们是按钮(包括复选框和单选按钮)、静态控件(如文本标签)、编辑框(允许输入和编辑多行文本)、滚动条、列表框和组合框。除了组合框之外,其他控件自 Windows 1.0 以来就一直存在。Windows 文档的这一部分还包括富文本编辑控件,它与编辑框相似,但允许编辑有不同的字体等的格式化文本,此外还包括应用程序桌面工具栏。

        还有更深奥和更专用的控件集,被称为通用控件。其描述位于 /Platform SDK/User Interface Services/Shell and Common Controls/Common Controls。我不会在这一章讨论通用控件,但它们会出现在本书的各种程序中。Windows 稳当的这一部分值得认真阅读,因为你能在其中找到一些对你自己的应用程序有帮助的东西。

0 0