読者です 読者をやめる 読者になる 読者になる

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 によって送信された値"であることを明示するためとのこと。