Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Tacna sirina stringa na Canvasu

[es] :: Pascal / Delphi / Kylix :: Tacna sirina stringa na Canvasu

[ Pregleda: 1774 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

krle_zr

Član broj: 96307
Poruke: 258
77.46.231.*



+7 Profil

icon Tacna sirina stringa na Canvasu17.11.2007. u 12:46 - pre 200 meseci
Ideja je da se nakon iscrtavanja nekog stringa (preuzetog iz RichEdit komponente) u Canvasu dobije tacna sirina stringa. Radi se o TrueType fontu, jer ce zavrsna slika ici u WMF. Napominjem da sam vec probao s funkcijama GetTextWidth, odnosno GetTextExtentPoint32 (API) i one lepo rade kad je u pitanju normalan font. Medjutim cim promenim stil fonta na Italic odmah prikazuje pogresno, npr. string 'asdf' vraca duzinu od 20 piksela i to je tacno, a italic vraca isto 20, a prava duzina je 26 . Cackao sam po Netu i naisao na funkciju GetTextMetric, medjutim ona ne radi sa TrueType fontovima. Isto tako sam probao s funkcijom GetCharaABCWidths koja bi trebalo da vrati odsutpanje karaktera (npr f) tj. Overhang, ali mi ona stalno vraca gresku. Na Netu sam pronasao par primera koji ovo resavaju, ali su svi oni pisani u C++. Evo kako sam ja probao:

Code:

procedure TForm1.AdjustEndRect(var CharW: Integer; Key: Char; MyCanvas: TCanvas);
var
  iLastChar: cardinal;
  iCharWidth: integer;
  iCharInfo: TABC;
  dc: HDC;
begin
  dc := MyCanvas.Handle;
  iLastChar := Ord(Key);
  if GetCharABCWidths( dc, iLastChar, iLastChar, iCharInfo ) then  //ovde vraca gresku
  begin
    iCharWidth := iCharInfo.abcA + integer(iCharInfo.abcB);
    if iCharInfo.abcC >= 0 then           //ako postoji odsupanje dodaj abcC
      Inc( iCharWidth, iCharInfo.abcC );
  end
  else
    GetCharWidth( dc, iLastChar, iLastChar, iCharWidth ); //ako ne, tekst nema odstupanja sledi obicna probera

  if iCharWidth > 0 then
    Inc( CharW, iCharWidth );
end;


Mozda sam nesto gadno pogresio ovde, posto sam slabije do sad radio sa API-jem.
Pozdrav
 
Odgovor na temu

[KS]
Damir Kasipovic
Banjaluka

Član broj: 55395
Poruke: 46
80.242.124.*



Profil

icon Re: Tacna sirina stringa na Canvasu17.11.2007. u 22:52 - pre 200 meseci
Canvas.TextWidth(text: string); ?
Damir Kasipović
[email protected]
+387 (0)65 979 949
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Tacna sirina stringa na Canvasu17.11.2007. u 23:40 - pre 200 meseci
> fontu, jer ce zavrsna slika ici u WMF. Napominjem da sam vec probao s funkcijama GetTextWidth, odnosno GetTextExtentPoint32 (API) i one lepo rade
> kad je u pitanju normalan font. Medjutim cim promenim stil fonta na Italic odmah prikazuje pogresno,
> npr. string 'asdf' vraca duzinu od 20 piksela i to je tacno, a italic vraca isto 20, a prava duzina je 26 .

Onda negde grešiš, GetCharWidth možeš koristiti za dobijanje širine pojedinih karaktera odnosno niza karaktera pri čemu se uzima u obzir selektovan font i njegovi atributi u datom device contextu tj. TCanvasu. Isto važi za GetTextExtentPoint32. U principu ako ti treba širina nekog teksta koristiš GetTextExtentPoint32 ili TCanvas.TextWidth koji se svodi na tu funkciju.

> Cackao sam po Netu i naisao na funkciju GetTextMetric, medjutim ona ne radi sa TrueType fontovima.

??? Itekako radi sa TT fontovima, mada je ona namenjena za druge stvari, ne za ono što tebi treba.

> Isto tako sam probao s funkcijom GetCharaABCWidths koja bi trebalo da vrati odsutpanje karaktera (npr f) tj. Overhang, ali mi ona stalno vraca gresku.

Onda opet je ne koristiš kako treba, s tim što ona i nije namenjena za svrhu koju ti planiraš.

 
Odgovor na temu

krle_zr

Član broj: 96307
Poruke: 258
77.46.229.*



+7 Profil

icon Re: Tacna sirina stringa na Canvasu18.11.2007. u 23:17 - pre 200 meseci
Hvala na odgovorima, ali se stvar u medjuvremenu zakomplikovala, pa cu morati da merim slovo po slovo (zbog razlicitih stilova).
Pozdrav
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Tacna sirina stringa na Canvasu19.11.2007. u 07:08 - pre 200 meseci
Čekaj, ti hoćeš da izmeriš širinu jedne linije teksta u TRichEdit-u, koji može da ima i više stilova, fontova i sl. istovremeno ?

P.S.
Ako nije to, onda pogledaj Delphi primere koji uzimaju u obzir TControlCanvas (pretraži NNTP grupe, recimo keywords: delphi TControlCanvas width).


[Ovu poruku je menjao X Files dana 19.11.2007. u 08:20 GMT+1]
 
Odgovor na temu

krle_zr

Član broj: 96307
Poruke: 258
77.46.211.*



+7 Profil

icon Re: Tacna sirina stringa na Canvasu19.11.2007. u 11:50 - pre 200 meseci
Citat:
X Files: Čekaj, ti hoćeš da izmeriš širinu jedne linije teksta u TRichEdit-u, koji može da ima i više stilova, fontova i sl. istovremeno ?


Upravo tako, jer ceo sadrzaj jednog reda ce ici na recimo PaintBox1.Canvas, i to nije problem.
Evo koda:
Code:

procedure TForm1.RichEditToCanvas(RichEdit: TRichEdit; Canvas: TCanvas; PixelsPerInch: Integer);
var
  ImageCanvas: TCanvas;
  fmt: TFormatRange;
begin
  ImageCanvas := Canvas;
  with fmt do
  begin
    hdc := ImageCanvas.Handle;
    hdcTarget := hdc;
    // rect needs to be specified in twips (1/1440 inch) as unit
    rc:=  Rect(0, 0,
                ImageCanvas.ClipRect.Right * 1440 div PixelsPerInch,
                ImageCanvas.ClipRect.Bottom * 1440 div PixelsPerInch
                );
    rcPage:= rc;
    chrg.cpMin := 0;
    chrg.cpMax := RichEdit.GetTextLen;
  end;
  SetBkMode(ImageCanvas.Handle, TRANSPARENT);
  RichEdit.Perform(EM_FORMATRANGE, 1, Integer(@fmt));
  // next call frees some cached data
  RichEdit.Perform(EM_FORMATRANGE, 0, 0);
end;


Medjutim, meni je problem sto ovaj kod lepi ceo sadrzaj RichEdit-a na Canvas, a nemogu da dobijem tacnu sirinu posto sve gore navedene funkcije(TextWidth, GetTextMetric, GetCharABCWidths), mi ne vracaju tacnu sirinu stringa, posebno kad je stil italic, npr. pokusajte da kod komponente StaticText promenite stil fonta na italic i stavite vrednost svojstva AutoSize na True, primeticete da su nekoliko poslednjih piksela fonta odseceni. Jer ideja je da se prilikom svakog unosa u RichEdit menja velicina komponente sa Canvas-om, koja odgovara visini i sirini fonta. Dao sam primer sa StaticText-om, jer cete tu najbolje videti na sta mislim odnosno rezultat funkcije TextWidth, koju interno koristi ova komponenta(stavite velicinu fonta 24, Italic i tekst 'asdf' i falice skoro ceo karakter).
Pozdrav

[Ovu poruku je menjao krle_zr dana 19.11.2007. u 13:00 GMT+1]
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Tacna sirina stringa na Canvasu19.11.2007. u 12:18 - pre 200 meseci
Pogledaj ovde, možda nešto uspeš da iskoristiš (kod je VCL i API):
http://www.elitesecurity.org/t253482-0#1524103

Prikazani kod vrši širenje dimenzija TRichEdit objekta (Width, Height) da bi se ceo tekst prikazao. Dakle, određuje se linija najveće širine i to uzima za Width. Visinu je kao lakše izračunati.

Kod nije 100% doteran, postoje i neke stvari koje nisu uzete u obzir ali meni uglavnom vrši posao.

 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Tacna sirina stringa na Canvasu

[ Pregleda: 1774 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.