2017-06-20 171 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並不意味着每個第二個像素都被着色,另一個像素被清除。如果你仔細想一想,分辨率越高,看到虛線與灰色固體f.ex的區別就越困難。還有另一種筆式psAlternate,它交替像素。該文件說:

psAlternate

筆將每隔一個像素。 (此樣式僅適用於 化妝筆。)此樣式僅適用於使用ExtCreatePen API函數創建的筆。 (請參閱MS Windows SDK文檔。)這適用於VCL和VCL.NET的 。

定義畫筆和使用它,我們做如下

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; 

最後是什麼樣子(放大鏡在x 10)

enter image description here

+0

謝謝你的提示! – user1580348

+3

@ user1580348我不會稱之爲暗示,我會讓它成爲公認的答案:-) –

+0

@Jerry感謝您的支持。 –