MFC 的SetWindowPos 用法

转自于:http://hi.baidu.com/max_new/blog/item/e2bbe607b1f127c57b8947c0.html

许多软件,特别是占桌面面积不是很大的软件,通常都提供了一个常居顶端的功能(可能有的软件不是这么叫法,但作用是相同的),它的作用是保持窗口一直在其他窗口的上面,可以省去频繁切换窗口的动作。

如果你想这么做,有一个API可以实现: SetWindowPos,声明是这样的:

Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos"
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long,
ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As
Long) As Long

虽然参数很多,但实际用起来很简单。hwnd是窗口的句柄,x、y、cx、cy分别是窗口的x和y坐标、宽和高度。hWndInsertAfter用来指
定窗口的Z位置(或称Z顺序)。如果你经常接触3D方面的软件,你就知道Z代表深度。这个参数接受5种值:HWND_BOTTOM、
HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST或者另一个窗口的句柄。而wFlags用来指定附加的选项。

你可以用它改变窗口的位置和大小,而且它允许你同时改变Z位置(当然,在VB中不用API你也可以改变窗体大小和位置)。比如让窗口退到最下面,可以这么使用:

SetWindowPos Me.hWnd, HWND_BOTTOM, 10&, 10&, 80&, 120&, 0&

想要常居顶端,只需把HWND_BOTTOM改为 HWND_TOPMOST,而HWND_NOTOPMOST则是取消常居顶端,HWND_TOP是把窗口的Z位置改为最前。如果这个参数传递的是另一个窗口的句柄,则是把该窗口的Z 位置更改为在另一个窗口的下面。

非常简单的事情。不过如果像上面一样做,是不是单单改个Z位置也要计算窗口位置和大小?最后一个参数又是干什么用的呢?wFlags可以让SetWindowPos忽略或执行某种行为。这里给出一部分:

SWP_DRAWFRAME和SWP_FRAMECHANGED:强制发送 WM_NCCALCSIZE消息给窗口

SWP_HIDEWINDOW:隐藏窗口

SWP_NOACTIVATE:不激活窗口

SWP_NOMOVE:保持当前位置(忽略x和y)

SWP_NOREDRAW:窗口不自动重画

SWP_NOSIZE:保持当前大小(忽略cx和cy)

SWP_NOZORDER:保持窗口在列表的当前位置(忽略hWndInsertAfter)

SWP_SHOWWINDOW:显示窗口

这些参数可以使用Or运算组合,所以如果你不希望改变窗口位置和大小,你只需要给最后一个参数传递(SWP_NOMOVE Or SWP_NOSIZE)即可。如下:

SetWindowPos Me.hWnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, SWP_NOMOVE Or SWP_NOSIZE

这里的x、y、cx、cy的值将被忽略。其他值的组合,你可以自己去试试。
好了,这个看起来好像有点复杂的API已经变得很清晰,那么轮到上一话的收尾。

WM_NCCALCSIZE消息是在计算窗口的客户区大小时被发送的,它主要是让程序可以收到该消息后重新计算客户区的大小。我们先不管它是不是也能像许
多以WM_开头的消息一样由我们发送给程序让它产生作用,但它使用起来的复杂程度让我宁可选择改变窗体大小再改回去。当我们改变窗口的大小时,很明显的就
是它一定会重新计算客户区大小以调整外观。既然这个函数可以强制发送WM_NCCALCSIZE消息,那么我们就应该试一试。

SetWindowPos Me.hwnd, 0&, 0&, 0&, 0&, 0&, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOMOVE Or SWP_FRAMECHANGED

为了不改变窗口大小、位置和Z顺序(就是要窗口保持原状),我使用SWP_NOSIZE Or SWP_NOZORDER Or
SWP_NOMOVE,让它忽略前面所有的参数,最后加个 Or SWP_FRAMECHANGED
就是让它重新计算客户区大小。把上面的一行放到前一话中更改风格的那一句下面,再执行程序。

MSDN上的 解释 :::

其内部定义:
BOOL SetWindowPos(
HWND hWnd, // handle of window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // window-positioning flags
);

参数解释:
hWnd
Identifies the window. 窗口句柄

hWndInsertAfter 窗口叠层位置
Identifies the window to precede the positioned window in the Z order.
This parameter must be a window handle or one of the following values:
Value Meaning
设置值:
HWND_BOTTOM =1在底层的"普通层"
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_NOTOPMOST= -2 在所有非"普通层"之上的"普通层"
Places the window above all non-topmost windows (that is, behind all
topmost windows). This flag has no effect if the window is already a
non-topmost window.

