[VB6] Grootte van een letter uitlezen

Pagina: 1
Acties:
  • 211 views sinds 30-01-2008
  • Reageer

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Ik ben bezig met een applicatie, en nu wil ik dat die "weet" hoeveel pixels een letter in beslag neemt.
Stel, je hebt een tekstveld, en in dat tekstveld wil je net zoveel, of minder tekst kwijt als er in past.
Dan is het nogal een verschil of je die vult met i-tjes, of met W's.
De "i" neemt minder ruimte in beslag dan een "W", en derhalve kun je dus meer "i"-tjes kwijt in de beschikbare ruimte dan "W"s.

Nu is elk font een vector tekening, en ik vind dat het mogelijk moet zijn om de grootte van die vector uit te lezen.
Helaas bieden sites als
http://www.vbworld.com
http://www.programmersheaven.com en
google
geen oplossingen voor dit probleem.

Ik weet verder niet of het mogelijk is wat ik wil dus misschien is het wel logisch dat ik er niets over vind.

Mocht iemand weten of, en zo ja, hoe het mogelijk is de grootte van een font uit te lezen, dan zou ik zeer geholpen zijn.

Alvast bedankt.

[ Voor 0% gewijzigd door akakiwi op 15-10-2002 10:01 . Reden: foute URL neergezet. ]

| Life is a game (and games are fun) | homepage |


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

Hmm ik snap niet helemaal wat je uiteindelijk wilt ("je wilt net zoveel tekstkwijt als er in past", maxlenght zetten en er past iig nooit meer in :+
Maar o.a. een Form en PictureBox (en vast meer controls) hebben een TextWidth en TextHeight method, misschien kun je daar wat mee :)

Exact expert nodig?


  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Al naar de TextWidth() method gekeken?
:?

edit:
te laat...
Crazy_D schreef op 15 oktober 2002 @ 10:17:
Hmm ik snap niet helemaal wat je uiteindelijk wilt ("je wilt net zoveel tekstkwijt als er in past", maxlenght zetten en er past iig nooit meer in :+
Aan maxlength heeft hij niks, omdat je daarmee wel het aantal karakters, maar niet de fysieke breedte kunt beperken (tenzij je een fixed-width-font gebruikt natuurlijk)

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

Poohbear schreef op 15 oktober 2002 @ 10:17:
Aan maxlength heeft hij niks, omdat je daarmee wel het aantal karakters, maar niet de fysieke breedte kunt beperken (tenzij je een fixed-width-font gebruikt natuurlijk)
Das waar ik het niet snapte :+ Wil ie nou max 10 tekens kunnen laten invoeren, of maximaal het aantal tekens dat er in een textbox passen? (zodat je bv 30 keer een i kunt typen, maar maar 10 keer een W... ) :? (en wat is het nut :D)

Exact expert nodig?


  • Kama
  • Registratie: Mei 2002
  • Laatst online: 12:00

Kama

Aritifical Intelligenticus

Je kunt bijv. van een Label de property "Autosize" op True zetten, dan de tekst erin gooien en kijken wat de Width is van deze label.

Niels


  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 14-08 08:20

glashio

C64 > AMIGA > PC

Ik ben zelf ook tijdje opzoek omtrent deze oplossing ...

Picture1.Print "Life is all about bugs"

Hoeveel pixels (h*b) neemt deze regel inbeslag in een Picturebox....

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 13:39

johnwoo

3S-GTE

Het kan idd met een invisible label, maar een nettere manier is het gebruik van de GetTextExtentPoint32 API functie:
The GetTextExtentPoint32 function computes the width and height of the specified string of text.

BOOL GetTextExtentPoint32(
HDC hdc, // handle to DC
LPCTSTR lpString, // text string
int cbString, // characters in string
LPSIZE lpSize // string size
);
Voor VB kun je de volgende declaraties gebruiken:
Visual Basic .NET:
1
2
3
4
5
6
7
8
Type SIZE
   cx As Long
   cy As Long
End Type

Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" _
   (ByVal hdc As Long, ByVal lpString As String, ByVal cbString As Long, _
   ByRef lpSize As SIZE) As Long

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Kama
  • Registratie: Mei 2002
  • Laatst online: 12:00

Kama

Aritifical Intelligenticus

Hoe zit dat dan met de verschillend fonts en puntgroottes? Want die zie ik niet die functie ingaan. En nog iets... Deze functie geeft een BOOL terug?? (Nofi)

Niels


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 13:39

johnwoo

3S-GTE

Kama schreef op 15 oktober 2002 @ 10:59:
Hoe zit dat dan met de verschillend fonts en puntgroottes? Want die zie ik niet die functie ingaan. En nog iets... Deze functie geeft een BOOL terug?? (Nofi)
Zoals vele Win32 API functies wordt de waarde die je wilt hebben teruggegeven in een van de parameters, en geeft de functie zelf een error flag terug. Kijk goed naar de laatste lpSize parameter: juist, die gaat ByRef :)
De functie berekent de grootte van de string met de font die op dat moment geselecteerd is voor de DC die je meegeeft. Als je bijvoorbeeld een picturebox PictureBox1 hebt met Arial als font, dan kun je met de volgende code de size van de string "Hello, world!" in Arial opvragen:
Visual Basic .NET:
1
2
3
4
Dim TheSize As SIZE, TheString As String
TheString = "Hello, world!"
GetTextExtentPoint32(PictureBox1.hDC, TheString, Len(TheString), TheSize);
' TheSize.cx en TheSize.cy bevatten nu de grootte van de string.

