Obwódka tekstu napisów (Canvas)

0

Witam!

Mam taki problem. Jak zrobic obwódkę (obramowanie, oblanie) w kolorze np. czarnym liter tekstu na canvasie (w kolorze np. białym).
Chodzi o zrobienie napisów, które będą wyświetlane przy odtwarzaniu filmu, w playerze, ktory sobie pisze.
Mam problem z przeliczaniem wielkości czcionki i odleglością przesuniecia napisow - cieniów. Poniżej zamieszczam co udało mi się napisac - dla czcionki o rozmiarze 36 jest wszystko OK, tak jak chce, tj. napis w kolorze zielonym i czarna obwodka liter.


procedure WyswietlTekst(Kanwas : TCanvas; Tekst:string; KolorTekstu, Kolorobwodki : TColor; RozmiarCzcionki : integer);
.
.
.

procedure TForm1.Button1Click(Sender: TObject);
begin
   WyswietlTekst(Form1.Canvas,'To jest przykładowy tekst',clblack,clgreen,36);

end;



procedure TForm1.WyswietlTekst(Kanwas: TCanvas; Tekst: string; KolorTekstu, Kolorobwodki: TColor; RozmiarCzcionki: integer);
begin
   CzyscTlo(form1.Canvas,clwhite,clred); // czysci tlo...
   with kanwas do
      begin
// TŁA

         Brush.Style := bsClear;     // przesuniecie w lewo w gore
         Font.Style:=[fsbold];
         Font.Color :=KolorTekstu ;
         Font.Size := RozmiarCzcionki;
         TextOut(50-2, 100-2, Tekst);

            
         Font.Color :=KolorTekstu ;   // przesuniecie w lewo w dol
         Font.Size := RozmiarCzcionki;
         TextOut(50-2, 100+2, Tekst);

         Font.Color :=KolorTekstu ;   // wyrownanie( w lewo)
         Font.Size := RozmiarCzcionki;
         TextOut(50-2, 100, Tekst);

//i w drugo strone

         Font.Color :=KolorTekstu ;    // przesuniecie w prawo w gore
         Font.Size := RozmiarCzcionki;
         TextOut(50+2, 100-2, Tekst);

         Font.Color :=KolorTekstu ;    // przesuniecie w prawo w dol
         Font.Size := RozmiarCzcionki;
         TextOut(50+2, 100+2, Tekst);

         Font.Color :=KolorTekstu ;   // wyrownanie( w prawo)
         Font.Size := RozmiarCzcionki;
         TextOut(50+2, 100, Tekst);


//Tekst ORYGINALNY
       //  Brush.Style := bsClear;
         Font.Color := KolorObwodki;
         Font.Size := RozmiarCzcionki;
         TextOut(50, 100, Tekst);

      end;
end;

Pytanie, jak to zrobic by to działało niezaleznie od wybranej czcionki i jej rozmiaru?
Prosze o pomoc. Dzieki
Pozdr,pepe

0

Skorzystaj z metod objektu TCanvas: TextWidth, TextHeight lub TextExtent (tu od Delphi 3).
Najlepiej jakbyś uruchomił HELP-a i wpisał hasło TCanvas. Obejrzyj sobie wszystko co posiada i zastanów się jak najlepiej wykorzystać to, co masz POD RĘKĄ.

Pozdrawiam, Bocian

0

Skorzystaj z metod objektu TCanvas: TextWidth, TextHeight lub TextExtent (tu od Delphi 3).
Najlepiej jakbyś uruchomił HELP-a i wpisał hasło TCanvas. Obejrzyj sobie wszystko co posiada i zastanów się jak najlepiej wykorzystać to, co masz POD RĘKĄ.

Pozdrawiam, Bocian

Hmm.. cieszę sie, że wszystko mam pod ręką...
Mimo to ośmielę się zapytać jak i co wykorzystać, aby rozwiązać przedstawiony przeze mnie problem. Jakoś nie widze rozwiązania korzystając z funkcji TextWidth, któa zwraca szerokość tekstu...
Robił ktoś coś takiego? Proszę tylko o wskazówki..
Pozdr, pepe

0

Zmodyfikowałem nieco twój kod i jak u mnie działa całkiem nieźle. Wiadomo, że przy bardzo małych czcionkach się trochę zlewa, bo nie da się obwódki dać w częściach pixela, ale jest całkiem nieźle.

procedure TForm1.WyswietlTekst(Kanwas: TCanvas; Tekst: string; KolorTekstu, Kolorobwodki: TColor; RozmiarCzcionki: integer; X,Y : integer; GruboscObwodki:integer; Styl:TFontStyles);
begin
    with kanwas do begin
        Brush.Style := bsClear;
        Font.Style:= Styl;
        Font.Color := KolorObwodki ;
        Font.Size := RozmiarCzcionki;
        TextOut(X-GruboscObwodki, Y, Tekst);
        TextOut(X+GruboscObwodki, Y, Tekst);
        TextOut(X, Y-GruboscObwodki, Tekst);
        TextOut(X, Y+GruboscObwodki, Tekst);



        Brush.Style := bsClear;
        Font.Style:=Styl;
        Font.Color := KolorTekstu;
        Font.Size := RozmiarCzcionki;
        TextOut(X, Y, Tekst);
    end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    WyswietlTekst(Form1.Canvas, 'to jest przykładowy tekst', clGreen, clBlack, 32, 50, 100, 1, [fsBold]);
end;
0

<quote>Zmodyfikowałem nieco twój kod i jak u mnie działa całkiem nieźle. Wiadomo, że przy bardzo małych czcionkach się trochę zlewa, bo nie da się obwódki dać w częściach pixela, ale jest całkiem nieźle.
<quote>
No całkiem nieźle... Dzieki.
Ja sobie to zrobilem na kilku labelach odpowiednio przesunietych względem siebie - wtedy nie mialem problemu ze zlewniaem i nawet przy malych czcionkach wszystko wygloda extra... no ale zawsze to kilka labeli, a nie jeden wyrysowany tekst... takze dzieki za przyklad... przeanalizuje i najpewniej skorzystam :).
Pozdr

0

Labele? Mało eleganckie rozwiązanie. Najlepiej chyba narysować tekst na canvasie, a potem obtoczyć go odpowiednio pikselami. Jak chcesz, to zgłoś się do mnie na gg, wyślę ci źródełko.

0

Jak chcesz, to zgłoś się do mnie na gg, wyślę ci źródełko.

Czesc, poslij mi te zrodelka, jesli mozesz. Na gadu stukalem. //pozdr

1 użytkowników online, w tym zalogowanych: 0, gości: 1