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 でデバッグ/リリースモード時のみコンパイルするコード - 涼の成長記録
いやー、プログラミングって楽しいですね。
ではでは。