パネルにリージョンを


ss  2011-03-03 06:57:58  No: 40134

パネルにリージョンを適用する場合、BevelがBSNONEで
かつBorderStyleがBSNONEでないと、下記のコードでただしく
角が丸くならないのですが、どうしてでしょうか?
BevelInnerがBvLoweredでも角が丸くなるようにできません
でしょうか?
よろしくお願いします。

WinXpSp2+Delphi7

procedure TForm1.Button1Click(Sender: TObject);

 var
      BtnRgn : HRgn;
begin
   BtnRgn := CreateRoundRectRgn(0,0, Panel1.Width, Panel1.Height, 3, 3);
        SetWindowRgn(Panel1.Handle, BtnRgn, True);

         DeleteObject(BtnRgn);
end;


tor  2011-03-03 20:06:40  No: 40135

リージョンというのはウィンドウを変形させるのではなく、指定した形に切り抜く機能です。
「ただしく角が丸く」なるというのが、切り取った形に沿って枠線も曲がることを期待しているのならそれは無理というものです。
TPaintBoxなどを使って自分で丸い枠を描画するか、TShapeなどを組み合わせて表現するしかないでしょう。

例えば
(1) Shape=stRoundRect, Pen.Color = clBtnHighlight に設定したTShapeを置く
(2) Shape=stRoundRect, Pen.Color = clBtnHighlight, Brush.Color = bsClear に設定して
WidthとHeightを(1)より1ピクセル小さくしたTShapeを上に重ねる
とすると、完全に同じではないもののbvLoweredっぽい見た目になりますがどうでしょうか。


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

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






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