プラットフォーム SDK
SetWindowPos
子ウィンドウ、ポップアップウィンドウ、またはトップレベルウィンドウのサイズ、位置、および Z オーダーを変更します。これらのウィンドウは、その画面上での表示に従って順序が決められます。最前面にあるウィンドウは最も高いランクを与えられ、Z オーダーの先頭に置かれます。
BOOL SetWindowPos(
HWND hWnd, // ウィンドウのハンドル
HWND hWndInsertAfter, // 配置順序のハンドル
int X, // 横方向の位置
int Y, // 縦方向の位置
int cx, // 幅
int cy, // 高さ
UINT uFlags // ウィンドウ位置のオプション
);
パラメータ
- hWnd
- ウィンドウのハンドルを指定します。
- hWndInsertAfter
- Z オーダーを決めるためのウィンドウハンドルを指定します。hWnd で指定したウインドウは、このパラメータで指定したウィンドウの後ろに置かれます。このパラメータには、次のいずれかの値を指定することもできます。
| 値 | 意味 |
| HWND_BOTTOM | ウィンドウを Z オーダーの最後に置きます。hWnd パラメータで指定したウィンドウが最前面ウィンドウだった場合、このウィンドウは最前面ウィンドウではなくなり、ほかのすべてのウィンドウの下に置かれます。 |
| HWND_NOTOPMOST | ウィンドウを最前面ウィンドウ以外のすべてのウィンドウの前( つまり、すべての最前面ウィンドウの後ろ)に挿入します。hWnd パラメータで指定したウィンドウが既に最前面ウィンドウではなかった場合、このフラグは意味を持ちません。 |
| HWND_TOP | ウィンドウを Z オーダーの先頭に置きます。 |
| HWND_TOPMOST | ウィンドウを最前面ウィンドウではないすべてのウィンドウの前に挿入します。このウィンドウは、アクティブでないときにも最前面に表示されます。 |
このパラメータの使い方の詳細については、解説を参照してください。
- X
- ウィンドウの左上端の新しい x 座標をクライアント座標で指定します。
- Y
- ウィンドウの左上端の新しい y 座標をクライアント座標で指定します。
- cx
- ウィンドウの新しい幅をピクセル単位で指定します。
- cy
- ウィンドウの新しい高さをピクセル単位で指定します。
- uFlags
- ウィンドウのサイズと位置の変更に関するフラグを指定します。次の値を組み合わせて指定できます。
| 値 | 意味 |
| SWP_ASYNCWINDOWPOS | この関数を呼び出したスレッドとウィンドウを所有するスレッドが異なる入力キューに関連付けられている場合、ウィンドウを所有するスレッドへ要求が送られます。こうすると、要求を受け取ったスレッドが要求を処理している間も、関数を呼び出したスレッドの実行が止まってしまうことはありません。 |
| SWP_DEFERERASE | WM_SYNCPAINT メッセージが生成されないようにします。 |
| SWP_DRAWFRAME | ウィンドウを囲む枠( ウィンドウクラスの記述部分で定義されている)を描画します。 |
| SWP_FRAMECHANGED | SetWindowLong 関数を使って新しいフレームスタイルの設定を適用します。
ウィンドウサイズが変更されない場合にも、ウィンドウに WM_NCCALCSIZE メッセージを送ります。このフラグを指定しなかった場合、ウィンドウサイズが変更される場合にしか WM_NCCALCSIZE メッセージは送られません。
|
| SWP_HIDEWINDOW | ウィンドウを非表示にします。 |
| SWP_NOACTIVATE | ウィンドウをアクティブ化しません。このフラグをセットしなかった場合、ウィンドウはアクティブ化され、最前面ウィンドウまたは非最前面ウィンドウのどちらか(hWndInsertAfter パラメータの設定による)のグループの最上位に移動します。 |
| 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 | 現在の Z オーダーを維持します(hWndInsertAfter パラメータを無視します)。 |
| SWP_SHOWWINDOW | ウィンドウを表示します。 |
戻り値
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。
解説
SWP_SHOWWINDOW フラグまたは SWP_HIDEWINDOW フラグがセットされていると、ウィンドウを移動したりサイズを変更したりすることはできません。
SetWindowLong 関数を使って何らかのウィンドウデータを変更した場合、SetWindowPos 関数を呼び出してその変更を有効にしなければなりません。この場合、uFlags パラメータには、SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED を指定してください。
ウィンドウを最前面ウィンドウにするには、hWndInsertAfter パラメータで、HWND_TOPMOST フラグをセットしたうえで SWP_NOZORDER フラグをクリアするか、または存在するすべての最前面ウィンドウより Z オーダーが上になるように指定します。非最前面ウィンドウが最前面になると、そのウィンドウが所有するウィンドウも最前面ウィンドウになります。逆に、そのオーナーウィンドウの状態は変わりません。
SWP_NOACTIVATE フラグと SWP_NOZORDER フラグのどちらもセットしなかった場合( つまり、アプリケーションがウィンドウのアクティブ化と Z オーダーの変更の両方を同時に要求した場合)、hWndInsertAfter パラメータに指定した値は、次の条件が満たされる場合にしか使用されません。
•hWndInsertAfter パラメータに HWND_TOPMOST フラグも HWND_NOTOPMOST フラグもセットしていない。
•hWnd で指定したウィンドウが、アクティブウィンドウでない。
アプリケーションは、非アクティブウィンドウを Z オーダーの先頭に持ってくることなくアクティブ化することはできません。アクティブ化されているウィンドウの Z オーダーの変更は制限なしに行えます。ウィンドウをアクティブ化した後、最前面ウィンドウの一番上へ、または非最前面ウィンドウの一番上へ移動することは可能です。
最前面ウィンドウは、Z オーダーの最後(HWND_BOTTOM)またはどれかの非最前面ウィンドウより後ろへ移動すると、最前面ウィンドウではなくなります。最前面ウィンドウが非最前面ウィンドウになると、そのオーナーウィンドウとそれが所有するウィンドウも非最前面ウィンドウになります。
非最前面ウィンドウが最前面ウィンドウを所有することはありますが、その逆はあり得ません。ほかのウィンドウに所有されるウィンドウをそのオーナーウィンドウよりも確実に上に置くために、最前面ウィンドウに所有されるウィンドウ( ダイアログボックスなど)は、必ず最前面ウィンドウになります。
フォアグラウンドでないアプリケーションをフォアグラウンドにするには、SetForegroundWindow 関数を呼び出さなければなりません。
対応情報
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用
参照
MoveWindow, SetActiveWindow, SetForegroundWindow