CWnd::SetWindowPos

子ウィンドウ、ポップアップ ウィンドウ、およびトップレベル ウィンドウのサイズ、位置、および Z オーダーを変更します。

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

パラメータ

pWndInsertAfter
Z オーダーでこの CWnd オブジェクトより前に配置される CWnd オブジェクトを識別します。このパラメータへは、CWnd へのポインタか次の値のいずれか 1 つを指定できます。
  • wndBottom   ウィンドウを Z オーダーの一番下に置きます。この CWnd が最上位のウィンドウの場合、ウィンドウの最上位ステータスは失われます。システムでは、このウィンドウをほかのすべてのウィンドウよりも下に置きます。
  • wndTop   ウィンドウを Z オーダーの先頭に置きます。
  • wndTopMost   ウィンドウを最上位でないすべてのウィンドウの上に置きます。ウィンドウは、非アクティブになったときも、最上位の位置を保持します。
  • wndNoTopMost   ウィンドウを最上位でないすべてのウィンドウの先頭に再配置します (つまり、一番手前のすべてのウィンドウの後ろに置きます)。ウィンドウが既に非最上位ウィンドウとなっているときは、このフラグは無効です。

このパラメータの使い方の規則については、この関数の「解説」を参照してください。

x
ウィンドウの新しい左辺の位置を指定します。
y
ウィンドウの新しい上辺の位置を指定します。
cx
ウィンドウの新しい幅を指定します。
cy
ウィンドウの新しい高さを指定します。
nFlags
サイズ変更オプションおよび位置指定オプションを指定します。このパラメータには、次の値を組み合わせて指定できます。
  • SWP_DRAWFRAME   ウィンドウの周りにフレーム (ウィンドウ作成時に定義されます) を描画します。
  • SWP_FRAMECHANGED   ウィンドウのサイズが変化されていない場合でも、ウィンドウに WM_NCCALCSIZE メッセージを送信します。このフラグが指定されていない場合、WM_NCCALCSIZE メッセージはウィンドウのサイズが実際に変化しているときにだけ送られます。
  • SWP_HIDEWINDOW   ウィンドウを非表示にします。
  • SWP_NOACTIVATE   ウィンドウをアクティブにしません。このフラグが設定されていないと、ウィンドウはアクティブになり、最上位または非最上位のウィンドウ グループのいずれかの先頭に移動されます (パラメータ pWndInsertAfter の設定に依存します)。
  • SWP_NOCOPYBITS   クライアント領域の内容全体を破棄します。このフラグが指定されていない場合、クライアント領域の有効な内容はすべて保存されます。保存された内容は、ウィンドウのサイズや位置が再び変更されたときにクライアント領域に復元されます。
  • SWP_NOMOVE   現在位置を保持します (x パラメータと y パラメータを無視します)。
  • SWP_NOOWNERZORDER   オーナー ウィンドウの Z オーダーの位置を変更しません。
  • SWP_NOREDRAW   変更があっても再描画しません。このフラグが設定されていると、どのような種類の再描画も行われません。このことは、クライアント領域、非クライアント領域 (タイトルやスクロール バーを含みます)、ウィンドウが移動したことにより覆われない親ウィンドウのあらゆる部分に適用されます。このフラグが設定されているときは、アプリケーションは再描画が必要なウィンドウや親ウィンドウのあらゆる部分を明示的に無効領域または再描画する必要があります。
  • SWP_NOREPOSITION   SWP_NOOWNERZORDER と同じです。
  • SWP_NOSENDCHANGING   ウィンドウが WM_WINDOWPOSCHANGING メッセージを受信しないようにします。
  • SWP_NOSIZE   現在のサイズを保持します (cx パラメータと cy パラメータを無視します)。
  • SWP_NOZORDER   現在の順序を保持します (pWndInsertAfter を無視します)。
  • SWP_SHOWWINDOW   ウィンドウを表示します。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

