终于搞清楚SetWindowPos的hWndInsertAfter参数的作用

赤勇玄心行天道 2014-07-27 11:07:50
函数声明:
BOOL WINAPI SetWindowPos(
_In_ HWND hWnd,
_In_opt_ HWND hWndInsertAfter,
_In_ int X,
_In_ int Y,
_In_ int cx,
_In_ int cy,
_In_ UINT uFlags
);

参数解释:
hWndInsertAfter,[输入]:
存放要将hWnd参数指定的窗口定位在哪个窗口句柄的前面,不能为NULL,也可以为(选一至一个):
HWND_BOTTOM(1):
如果hWnd参数指定的窗口是当前活动窗口,将此窗口定位在Z轴顺序的底部,也就是所有窗口的后面,且如果此窗口是置顶窗口,就变成非置顶窗口。
如果hWnd参数指定的窗口不是当前活动窗口,则不做任何定位,无论此窗口是置顶窗口,还是非置顶窗口。
HWND_NOTOPMOST(-2):
如果hWnd参数指定的窗口是置顶窗口,且是当前活动窗口,就变成非置顶窗口,并定位在所有非置顶窗口的前面,及在所有置顶窗口的后面。
如果hWnd参数指定的窗口已经是一个非置顶窗口,或不是当前活动窗口,则不做任何定位。
HWND_TOP(0):
如果hWnd参数指定的窗口是非置顶窗口,且是当前活动窗口,将窗口定位在所有非置顶窗口的前面,及在所有置顶窗口的后面。
如果hWnd参数指定的窗口已经是一个置顶窗口,或不是当前活动窗口,则不做任何定位。
HWND_TOPMOST(-1):
将hWnd参数指定的窗口定位在所有非置顶窗口和置顶窗口的前面,并将窗口变成置顶窗口,无论此窗口是不是当前活动窗口。
如果hWnd参数指定的窗口在置顶后,又有其他窗口被置顶,则此窗口将被定位在其他置顶窗口的后面。
如果要一直保持某个窗口的置顶位置,需要每隔一段时间就设置一次置顶,才能保证不被其他窗口盖住。

注意:如果uFlags参数中设置了SWP_NOZORDER标记则本参数将被忽略。
...全文
1714 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 14 楼 cvbtvbwu 的回复:
[quote=引用 13 楼 cyz7758520 的回复:] [quote=引用 12 楼 cvbtvbwu 的回复:] 我经常传null,
请问大侠,你是不是在uFlags参数中设置SWP_NOZORDER标记?[/quote] 是我说错了,没传过null[/quote] 哦,好的,没事,说清楚就好了
叶恭介叶恭介 2014-07-31
  • 打赏
  • 举报
回复
引用 13 楼 cyz7758520 的回复:
[quote=引用 12 楼 cvbtvbwu 的回复:] 我经常传null,
请问大侠,你是不是在uFlags参数中设置SWP_NOZORDER标记?[/quote] 是我说错了,没传过null
  • 打赏
  • 举报
回复
引用 12 楼 cvbtvbwu 的回复:
我经常传null,
请问大侠,你是不是在uFlags参数中设置SWP_NOZORDER标记?
叶恭介叶恭介 2014-07-30
  • 打赏
  • 举报
回复
我经常传null,
帐号已注销 2014-07-30
  • 打赏
  • 举报
回复
msdn必须要仔细读, 特别是 Remarks 部分一定不要放过.
dvlinker 2014-07-30
  • 打赏
  • 举报
回复
是啊,多翻翻MSDN中对函数的说明,仔细读,你会有意想不到的收获
Eleven 2014-07-29
  • 打赏
  • 举报
回复
MSDN上应该有说明的
「已注销」 2014-07-29
  • 打赏
  • 举报
回复
除了第一个参数和最后一个参数,其余的都可以通过最后一个参数使其有效或无效。hWndInsertAfter 就是窗口的 Z 序,有什么可疑惑的。我觉得 MSDN 说的很清楚。
帐号已注销 2014-07-27
  • 打赏
  • 举报
