プログラミングゆるめモ

プログラミングに関することをゆるくメモしてます

C++ C++Builder Windows

[C++Builder]アプリのウインドウを画面端に留める方法

Windowsアプリのウインドウを画面の端に移動させると
画面の端ぴったりに吸い付くように留める(snap)ことができるアプリがあります。
そんな、snap機能を実現する方法です。
Windowsのメッセージ WM_WINDOWPOSCHANGING が送られてきたら
自分自身のウインドウの位置を端にぴったりになるように変更する処理をします。

メッセージマップに処理するメッセージと処理する関数を記述します

具体的な処置関数
ウインドウ位置が画面端とRANGE(==8)以下になったら、ウインドウ位置を変更します

 

WM_WINDOWPOSCHANGING の詳細
WM_WINDOWPOSCHANGING ウィンドウのサイズ、 位置、 Z順序などが変更されようとしているウィンドウに送られます
typedef struct tagWINDOWPOS {
HWND hwnd;        ウインドハンドル
HWND hwndInsertAfter;   手前のウインド
int x;            左端x
int y;            左端y
int cx;            幅
int cy;            高さ
UINT flags;          ウィンドウの位置決めオプションを指定します(説明は下記)
} WINDOWPOS;

UINT flags;
SWP_DRAWFRAME ウィンドウの周囲に、ウィンドウ クラスで定義される枠を描画します。ウィンドウは WM_NCCALCSIZE メッセージを受け取ります。
SWP_FRAMECHANGED ウィンドウのサイズが変化されていない場合でも、ウィンドウに WM_NCCALCSIZE メッセージを送信します。このフラグが指定されていない場合、WM_NCCALCSIZE メッセージはウィンドウのサイズが実際に変化しているときにだけ送られます。
SWP_HIDEWINDOW ウィンドウを非表示にします。
SWP_NOACTIVATE ウィンドウをアクティブにしません。
SWP_NOCOPYBITS クライアント領域の内容全体を破棄します。このフラグが指定されていない場合、クライアント領域の有効な内容はすべて保存されます。保存された内容は、ウィンドウのサイズや位置が再び変更されたときにクライアント領域に復元されます。
SWP_NOMOVE 現在の位置を保持します。x メンバと y メンバは無視されます。
SWP_NOOWNERZORDER オーナー ウィンドウの Z オーダーの位置を変更しません。
SWP_NOSIZE 現在のサイズを保持します。cx メンバと cy メンバは無視されます。
SWP_NOREDRAW 変更があっても再描画しません。
SWP_NOREPOSITION SWP_NOOWNERZORDER と同じです。
SWP_NOSENDCHANGING ウィンドウが WM_WINDOWPOSCHANGING メッセージを受信しないようにします。
SWP_NOZORDER Z オーダーでの現在の順序を保持します。hwndInsertAfter メンバは無視されます。
SWP_SHOWWINDOW ウィンドウを表示します。

-C++, C++Builder, Windows