コントロールを掴んで移動させる
TWinControl から派生したコントロールを掴んで移動できるようする方法を解説します。サブクラス化でも行うことも可能ですが、ここではコンポーネントを派生させて移動できるコンポーネントを作成してみましょう。 TPanel から派生させて TMoveablePanel という移動できるパネルを作成したいと思います。

まずはIDEのメニューから「コンポーネント」>「コンポーネントの新規作成」をクリックして上位クラスに TPanel 、クラス名に TMoveablePanel と入力してOKボタンを押してください。
で、ここからが本番です。いつでもコントロールが移動できるようになっていると困るので、publishedに Moveable というBoolean型のプロパティを定義します。このプロパティがTrueの場合は移動できるようにします。
掴んで移動させるにはいくつか方法がありますが、ここでは WM_SYSCOMMAND を使用する方法で行きます。

type
  TMoveablePanel = class(TPanel)
  private
    { Private 宣言 }
    FMoveable: Boolean;
  protected
    { Protected 宣言 }
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
                        X, Y: Integer); override;
  public
    { Public 宣言 }
  published
    { Published 宣言 }
    property Moveable: Boolean read FMoveable write FMoveable;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMoveablePanel]);
end;

{ TMoveablePanel }

procedure TMoveablePanel.MouseDown(Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not (csDesigning in ComponentState) then
    if FMoveable and (Button = mbLeft) then begin
      ReleaseCapture;
      SendMessage(Handle, WM_SYSCOMMAND, SC_MOVE or 2, 0);
    end;
  inherited MouseDown(Button, Shift, X, Y);
end;

これで完成です(^^;
あとはこのソースを保存してインストールしてみてください。 Moveable をTrueにするとパネルをマウスでぐりぐり動かすことができます。ただ、処理を見ればわかるとおりウインドウハンドルを持ったコントロールしか移動できません。また、フォームでこの処理を行うとフォームを掴んで移動できるようになります。タイトルバー無しのフォームをマウスで掴んで移動させたい場合に活用できると思います。

Win32ヘルプで WM_NCHITTEST を探せば別の方法で移動させる方法もわかると思いますが、これは自分で調べてみてください。

Back    Next