回复
第1句放说不能为null把我雷到了, 我经常传null, 最后注意却间接说可以为null~ 怎么会认为msdn没说清楚呢? point it out.
lx624909677 2014-07-27
  • 打赏
  • 举报
回复
mfs 2014-07-27
  • 打赏
  • 举报
回复
谢谢楼主,学习了
  • 打赏
  • 举报
回复
引用 1 楼 CometNet 的回复:
恭喜楼主. 使用API时,不明白的多翻翻MSDN是好习惯.
版主,这个函数的MSDN没说清楚呀,这都是我自己试出来的
邓学彬 2014-07-27
  • 打赏
  • 举报
回复
恭喜楼主. 使用API时,不明白的多翻翻MSDN是好习惯.
  • 打赏
  • 举报
回复
引用 5 楼 vbgkj 的回复:
第1句放说不能为null把我雷到了, 我经常传null, 最后注意却间接说可以为null~ 怎么会认为msdn没说清楚呢? point it out.
这位大侠说的第二个问题,我说MSDN上没有说清楚,我本来觉得没有必要指出来的,现在我还是说说吧,看看我说的对不? MSDN上说HWND_BOTTOM标记是表示“Places the window at the bottom of the Z order. If the hWnd parameter identifies a topmost window, the window loses its topmost status and is placed at the bottom of all other windows.”,我的理解是“将hWnd参数指定的窗口定位到所有窗口的后面,如果此窗口是一个置顶窗口,则变成非置顶窗口,并定位到所有窗口的后面”,但是经过我的测试,发现“如果hWnd参数指定的窗口不是当前激活窗口,则不做任何定位,无论此窗口是置顶窗口,还是非置顶窗口。且只有当hWnd参数指定的窗口是当前激活窗口时,才会按照MSDN上说的做”。
  • 打赏
  • 举报
回复
引用 5 楼 vbgkj 的回复:
第1句放说不能为null把我雷到了, 我经常传null, 最后注意却间接说可以为null~ 怎么会认为msdn没说清楚呢? point it out.
谢谢大侠指定,你说的第一个NULL的问题,我对注释做了修改,麻烦你看看: hWndInsertAfter,[输入]: 存放要将hWnd参数指定的窗口定位在哪个窗口句柄的前面。 如果不想定位窗口,就将uFlags参数中设置SWP_NOZORDER标记,则本参数将被忽略,否则本参数不能为NULL。 此参数也可以为(选一至一个): HWND_BOTTOM(1): 如果hWnd参数指定的窗口是当前激活窗口,将此窗口定位在Z轴顺序的底部,也就是所有窗口的后面,且如果此窗口是置顶窗口,就变成非置顶窗口。 如果hWnd参数指定的窗口不是当前激活窗口,则不做任何定位,无论此窗口是置顶窗口,还是非置顶窗口。 HWND_NOTOPMOST(-2): 如果hWnd参数指定的窗口是置顶窗口,且是当前激活窗口,就变成非置顶窗口,并定位在所有非置顶窗口的前面,及在所有置顶窗口的后面。 如果hWnd参数指定的窗口已经是一个非置顶窗口,或不是当前激活窗口,则不做任何定位。 HWND_TOP(0): 如果hWnd参数指定的窗口是非置顶窗口,且是当前激活窗口,将窗口定位在所有非置顶窗口的前面,及在所有置顶窗口的后面。 如果hWnd参数指定的窗口已经是一个置顶窗口,或不是当前激活窗口,则不做任何定位。 HWND_TOPMOST(-1): 将hWnd参数指定的窗口定位在所有非置顶窗口和置顶窗口的前面,并将窗口变成置顶窗口,无论此窗口是不是当前激活窗口。 如果hWnd参数指定的窗口在置顶后,又有其他窗口被置顶,则此窗口将被定位在其他置顶窗口的后面。 如果要一直保持某个窗口的置顶位置,需要每隔一段时间就设置一次置顶,才能保证不被其他窗口盖住。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