HWND_TOP =0在顶层的"普通层"
Places the window at the top of the Z order.

HWND_TOPMOST = -1在所用"普通层"之上的"最顶层"
Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated.

X 窗口左坐标
Specifies the new position of the left side of the window.

Y 窗口上坐标
Specifies the new position of the top of the window.

cx 窗口宽度(单位为pixels)
Specifies the new width of the window, in pixels.

cy 窗口高度(单位为pixels)
Specifies the new height of the window, in pixels.

uFlags 附加参数
Specifies the window sizing and positioning flags. This parameter can be a combination of the following values:
Value Meaning 参数值:

SWP_DRAWFRAME =0x0020窗口带边框
Draws a frame (defined in the window’s class description) around the window.

SWP_FRAMECHANGED =0x0020发送边框改变消息
Sends a WM_NCCALCSIZE message to the window, even if the window’s size
is not being changed. If this flag is not specified, WM_NCCALCSIZE is
sent only when the window’s size is being changed.

SWP_HIDEWINDOW =0x0080窗口隐藏
Hides the window.

SWP_NOACTIVATE =0x0010不激活窗口
Does not activate the window. If this flag is not set, the window is
activated and moved to the top of either the topmost or non-topmost
group (depending on the setting of the hWndInsertAfter parameter).

SWP_NOCOPYBITS =0x0100不保留显示缓存的拷贝
Discards the entire contents of the client area. If this flag is not
specified, the valid contents of the client area are saved and copied
back into the client area after the window is sized or repositioned.

SWP_NOMOVE =0x0002不可移动窗口(忽略X,Y参数)
Retains the current position (ignores the X and Y parameters).

SWP_NOOWNERZORDER =0x0200不改变父窗口叠层顺序
Does not change the owner window’s position in the Z order.

SWP_NOREDRAW =0x0008不重画窗口
Does not redraw changes. If this flag is set, no repainting of any kind
occurs. This applies to the client area, the nonclient area (including
the title bar and scroll bars), and any part of the parent window
uncovered as a result of the window being moved.
When this flag is set, the application must explicitly invalidate or
redraw any parts of the window and parent window that need redrawing.

SWP_NOREPOSITION =0x0200
Same as the SWP_NOOWNERZORDER flag.

SWP_NOSENDCHANGING =0x0400不接受窗口位置改变的消息
Prevents the window from receiving the WM_WINDOWPOSCHANGING message.

SWP_NOSIZE =0x0001窗口大小不变(忽略CX,CY参数)
Retains the current size (ignores the cx and cy parameters).

SWP_NOZORDER =0x0004不改变叠层顺序(忽略hWndInsertAfter参数)
Retains the current Z order (ignores the hWndInsertAfter parameter).

SWP_SHOWWINDOW =0x0040显示窗口
Displays the window.

注意:如果要使用上述多个uFlags参数, 只要将几个参数相加的和赋给uFlags即可.

Return Values返回值
函数执行成功返回非0值, 不成功返回0.

Remarks 特别说明(不翻译了)
If the SWP_SHOWWINDOW or SWP_HIDEWINDOW flag is set, the window cannot be moved or sized.

All coordinates for child windows are client coordinates (relative to the upper-left corner of the parent window’s client area).

A window can be made a topmost window either by setting the
hWndInsertAfter parameter to HWND_TOPMOST and ensuring that the
SWP_NOZORDER flag is not set, or by setting a window’s position in the Z
order so that it is above any existing topmost windows. When
a non-topmost window is made topmost, its owned windows are also made
topmost. Its owners, however, are not changed.

If neither the SWP_NOACTIVATE nor SWP_NOZORDER flag is specified (that
is, when the application requests that a window be simultaneously
activated and its position in the Z order changed), the value specified
in hWndInsertAfter is used only in the following
circumstances:

· Neither the HWND_TOPMOST nor HWND_NOTOPMOST flag is specified in hWndInsertAfter.

· The window identified by hWnd is not the active window.

An application cannot activate an inactive window without also bringing
it to the top of the Z order. Applications can change an activated
window’s position in the Z order without restrictions, or it can
activate a window and then move it to the top of the
topmost or non-topmost windows.

If a topmost window is repositioned to the bottom (HWND_BOTTOM) of the Z
order or after any non-topmost window, it is no longer topmost. When a
topmost window is made non-topmost, its owners and its owned windows are
also made non-topmost windows.

