|
《精通MFC》——第二章(II) 读书笔记
|
lpEnumFunc是回调函数指针。每发现一个子窗口就会通过它回调函数。被调回的函数必须满足下面的签名:
BOOL CALLBACK EnumChildProc(
HWND hwnd, //子窗口句柄
LPARAM lParam //应用定义的数据
);
所谓的签名时原型的另一种表述。对于函数而言,它的签名包括函数名、每个参数类型及返回值类型。
下面的代码演示了如何用EnumChildWindows获得父窗口的所有后代窗口。
演示代码: P42
2 Z序关系
Windows操作系统通过一个全局的队列维持窗口的Z序。添加窗口时,它按照下面的规则设定窗口的Z序:如果待添加的窗口时WS_TOPMOST风格,那么它将变为顶层窗口,也就是位于所有现存窗口的顶端。这一点跟待添加的窗口是否为活动或后台窗口无关;如果待添加的窗口为子窗口,则它将拥有和父窗口相同的Z序。对于其它窗口,则放在同种类型的窗口的顶部。
同一个窗口类可以有多个窗口实例,这些窗口实例就是同种类型的。
通过调用BringWindowToTop, 可将一个窗口带到相同类型的窗口的顶部:
BOOL BringWindowToTop(
HWND hWnd //handle to window
);
如果hWnd表示的窗口不是子窗口,那么它将被激活;如果hWnd表示的窗口 是子窗口,那么拥有该窗口的顶层父窗口会被激活。该函数只能改变同种类型也就 是同一个CLASS衍生的窗口的Z序。
用户激活某个窗口的同时也将改变其Z序。系统将自动把激活的窗口放于同种 类型的窗口的顶部。
当一个窗口位于顶部时,它所拥有的全部子窗口也将位于Z序的顶部。
父窗口拥有的每个子窗口的Z序是不同的,这些子窗口按照Z序从上到下排列。 通过调用GetTopWindow 可以获得Z序最高的子窗口:
HWND GetTopWindow(
HWND hWnd //父窗口句柄
);
如果hWnd为NULL,则返回顶层窗口。
然后通过调用GetNextWindow获得当前窗口的上一个或下一个子窗口:
HWND GetNextWindow(
HWND hWnd, //当前窗口句柄
UINT wCmd //方向
);
wCmd为GW_HWNDNEXT表示搜索Z序小于hWnd的下一个窗口;为 GW_HWNDPREV表示搜索Z序大于hWnd的上一个窗口。如果找不到这样的窗口, 则返回NULL。
3 前后关系
通过调用GetForegroundWindow可以获得当前的前台窗口:
HWND GetForegroundWindow(VOID);
为了判断某个窗口是否为前台窗口,只要比较它的窗口句柄和GetForegroundWindow返回的句柄是否相等即可。
应用程序可以通过调用SetForegroundWindow可以设置前台窗口:
BOOL SetForegroundWindow(
HWND hWnd //窗口句柄
);
4 拥有关系
拥有关系不同于父子关系,它的关系存在于WS_OVERLAPPED和WS_POPUP风格的窗口之间。也就是说,一个重叠或弹出窗口能被另一个重叠或弹出窗口所拥有。
一个被拥有的窗口具有如下的特征:
它总是位于拥有它的窗口的Z序之上
当窗口被销毁时,它所拥有的窗口也将被自动销毁
当窗口最小化时,它所拥有的窗口将被隐藏。
为了创建被拥有的窗口,必须满足下列条件:
调用CreateWindowEx时,要设置hwndParent参数,该参数表示哪个窗口将拥有创建的窗口。
hwndParent指示的窗口必须具有WS_OVERLAPPED或WS_POPUP风格。如果hwndParent指示窗口是一个子窗口,那么hwndParent的顶层父窗口将拥有新创建的窗口。
被创建的窗口必须具有WS_OVERLAPPED或WS_POPUP风格。
跟父子关系不同,一旦在窗口间建立起拥有关系,这种关系就不能更改。应用程序可以通过向GetWindow函数传入GW_OWNER标记来获得拥有该窗口的窗口句柄:
HWND GetWindow(
HWND hWnd, //初始窗口句柄
UINT uCmd //关系,GW_OWNER表示查询hWnd的拥有者
);
2.4 消息和消息处理
1 系统定义的消息
每一个系统定义的消息都有唯一标志符常量。在SDK头文件中这些常量被定义为32位整数。标志符常量的字符分为两部分,前缀和后缀。前缀表示处理该消息的窗口的类别,后缀描述了该消息的目的。 |
|
|
|
回复:《精通MFC》——第二章(II) 读书笔记 |
|
兵兵(游客)发表评论于2005/11/20 9:38:14
|
» 1 »
|