调试 [Visual Studio]

更改子项、弹出窗口以及顶级窗口大小、位置和Z顺序。

BOOL SetWindowPos(
   const CWnd* pWndInsertAfter,
   int x,
   int y,
   int cx,
   int cy,
   UINT nFlags 
);

参数

  • pWndInsertAfter
    标识将前面的 CWnd 对象(大于)对Z顺序的此 CWnd 对象。 此参数可以是指向 CWndPointer 为下列值之一:

    • wndBottom 将窗口底部的z-顺序。 如果此 CWnd 是一个最顶层窗口,窗口丢失其最顶层的状态;系统将窗口在其他窗口底部。

    • wndTop 将窗口在z-顺序的顶部。

    • wndTopMost 将windows首先非最顶层窗口。 即使当停用,窗口保留其最顶层的位置它。

    • wndNoTopMost 在任何非最顶层窗口的顶部重新定位窗口(即所有最顶层窗口)后。 如果窗口已非最顶层窗口,此标志将不起作用。

    有关如何的规则使用此参数,请参见“备注”本主题的一部分。

  • x
    指定窗口的左侧的新位置。

  • y
    指定窗口顶部的新位置。

  • cx
    指定窗口的新的宽度。

  • cy
    指定窗口的新高度。

  • nFlags
    指定大小调整和定位选项。 此参数可以是以下标志的组合:

    • SWP_DRAWFRAME 在窗口周围绘制帧(定义窗口时所创建的)。

    • SWP_FRAMECHANGED 发送 WM_NCCALCSIZE 信息到窗口,因此,即使未更改窗口的大小。 如果此标志未指定,则发送 WM_NCCALCSIZE,仅当更改时窗口的大小。

    • SWP_HIDEWINDOW 隐藏窗口。

    • SWP_NOACTIVATE 不窗口被激活。 如果此未设置任何标志,窗口激活和移到最顶层或非最顶层的组顶级(基于设置 pWndInsertAfter 参数)。

    • SWP_NOCOPYBITS 放弃工作区的整个内容。 如果此标志未指定,工作区的有效内容保存并将其复制到工作区,在窗口的大小或重新定位之后。

    • SWP_NOMOVE 保留当前位置(忽略 xy 参数)。

    • SWP_NOOWNERZORDER 不会更改。z-顺序的所有者窗口的位置。

    • SWP_NOREDRAW 不重绘更改。 如果此标志设置,重新绘制任何类型不会发生。 这适用于工作区、非工作区(包括标题和滚动条)和由于移动后的窗口中的父窗口的任何部分。 在此标志设置为时,应用程序必须显式无效或重绘必须重绘窗口和父窗口的所有部件。

    • SWP_NOREPOSITIONSWP_NOOWNERZORDER相同。

    • SWP_NOSENDCHANGING 防止窗口收到 WM_WINDOWPOSCHANGING 消息。

    • SWP_NOSIZE 保留当前范围(忽略 cx 和 cy 参数)。

    • SWP_NOZORDER 保留当前排序(忽略 pWndInsertAfter)。

    • SWP_SHOWWINDOW 显示窗口。

返回值

非零,如果函数运行成功;否则,0。

备注

Windows在屏幕上的排序依据的Z顺序;窗口在z-顺序的顶部显示在其他窗口顶部的顺序。

子窗口的所有坐标是工作区坐标(相对于父窗口工作区的左上角)。 

窗口可以移至z-顺序的顶部方法是设置为 &wndTopMost 的 pWndInsertAfter 参数并确保 SWP_NOZORDER 标记不通过设置窗口的Z顺序设置,以便在任何现有的最顶层窗口上。 当非最顶层窗口使最顶层时,其拥有的窗口还使最顶层。 不更改其所有者。

个最顶层窗口不再是最顶层的,则重新定位到底(&wndBottom) z-顺序或任何非最顶层窗口之后。 当一个最顶层窗口使非最顶层时,所有其所有者及其拥有的窗口还创建非最顶层窗口。

如果 SWP_NOACTIVATESWP_NOZORDER 未指定(即,当应用程序请求窗口在指定的Z顺序同时激活和放置),在 pWndInsertAfter 指定的值在以下情况下只使用:

  • &wndTopMost&wndNoTopMost 在 pWndInsertAfter 参数中指定。

  • 此窗口不是活动窗口。

应用程序无法激活无效窗口不从而使后者成为Z顺序的顶部。 应用程序可以更改已激活的窗口的Z顺序没有限制。

非最顶层窗口可能不熟悉拥有最顶层窗口,但是。 个最顶层窗口(例如,对话框)拥有的所有窗口本身进行确保一个最顶层窗口所有附属窗口在其所有者上维护。

Windows 3.1版和更高版本,窗口可以移至z-顺序的顶部和通过设置其 WS_EX_TOPMOST 样式锁定即可。 这一最顶层窗口保留其最顶层的位置,即使当停用。 例如,选择WinHelp在顶部命令始终使帮助窗口最顶端,并且,然后保持可见,当返回您的应用程序时。

在创建windows时,若要创建最顶层的窗口,则调用与 pWndInsertAfter 参数的 SetWindowPos 等于 &wndTopMost或设置 WS_EX_TOPMOST 样式。

如果该Z顺序包含 WS_EX_TOPMOST 样式的任何窗口,窗口将与 &wndTopMost 值放置在任何非最顶层窗口的顶部,但在任何最顶层窗口中。 当应用程序激活无效窗口,而无需 WS_EX_TOPMOST 位时,窗口是移动的第一个非最顶层窗口,但在任何最顶层窗口中。

如果 SetWindowPos 调用,当 pWndInsertAfter 参数为时 &wndBottom,并 CWnd 是一个最顶层窗口,窗口丢失其最顶层的状态(清除WS_EX_TOPMOST ),并且,则系统将窗口底部的z-顺序。

示例

void CMyApp::OnHideApplication()
{
   //m_pMainWnd is the main application window, a member of CMyApp
   ASSERT_VALID(m_pMainWnd);

   // hide the application's windows before closing all the documents
   m_pMainWnd->ShowWindow(SW_HIDE);
   m_pMainWnd->ShowOwnedPopups(FALSE);

   // put the window at the bottom of z-order, so it isn't activated
   m_pMainWnd->SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
      SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
}

要求

Header: afxwin.h

请参见

参考

CWnd 类

层次结构图

DeferWindowPos

SetWindowPos