画像のエフェクトを拝見しました。べベルについては何も書いてありませんでしたのでお尋ねします。
主にインターネットでボタン等に使われているべベル効果はどの様にすれば作れるのでしょうか
Imageの下にPanelを置いてそのPanelにべべル効果をつければいいのでは?
新規で 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;
> ボタン等に使われているべベル効果
プッシュボタンの場合は、DrawEdge() ではなく DrawFrameControl() をつかって
いるようです。また、フォーカスを得たときの点線の四角は DrawFocusRect() で
描きます。MSDN か付属の Win32.hlp をごらんください。
皆さん有難う御座います。
いろいろと試しているのですが、思った様にベベルが描けません。
jokさんのやり方でベベルは描けますがImage1のBitmapが上書きされてしまって、ただのボタンになってしまいます。私は、ベベルを付けた絵をセーブしたいんです。
>私は、ベベルを付けた絵をセーブしたいんです。
最初の質問とは違いますね。
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;
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() でボタンの
ようなベベルを周囲に描く事が出来ます。
有難う御座いました。
最初の質問と違うと言われればそうなのですが、初めからそうしたかったんのすが、質問は、『手短に』と書いてありましたので、短くし過ぎたようです。誤解を招く様な表現で済みませんでした。次回はしっかり書きます。
ツイート | ![]() |