イメージにべベルを付けるには?

解決


Skywalker  2004-07-29 18:44:04  No: 10144  IP: [192.*.*.*]

画像のエフェクトを拝見しました。べベルについては何も書いてありませんでしたのでお尋ねします。
主にインターネットでボタン等に使われているべベル効果はどの様にすれば作れるのでしょうか

編集 削除
LupinⅢ  URL  2004-07-29 19:11:06  No: 10145  IP: [192.*.*.*]

Imageの下にPanelを置いてそのPanelにべべル効果をつければいいのでは?

編集 削除
jok  2004-07-29 20:29:28  No: 10146  IP: [192.*.*.*]

新規で Form1 にやや大きめに Image1 とその外に Button1 を置いて、以下の
ようにしてみてください。

procedure TForm1.Button1Click(Sender: TObject);
var
  r:TRect;
begin
  Color := clYellow;
  Image1.Canvas.Brush.Color := clBtnFace;
  Image1.Canvas.FillRect(Image1.ClientRect);
  r := Rect(10,10,110,110);
  DrawEdge(Image1.Canvas.Handle,r,BDR_RAISEDOUTER or BDR_RAISEDINNER,BF_RECT);
  InflateRect(r,-3,-3);
  DrawEdge(Image1.Canvas.Handle,r,BDR_SUNKENOUTER or BDR_SUNKENINNER,BF_RECT);
end;

編集 削除
jok  2004-07-29 20:38:07  No: 10147  IP: [192.*.*.*]

> ボタン等に使われているべベル効果

プッシュボタンの場合は、DrawEdge() ではなく DrawFrameControl() をつかって
いるようです。また、フォーカスを得たときの点線の四角は DrawFocusRect() で
描きます。MSDN か付属の Win32.hlp をごらんください。

編集 削除
Skywalker  2004-07-30 13:58:17  No: 10148  IP: [192.*.*.*]

皆さん有難う御座います。
いろいろと試しているのですが、思った様にベベルが描けません。
jokさんのやり方でベベルは描けますがImage1のBitmapが上書きされてしまって、ただのボタンになってしまいます。私は、ベベルを付けた絵をセーブしたいんです。

編集 削除
jok  2004-07-30 14:20:23  No: 10149  IP: [192.*.*.*]

>私は、ベベルを付けた絵をセーブしたいんです。

最初の質問とは違いますね。

procedure TForm1.Button1Click(Sender: TObject);
var
  r:TRect;
begin
  r := Rect(10,10,110,110);
  DrawEdge(Image1.Canvas.Handle,r,BDR_RAISEDOUTER or BDR_RAISEDINNER,BF_RECT);
  InflateRect(r,-3,-3);
  DrawEdge(Image1.Canvas.Handle,r,BDR_SUNKENOUTER or BDR_SUNKENINNER,BF_RECT);
  Image1.Refresh;
end;

編集 削除
jok  2004-07-31 09:10:27  No: 10150  IP: [192.*.*.*]

WEB 素材のボタンのようなものをつくる場合は、DrawEdge() をつかって
ベベルを描くと背景を上書きしません。新規で Form1 に Image1 と Button1
を置いて、以下のようにしてみてください。

procedure TForm1.Button1Click(Sender: TObject);
var
  r:TRect;
  s:string;
begin
  Image1.Width := 100;
  Image1.Height := 30;

  r := Image1.ClientRect;
  s := 'Home';

  with Image1.Picture.Bitmap do begin
    Width := Image1.Width;
    Height := Image1.Height;

    Canvas.Brush.Color := RGB(100,200,150);
    Canvas.FillRect(r);

    Canvas.Font.Charset := DEFAULT_CHARSET;
    Canvas.Font.Name := 'Arial';
    Canvas.Font.Style := [fsBold];
    Canvas.Font.Color := clWhite;
    Canvas.Font.Size := 13;
    DrawText(Canvas.Handle,PChar(s),-1,r,DT_CENTER or DT_SINGLELINE or DT_VCENTER);

    DrawEdge(Canvas.Handle,r,EDGE_RAISED,BF_RECT);
  end;
end;

ここでは、FillRect() で背景を塗りつぶしていますが、そうしないで、
Image1.Picture.Bitmap.LoadFromFile() を使って予め背景に使う画像を
読み込んでおくこともできます。いずれにしても、DrawEdge() でボタンの
ようなベベルを周囲に描く事が出来ます。

編集 削除
Skywalker  2004-07-31 14:29:38  No: 10151  IP: [192.*.*.*]

有難う御座いました。
最初の質問と違うと言われればそうなのですが、初めからそうしたかったんのすが、質問は、『手短に』と書いてありましたので、短くし過ぎたようです。誤解を招く様な表現で済みませんでした。次回はしっかり書きます。

編集 削除