Windows は Z オーダーに従い画面上を並べ替えます。Z オーダーの最上位のウィンドウは、ほかのウィンドウの一番上に表示されます。

子ウィンドウのすべての座標は、クライアント座標です (親ウィンドウのクライアント領域の左上隅からの相対位置)。

ウィンドウを Z 順の一番上に移動できます。ウィンドウを Z オーダーの一番上に移動するには、パラメータ pWndInsertAfter&wndTopMost に設定して、SWP_NOZORDER フラグを確実に設定しないようにするか、または、既存の最上位ウィンドウの上にウィンドウが配置されるようにウィンドウの Z オーダーを設定します。非最上位ウィンドウが最上位になると、そのウィンドウが所有するウィンドウも最上位に配置されますオーナーは変更されません。

最上位ウィンドウが、Z オーダーの一番下 (&wndBottom) または非最上位ウィンドウの後ろに再配置される場合、このウィンドウは最上位ウィンドウではなくなります。最上位ウィンドウが非最上位ウィンドウとなった場合、そのウィンドウのオーナーやそのウィンドウが所有するあらゆるウィンドウも非最上位ウィンドウになります。

SWP_NOACTIVATESWP_NOZORDER も指定されていないとき、つまり、アプリケーションが同時にウィンドウをアクティブにし、ウィンドウを指定された Z オーダーに置く要求をしたとき、pWndInsertAfter で指定された値は、次の環境にある場合にのみ使われます。

  • &wndTopMost&wndNoTopMost もパラメータ pWndInsertAfter に指定されていない場合
  • ウィンドウがアクティブ ウィンドウでない場合

アプリケーションが非アクティブ ウィンドウをアクティブにするには、必ずウィンドウを Z オーダーの先頭に配置する必要があります。アプリケーションは、特に制限なしにアクティブ ウィンドウの Z オーダーを変更できます。

非最上位ウィンドウが最上位ウィンドウを所有することはありますが、その逆になることはありません。最上位ウィンドウが所有するあらゆるウィンドウ (たとえば、ダイアログ ボックス) は、それらのオーナーの上にすべての所有するウィンドウを保持するために、そのウィンドウ自身を最上位ウィンドウにします。

Windows 3.1 以降では、ウィンドウを Z オーダーの先頭に移動することや、WS_EX_TOPMOST スタイルを使ってロックできます。このとき、最上位ウィンドウは、非アクティブになった場合も最上位の位置を維持します。たとえば、WinHelp Always On Top コマンドを選択すると、ヘルプ ウィンドウを一番手前に配置し、アプリケーションに戻ってもヘルプ ウィンドウを表示したまま残すことができます。

最上位ウィンドウを作成するには、パラメータ pWndInsertAfter&wndTopMost を指定して SetWindowPos 関数を呼び出すか、ウィンドウ作成時に WS_EX_TOPMOST スタイルを設定します。

Z オーダーに WS_EX_TOPMOST スタイルを持つウィンドウが含まれている場合、&wndTopMost 値で移動されるウィンドウは、非最上位のすべてのウィンドウの先頭に配置されますが、最上位ウィンドウよりも後ろに配置されます。アプリケーションが WS_EX_TOPMOST ビットを使わずに非アクティブ ウィンドウをアクティブにすると、ウィンドウは一番手前にないすべてのウィンドウの先頭に移動しますが、最上位ウィンドウの後ろに配置されます。

パラメータ pWndInsertAfter&wndBottom が設定されると SetWindowPos 関数が呼び出され、CWnd が最上位ウィンドウの場合、ウィンドウは最上位状態を失います (WS_EX_TOPMOST はクリアされます)。システムは、ウィンドウをすべての Z オーダーの一番下に置きます。

void CWinApp::HideApplication()
{
   //m_pMainWnd is the main application window, a member of CWinApp
   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);
}

参照

CWnd の概要 | クラスのメンバ | 階層図 | DeferWindowPos | SetWindowPos

表示: