C言語プログラミング覚書き
ホーム
覚書き

<ウィンドウを常に手前>

今回はMyColorCheckerの重要な機能のひとつである Top Most (ウィンドウを常に手前に表示する)機能について書きます。 この機能を実現する関数は下記に示す SetWindowPos 関数です。


    BOOL SetWindowPos(HWND hWnd,
                      HWND hWndInsertAfter,
                      int  X,
                      int  Y,
                      int  cx,
                      int  cy,
                      UINT uFlags);

これはウィンドウの位置とZオーダーを変更する為の関数です。 Zオーダーというのは、スクリーン上のウィンドウの重なりの順序 を決めるものです。ウィンドウはすべてデスクトップを根底とした 親子関係にあります。(理論上のことで実際に重なっているわけでは ありませんが。。。)
上記の関数を使うと、このZオーダーとウィンドウの位置を自由に 変えることができるのです。
hWnd はいつものようにウィンドウハンドルですね。
hWndInsertAfter には以下のいずれかのパラメータを指定します。

HWND_BOTTOM ウィンドウを Z オーダーの最後に置きます。 hWnd パラメータで指定したウィンドウが最前面ウィンドウだった場合、 このウィンドウは最前面ウィンドウではなくなり、 ほかのすべてのウィンドウの下に置かれます。
HWND_NOTOPMOST ウィンドウを最前面ウィンドウ以外のすべてのウィンドウの前 ( つまり、すべての最前面ウィンドウの後ろ)に挿入します。 hWnd パラメータで指定したウィンドウが既に最前面ウィンドウ ではなかった場合、このフラグは意味を持ちません。
HWND_TOP ウィンドウを Z オーダーの先頭に置きます。
HWND_TOPMOST ウィンドウを最前面ウィンドウではないすべてのウィンドウの前に挿入します。 このウィンドウは、アクティブでないときにも最前面に表示されます。

X と Y はウィンドウの左上の座標をクライアント座標で、 cx と cy はウィンドウの幅と高さをそれぞれ指定しますが、次の uFlags で、 SWP_NOMOVE と SWP_NOSIZE を指定すれば、現在の位置とサイズを維持します。 uFlags に指定できるパラメータはたくさんあるので、この2つ以外については MSDNでお調べください。「setwindowpos uflags」で検索すると出てきます。

SWP_NOMOVE 現在の位置を維持します(X パラメータと Y パラメータを無視します)。
SWP_NOSIZE 現在のサイズを維持します(cx パラメータと cy パラメータを無視します)。

実際の使い方ですが、いつもの通り私のプログラムコードから 抜粋させていただきます。


    /* Top Most を設定 */
    SetWindowPos(hWnd, HWND_TOPMOST,
                0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    
    /* Top Most を解除 */
    SetWindowPos(hWnd, HWND_NOTOPMOST,
                0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    





Copyright (c) 2003-2004 HIDEKAZU KAJIURA. All Rights Reserved.