Delphi-XE3を使っています。
Paintbox(あるいはBitmap)を不透明な単色で塗りつぶした後,円を描いてその内部を透明にくり抜きたいのです。つまり,Paintboxの背景が見えるようにしたいのです。
Brushカラーを透明色($00000000)に設定して円を塗りつぶしても,透明の絵の具を塗るのと同じで,何も変わりません。
何かよい方法はないでしょうか。
1.リージョンを使う
関連:BeginPath,EndPath,PathToRegion,SelectClipRgn
http://www.geocities.jp/asumaroyuumaro/program/tips/pathtoregion.html
2.マスク画像を用意してBitbltのOPERATORで工夫する
http://homepage1.nifty.com/project21/articles/delphi/tips02.htm
TCanvas云々で慣れているなら1の方法がよろしいかと。
画像処理関連はこの掲示板のHOMEからたどった所によいサンプルがあるので読んでみるとよろしいかと思います。
TCanvasを使わなくともアドレスとバッファさえあればOKみたいになれる・・・でしょう。
こんにちは。
FireMonkey だとパスでくり抜くしかないのですかね?
procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
var
  R: TRectF;
  PathData: TPathData;
  PB: TPaintBox;
begin
  PB := PaintBox1;
  with PB.Canvas do
    begin
      BeginScene;
      R := RectF(0, 0, PB.Width, PB.Height);
      OffsetRect(R, PB.Position.X, PB.Position.Y);
      Stroke.Color := TAlphaColorRec.White;
      Fill.Color   := TAlphaColorRec.White;
      PathData := TPathData.Create;
      try
        PathData.MoveTo(PointF(R.Left , R.Top   ));
        PathData.LineTo(PointF(R.Right, R.Top   ));
        PathData.LineTo(PointF(R.Right, R.Bottom));
        PathData.LineTo(PointF(R.Left , R.Bottom));
        PathData.LineTo(PointF(R.Left , R.Top   ));
        PathData.AddArc(PointF(R.Left + 100, R.Top + 100), PointF(50, 50), 0, 360);
        PathData.ClosePath;
        FillPath(PathData, 1);
      finally
        PathData.Free;
      end;
      EndScene;
    end;
end;
このコードでは、フォーム上に配置された PaintBox を白く塗り潰し、
(100,100) の位置に半径 50 の円をくり抜きます。
AddEllipse の同等のコードは以下のようになります。
PathData.AddEllipse(RectF(R.Left + 50, R.Top + 50, R.Left + 150, R.Top + 150));
FireMonkey環境なのでregionやbitbtは使えないのです。
DEKOさんのPathを使った方法でうまくいきました。
ありがとうございました。
| ツイート | 
        
         |