ShapeのpsDotで、点線が動いているように見えるようにするには?

解決


かんとく  2010-06-23 01:20:40  No: 38702

お世話になっております。

Delphi2007,XPです。

Shapeを置き、
Shape=stRectangle
Pen.Style=psDot
にすると、辺が点々の長方形になりますが、
この点々を、動いているように見せたいのです。

具体的には、Timerを置いて、1秒ごとに、長方形の辺の点の部分と空白の部分が入れ替わるみたいな感じにしたいのです。

Pen.StyleとかPen.Modeとかをいろいろいじっていますが、思うとおりになりません。

よろしくお願いします。


tor  2010-06-23 03:00:13  No: 38703

Shapeでは実現が難しいので、Imageなどを置いて自分で描画するのはどうでしょう。
Rectangleの変わりにLineToで長方形の四辺を描画するようにし、
開始点を少しずつずらしていけば原理的には点線が動いているように見えます。

procedure TForm1.FormCreate(Sender: TObject);
begin
  // ずらす量を管理する変数を用意
  FOffset := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  rc: TRect;
begin
  FOffset := (FOffset + 1) mod 6; // pdDotの場合、繰り返し周期は3+3=6みたい

  rc := Image1.ClientRect;
  Dec(rc.Right); // Rectangleは矩形の右と下の端を含まないので、それに合わせて調整
  Dec(rc.Bottom);
  with Image1.Canvas do
  begin
    Pen.Style := psDot;
    MoveTo(rc.Left + FOffset, rc.Top); // offset分ずれた位置から点線を引き始める
    LineTo(rc.Right, rc.Top); // 上
    LineTo(rc.Right, rc.Bottom); // 右
    LineTo(rc.Left, rc.Bottom); // 下
    LineTo(rc.Left, rc.Top); // 左
    LineTo(rc.Left + FOffset, rc.Top); // 最後に開始点とつなぐ
  end;
end;

中も塗りつぶしたい場合は、線を引く前にFillRectしてください。
さて、実際にやってみるとわかりますが、これだけだと辺の長さの合計が6の倍数でない場合、始点が0に戻る時に左上隅が不自然に動きます。
気になるようだったら、始点が長方形をぐるりと一周するように改良してみてください。


tor  2010-06-23 19:05:16  No: 38704

不連続が発生しないようちょっと修正

...
  rc := Image1.ClientRect;
  // ClientRect以外の領域に描画する場合、矩形の外にはみ出さないよう
  // ここでクリッピング領域を設定しなくてはいけない。
  // やり方はTCanvas.ClipRectのヘルプにあるExampleを参照
  Dec(rc.Right); // Rectangleでは矩形の右と下の端を含まないお約束なので、それに合わせて調整
  Dec(rc.Bottom);
  with Image1.Canvas do
  begin
    Pen.Style := psDot;
    MoveTo(rc.Left - FOffset, rc.Top); // offset分はみ出した位置から点線を引き始める
    LineTo(rc.Right, rc.Top); // 上
    LineTo(rc.Right, rc.Bottom); // 右
    LineTo(rc.Left, rc.Bottom); // 下
    LineTo(rc.Left, rc.Top); // 左
  end;
end;


かんとく  2010-06-23 20:04:40  No: 38705

ありがとうございます。

Adobeのイラストレーターのように、Imageの上に描画した画像や文字を、ドラッグして移動するプログラムを作っていました。

教えてもらったようにImageに点々を描くと、元のImageと点々用のImageが重なってしまい、画像や文字がドラッグできなくなってしまったので、Imageではなく、PaintBoxを置き、PaintBoxのEnable=Falseにしてみました。
そうすると、元のImageの上にある画像や文字がドラッグできましたし、点々も動きました。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加