A non-topmost window can own a topmost window, but the reverse cannot
occur. Any window (for example, a dialog box) owned by a topmost window
is itself made a topmost window, to ensure that all owned windows stay
above their owner.

If an application is not in the foreground, and should be in the foreground, it must call the SetForegroundWindow function.

以上来源于MSDN.

MFC 的SetWindowPos 用法

时间: 2024-10-03 05:14:38

MFC 的SetWindowPos 用法的相关文章

【转】MFC下拉列表框的用法

原文网址:http://blog.csdn.net/kinglimy/article/details/6452239 Combo Box (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里面输入文本.下面的例子简要说明如何利用 MFC CComboBox Class来操作字符串列表. 1.定义控件对应变量 假定已经创建了一个Dialog,并且从控件工具箱将 Combo Box

MFC CSplitterWnd的用法

用MFC开发一个软件界面中需要拆分多个试图窗口时,使用CSplitterWnd类 CSplitterWnd类主要用在创建一个拆分试图窗口.通常嵌入在框架窗口中(CMainFrame) 创建步骤: 1.在框架类(CMainFrame)中定义一个CSplitterWnd成员: 2.重载父框架类中CFrameWnd::OnCreateClient函数: 3.在OnCreateClient()函数中调用CSplitterWnd类的Create或CreateStatic()函数: 例子: CSplitte

MFC中CFileDialog用法

用CFileDialog选择了一个文件后,使用FILE::fopen打开文件错误,使用 的是相对地址,和王工调试了半天,怎么跟踪也没发现错误,原来如此......... CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlag

MFC中关闭窗口的几种办法+MFC中MessageBox的用法

MFC中关闭窗口的几种办法: 退出程序用AfxGetMainWnd()->SendMessage(WM_CLOSE); 关闭当前窗口用DestroyWindow( ); 关闭模式对话框用EndDialog(0); MFC中MessageBox的用法 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.1.MessageBox("这是一个最简单的消息框!");2.MessageBox("这是一个有标题的消息框!","

MFC的定时器OnTimer

本文总结来源出自鸡啄米,感谢鸡啄米.来源:http://www.jizhuomi.com/software/232.html 定时器简介 定时器,可以帮助开发者或者用户定时完成某项任务.在使用定时器时,我们可以给系统传入一个时间间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期性的自动操作.例如,我们可以在数据采集系统中,为定时器设置定时采集时间间隔为1个小时,那么每隔1个小时系统就会采集一次数据,这样就可以在无人操作的情况下准确的进行操作.  MFC定时器 VS2010编程中,

MFC ListControl使用方法

在原来博客中有:MF CListControl 简单功能使用 推荐文章:MFC类CtrlList用法 今天又又一次来介绍点新东西:双击击listcontrol  做出响应.当然你能够做的还有非常多,比方显示点击的行列,右键点击,后面代码都有.没有截图了 主要有 1 插入数据 2 得到listctrl 中全部行的checkbox 的状态 3 得到listctrl 中全部选中行的序号 4 对数据做出双击处理与推断 1插入数据显示(參考后面代码) 2双击有数据的区域(參考后面代码)做出响应 3 响应成

mfc的总结

1.项目创建当用 win32 创建项目时.想用 mfc 的方式.只要改一个地方.2.更改入口函数(前提是你自己会处理执行在main 函数之前的那些函数)3.创建 mfc 时一般是基于对话框4.默认的生成宏说明. //这里是生成的类型对应的是IDD_MFCAPPLICATION1_DIALOG资源 id CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_MFCAPPLICATION1_

阅读记录(2016年9月)

本文记录本人曾经阅读过的一些文章,其中主要包括在编程.学习过程中搜集的一些琐碎知识点等. 由于文章过多,此处只记录文章的地址,可点击查看原网页. 由于内容很多,放在一篇文章中显得太长,故每个月一篇. 2016-09-21 Linux Python OpenCV python - OpenCV - cannot find module cv2 - Stack Overflow 设置环境变量:export PYTHONPATH=/opt/opencv-2.4.10/lib/python2.7/sit

C函数篇(Timer函数)

语法 Timer() 语法Timer ( interval {, windowname } ) 参数 指定两次触发Timer事件之间的时间间隔,有效值在0到65之间.如果该参数的值指定为0,那么关闭定时器, 不再触发指定窗口的Timer事件.windowname:窗口名,指定时间间隔到时要触发哪个窗口的Timer事件.省略该参数时,触发当前窗口的 Timer事件返回值Integer.函数执行成功时返回1,发生错误时返回-1.如果任何参数的值为NULL,Timer()函数返回NULL.用法使 用T