2017-06-20 4 views
3

J'ai écrit une routine qui devrait ajouter une bordure en pointillé à un bitmap:Dessiner une bordure de points autour d'un 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; 

Mais lors de l'agrandissement du résultat, la limite résultant au lieu de points semble être faite de petits tirets:

enter image description here

Est-ce correct? Si non, comment puis-je obtenir de vrais points au lieu de tirets?

Répondre

2

DrawFocusRect c'est un appel d'API Windows qui crée une bordure comme vous le souhaitez.

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

Merci, cette fonctionne très bien! Mais juste par curiosité: Pourquoi il y a de petits tirets au lieu de vrais points (comme dans votre exemple) dans le résultat de mon code? – user1580348

6

Il peut sembler simple à utiliser DrawFocusRect, mais si vous avez besoin de dessiner quelque chose d'autre que des rectangles, vous pouvez lire en avance.

Le style de stylo psDot ne signifie pas que tous les deux pixels sont colorés et que l'autre est effacé. Si vous y réfléchissez, plus la résolution est élevée, plus il est difficile de voir la différence entre les points en pointillés et les points en gris. Il existe un autre style de stylo psAlternate qui alterne les pixels. Les docs disent:

psAlternate

Le stylo fixe tous les pixels. (Ce style s'applique uniquement aux stylos cosmétiques .) Ce style est uniquement valide pour les stylos créés avec la fonction API ExtCreatePen . (Voir les documents MS Windows SDK.) Cela s'applique à à la fois VCL et VCL.NET.

Pour définir le stylo et l'utiliser que nous faisons comme suit

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; 

Et enfin à quoi il ressemble (la loupe est à x 10)

enter image description here

+0

Merci pour l'indice! – user1580348

+3

@ user1580348 Je n'appellerais pas cela un indice, je ferais la réponse acceptée :-) –

+0

@Jerry Merci pour votre soutien. –