2017-06-20 14 views
3

私はビットマップに点線の境界線を追加する必要がありルーチン書かれています:TBitmapの周囲に点線の境界線を描く?

procedure AddDottedBorderToBitmap(aBM: Vcl.Graphics.TBitmap); 
var 
    c: TCanvas; 
begin 
    c := aBM.Canvas; 
    c.Pen.Color := clBlack; 
    c.Pen.Mode := pmXor; 
    c.Pen.Style := psDot; 

    c.MoveTo(0, 0); 
    c.LineTo(0, aBM.Height - 1); 
    c.LineTo(aBM.Width - 1, aBM.Height - 1); 
    c.LineTo(aBM.Width - 1, 0); 
    c.LineTo(0, 0); 
end; 

をしかし、結果を拡大する場合、代わりにドットの結果の境界線は、小さなダッシュで作られているようだ:

enter image description here

これは間違いありませんか?そうでない場合は、どうすればダッシュの代わりに本当の点を得ることができますか?

答えて

2

DrawFocusRectこれは、必要に応じて境界線を作るWindows API呼び出しです。

procedure AddDottedBorderToBitmap(aBM: Vcl.Graphics.TBitmap); 
begin 
    DrawFocusRect(aBM.canvas.Handle,Rect(0,0,aBM.Width,aBM.Height)); 
end; 
+0

、これをありがとう非常にうまくいく!しかし、ちょうど好奇心から:私のコードの結果に本当の点の代わりに小さなダッシュ(あなたの例のような)があるのはなぜですか? – user1580348

6

それはDrawFocusRectを使用して簡単に見えるかもしれませんが、あなたは、長方形以外のものを描画する必要がある場合は、先に読むことをお勧めします。

ペンスタイルpsDotは、すべての2番目のピクセルが着色され、もう1つのピクセルがクリアされることを意味しません。あなたがそれについて考えると、解像度が高いほど、点線と灰色の固体f.exの違いを見るのが難しくなります。ピクセルを交互に変更する別のペンスタイルpsAlternateがあります。ドキュメントは言う:

psAlternate

ペンが他のすべてのピクセルを設定します。 (このスタイルは 化粧ペンにのみ適用されます)このスタイルは、 ExtCreatePen API関数で作成されたペンでのみ有効です。 (MS Windows SDKのドキュメントを参照してください。)これは、VCLとVCL.NETの両方の に適用されます。

ペンを定義し、最終的にそれは(拡大鏡が×10である)のように見えるもの

var 
    c: TCanvas; 
    oldpenh, newpenh: HPEN; // pen handles 
    lbrush: TLogBrush;  // logical brush 

... 

    c := pbx.Canvas; // pbx is a TPintBox, but can be anything with a canvas 

    lbrush.lbStyle := BS_SOLID; 
    lbrush.lbColor := clBlack; 
    lbrush.lbHatch := 0; 

    // create the pen 
    newpenh := ExtCreatePen(PS_COSMETIC or PS_ALTERNATE, 1, lbrush, 0, nil); 
    try 
    // select it 
    oldpenh := SelectObject(c.Handle, newpenh); 

    // use the pen 
    c.MoveTo(0, 0); 
    c.LineTo(0, pbx.Height - 1); 
    c.LineTo(pbx.Width - 1, pbx.Height - 1); 
    c.LineTo(pbx.Width - 1, 0); 
    c.LineTo(0, 0); 

    c.Ellipse(3, 3, pbx.width-3, pbx.Height-3); 

    // revert to the old pen 
    SelectObject(c.Handle, oldpenh); 
finally 
    // delete the pen 
    DeleteObject(newpenh); 
end; 

に従い、として私たちはそれを使用する

enter image description here

+0

ヒントありがとう! – user1580348

+3

@ user1580348私はこれをヒントと呼んでいません。私はそれを受け入れる答えにします:-) –

+0

@Jerryあなたのサポートをありがとう。 –

関連する問題