TFormの境界線を消した場合(BorderStyle=bsNone)の移動とリサイズ
以下の設定をすれば、TFormを移動したり、サイズの変更が可能。ただし、Vistaだと境界線が残る。
class TForm1 : public TForm { __published: // IDE 管理のコンポーネント private: // ユーザー宣言 public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); protected: // BorderStyleがbsNoneでもリサイズ可能にする void __fastcall CreateParams(TCreateParams &Params) { TForm::CreateParams(Params); Params.ExStyle |= WS_EX_STATICEDGE; Params.Style |= WS_SIZEBOX; } // クライアント領域のドラッグでフォームを移動可能にするため状態を保存する int m_XX; int m_YY; bool m_Dragging; };
OnMouseDownとOnMouseMoveを定義。TPanel類を貼ったら、そいつにも定義すること。
//--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { m_XX = X; m_YY = Y; m_Dragging = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (Shift.Contains(ssLeft) && (m_XX != X || m_YY != Y) && m_Dragging) { ReleaseCapture(); SendMessage(this->Handle, WM_SYSCOMMAND, SC_MOVE | 2, MAKELONG(X, Y)); m_Dragging = False; } } //---------------------------------------------------------------------------
"SC_MOVE | 2"の"2"の意味は、ここによると"WM_SYSCOMMAND によって送信された値"であることを明示するためとのこと。