Tip: lees de MSDN pagina waar ik naar link ;) Daar staat ook heel mooi [out] voor de lpSize parameter :P
De grootte wordt teruggegeven in 'logical units'. In C/C++ zijn dat standaard pixels; in VB weet ik niet zeker of het altijd pixels zijn, of dat er nog rekening gehouden wordt met de ScaleMode van de control. Dat zou je even uit moeten proberen :)

[edit]
Overigens werkt de AutoSize property intern gewoon met GetTextExtentPoint32 om te bepalen hoe groot het labeltje moet worden :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

TextWidth en TextHeight zal intern ook met die API werken, maar dan ben ik liever lui dan moe :P en gebruik gewoon de VB functies :)
Maar het printerobject heeft ook die functies dus tis niet zo spannend om daarmee te kijken hoeveel ruimte je text inneemt op papier. Uit m'n hoofd gezegt geven die functies terug in het formaat waarin de scalemode (was het toch? twips, pixels, etc) staat.
De API functie zelf zal altijd in pixels rekenen, aangezien windows het met pixels doet (alleen VB moest zonodig twips bedenken...).

Exact expert nodig?


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

Volgens mij is textWidth niet echt ideaal met niet fixed size fonts (zoals terminal, lucida console). Vroeger had ik er tenminste problemen mee :)

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Sorry, ben idd het een en ander vergeten.
De meeste zullen wel weten wat een EPS bestand is.
Wanneer je in een EPS bestand tekst hebt, dan staat in het bestand zelf (kun je gewoon openen in je notepad en dan zie je gewoon plain text) precies waar teksten in het bestand moeten komen door middel van x/y coordinaten, het aantal karaters wat de tekst bevat, en de lengte (in pixels) van het tekstveld.

Die lengte van het tekstveld moet dus worden aangepast wanneer je er tekst in past.
Je zult begrijpen dat 50 "i"tjes minder ruimte innemen dan 50 "w"tjes.

Het is dus zaak dat ik weet hoeveel pixels een karakter in beslag neemt en door hiermee aan het rekenen te gaan kan ik dus achter de lengte van het tekstveld komen.

Het gebruik van fixed size fonts, is geen optie, omdat de EPS bestanden die gegenereerd worden gebruikt worden voor reclame doeleinden.

| Life is a game (and games are fun) | homepage |

Pagina: 1