涼の成長記録

自らの人生に主導権を持つべく、独立を目指して2014年3月31日を持ってITエンジニアを退職。そんな23歳♂の成長記録。

C++Builderでフォームの移動を禁止する。

フォームの移動を抑止したい場合って結構あります。私がよく出くわすのは、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 でデバッグ/リリースモード時のみコンパイルするコード - 涼の成長記録


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