フォームの移動を抑止したい場合って結構あります。私がよく出くわすのは、XGAで画面いっぱいに広がるフォームを作りたい場合です。TFormのAlignプロパティをalClientにすれば簡単に実現可能なのですが、こうするとSXGA、フルHDなどの大きな解像度で実行したい時(開発中など)にうざいです。


そこで、AlignプロパティをalNoneにした上で、フォームのサイズを固定にする必要があるわけですね。下記のWEBサイトの通り、やり方は簡単です。
フォーム・移動制限(水平・垂直・固定)


WM_MOVINGメッセージをフックするのですね。つまり、ウィンドウプロシージャに送られるはずのメッセージを、アプリケーションが横取りするわけです。この例では、WM_MOVINGメッセージが飛んできた時に、自前のメソッドをコールするようにマッピングしています。こんな感じですね。

private:
    /*!
        フォームの移動を抑止する。

        @param  message :フックしたメッセージの中身
        @return なし。
    */
    void __fastcall windowMovingBlock(TMessage &message);

protected:
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_MOVING, TMessage, windowMovingBlock);
    END_MESSAGE_MAP(TForm);


そして、自前のメソッドの実装は、こんな感じです。移動されたのを戻すような感じでしょうか。もっとスマートにフィルタする、つまりメッセージをウィンドウプロシージャへ届かなくする方法があれば良いのですが。。

//------------------------------------------------------------------------------
// フォームの移動を抑止する。
//------------------------------------------------------------------------------
void __fastcall TForm_Main::windowMovingBlock(TMessage &message) {
#ifndef _DEBUG
    TRect *rect = (TRect *)message.LParam;
    OffsetRect((RECT *)rect, (Left - rect->Left), (Top - rect->Top));
#endif
}


ここでも、昨日のテクニックが使えるわけです。(テクニックとか偉そうに。。)
デバッグ中は、フォームを動かせないと、何かと困ったりするかもしれませんからね。
C++Builder でデバッグ/リリースモード時のみコンパイルするコード - 涼の成長記録


いやー、プログラミングって楽しいですね。
ではでは。