アイコンを拡大して表示するには

解決


風邪  2004-03-13 02:45:40  No: 7654

TImageのPictureにあるアイコンを拡大して表示したいのですが・・


jok  2004-03-13 04:22:28  No: 7655

TImage がフォームの上にあるとして 100x100 で描画するには

procedure TForm1.Button1Click(Sender: TObject);
var
  IC:TIcon;
begin
  IC := TIcon.Create;
  try
    IC.Assign(Image1.Picture);
    Image1.Picture.Bitmap.Width := 100;
    Image1.Picture.Bitmap.Height := 100;
    Image1.Canvas.Brush.Color := Color;
    Image1.Canvas.FillRect(Rect(0,0,100,100));
    DrawIconEx(Image1.Canvas.Handle,0,0,IC.Handle,100,100,0,0,DI_IMAGE or DI_MASK);
  finally
    IC.Free;
  end;
end;


風邪  2004-03-13 06:12:04  No: 7656

Thank you..


風邪  2004-03-13 06:21:58  No: 7657

成功しましたが、作成済みのプロジェクトで使用したところ
TPictureをTImageに代入できませんって・・何故だ〜!?


風邪  2004-03-13 06:25:57  No: 7658

みす
別のTImageを指定していました


風邪  2004-03-13 06:31:46  No: 7659

すみません
Image1.Canvas.Brush.Color := white;
とした所、このイメージの後には画像があり、このイメージは常時移動しています
背景を透過させたいのですがマスクはできないのでしょうか?


jok  2004-03-13 06:36:53  No: 7660

> このイメージの後には画像があり、このイメージは常時移動しています

これはですね、最初の質問が TImage.Picture にアイコンが読み込まれているの
でややこしくなっているんです。はじめから TIcon で読み込ませると例のコード
のようにして DrawIconEx() でマスクを指定して任意の場所に拡大描画できます。


風邪  2004-03-13 06:42:16  No: 7661

マスクがどこにあってどこにどうすれば良いのやら・・
分からん..


風邪  2004-03-13 06:45:55  No: 7662

16*16の透過済みアイコンの入ったTImageを、
背景画像の上で48*48に拡大された状態で透過されたまま移動させたいのですが、
移動するアイコンを拡大時に透過されたままにしたいわけです


jok  2004-03-13 07:15:12  No: 7663

Image1 に背景画像があるとして、その上で動かすアイコンは PaintBox1 に
描くことにし、移動は PaintBox1 の Left Top を変化させるとします。

新規で以下のようにしてください。Image1 には予め大きめの画像を読み込んで
おきます。ImageList1 をダブルクリックしてアイコンを一つ読み込んでおきます。
PaintBox1 は Image1 の上に置きます。

Button1 を押すと、アイコンの画像がピコピコ移動します。

type
  TForm1 = class(TForm)
    Image1: TImage;
    ImageList1: TImageList;
    PaintBox1: TPaintBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    Icon:TIcon;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  PaintBox1.Width := 48;
  PaintBox1.Height := 48;

  Icon := TIcon.Create;
  ImageList1.GetIcon(0,Icon);

  Randomize;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Icon.Free;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  DrawIconEx(PaintBox1.Canvas.Handle,0,0,Icon.Handle,48,48,0,0,DI_NORMAL);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PaintBox1.Left := Random(300);
  PaintBox1.Top := Random(300);
end;


にしの  2004-03-13 07:34:55  No: 7664

単に、アイコンのImageの、TransparentをTrueにするだけではだめですか?


jok  2004-03-13 07:52:47  No: 7665

> にしのさん
> 単に、アイコンのImageの、TransparentをTrueにするだけではだめですか?

アイコンを拡大描画したビットマップの Transparent を True にするのと
アイコン自体がもっているマスクで縁取りした拡大描画は違います。でも、
マスクが右下隅のピクセルを含む場合は同じになりますので、ほとんど
の場合は一緒でしょうね。


jok  2004-03-13 07:55:32  No: 7666

間違えました

× 右下隅のピクセルを含む場合
○ 左下隅のピクセルを含む場合


にしの  2004-03-13 10:10:53  No: 7667

なるほど、忘れてました。
# 試したアイコンは縁が透明だったので

それならば、Imageの高さをアイコンの拡大後の高さより1ピクセル高くしてTransparentを設定するとか。
# 未確認です
その場合にも問題があり、アイコンの中で使用していない色を背景にしないとたぶんだめですね。


風邪  2004-03-13 17:29:34  No: 7668

>その場合にも問題があり、アイコンの中で使用していない色を背景にしないとたぶんだめですね。
黒一色ですのでそれでも問題ありませんが


風邪  2004-03-13 18:22:28  No: 7669

jokさんので完璧でした
有り難う御座いました


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

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






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