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_NOREPOSITIONSWP_NOOWNERZORDERと同じです。
SWP_NOSENDCHANGING は、ウィンドウが WM_WINDOWPOSCHANGING のメッセージを受信しないようにします。
SWP_NOSIZE は、現在のサイズ (大文字と cxcy パラメーター) を保持します。
SWP_NOZORDER は現在の順序を保持します (大文字 pWndInsertAfter)。
SWP_SHOWWINDOW は、ウィンドウを表示します。
戻り値
正常終了した場合は 0 以外を返します。正常終了しなかった場合は 0 を返します。
解説
Windows は Z オーダーに従い画面上を並べ替えます。Z オーダーの最上位のウィンドウは、ほかのウィンドウの一番上に表示されます。
子ウィンドウのすべての座標は、クライアント座標です (親ウィンドウのクライアント領域の左上隅からの相対位置)。
ウィンドウを Z 順の一番上に移動できます。ウィンドウを Z オーダーの一番上に移動するには、パラメーター pWndInsertAfter を &wndTopMost に設定して、SWP_NOZORDER フラグを確実に設定しないようにするか、または、既存の最上位ウィンドウの上にウィンドウが配置されるようにウィンドウの Z オーダーを設定します。非最上位ウィンドウが最上位になると、そのウィンドウが所有するウィンドウも最上位に配置されますオーナーは変更されません。
最上位ウィンドウが、Z オーダーの一番下 (&wndBottom) または非最上位ウィンドウの後ろに再配置される場合、このウィンドウは最上位ウィンドウではなくなります。最上位ウィンドウが非最上位ウィンドウとなった場合、そのウィンドウのオーナーやそのウィンドウが所有するウィンドウもすべて非最上位ウィンドウになります。
SWP_NOACTIVATE も SWP_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 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);
}
必要条件
ヘッダー: afxwin.h