| コントロールを掴んで移動させる |
|
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 を探せば別の方法で移動させる方法もわかると思いますが、これは自分で調べてみてください。 |