Länge eines Textes in Pixel

Liebes Forum!

Ich gebe mit einer Funktion über Displaylisten und zvor geladenen Bitmapfonts Text in einer OpenGL Szene aus. Ich möchte jetzt aber wissen, wie lang dieser Text in Pixel ist. Ich brauch das für eine selbst gezeichnete Multiline Textbox. Kann mir jemand helfen?

mfg dixxi

Ok ich hab hätte jetzt schon eine Lösung gefunden, dafür müsste ich nur noch wissen, wie man an die Abmessungen der Bitmaps in den Displaylisten kommt.

Auf diese Weise werden die Displaylisten erzeugt:

GLvoid BuildFont(char\* fontname, int fontheight, GLuint &base) // Build Our Bitmap Font
{
 HFONT hfont; // Windows Font ID
 HFONT holdfont; // Used For Good House Keeping

 base = glGenLists(96); // Storage For 96 Characters

 hfont = CreateFont( -fontheight, // Height Of Font
 0, // Width Of Font
 0, // Angle Of Escapement
 0, // Orientation Angle
 FW\_NORMAL, // Font Weight
 FALSE, // Italic
 FALSE, // Underline
 FALSE, // Strikeout
 ANSI\_CHARSET, // Character Set Identifier
 OUT\_TT\_PRECIS, // Output Precision
 CLIP\_DEFAULT\_PRECIS, // Clipping Precision
 ANTIALIASED\_QUALITY, // Output Quality
 FF\_DONTCARE|DEFAULT\_PITCH, // Family And Pitch
 fontname); // Font Name

 holdfont = (HFONT)SelectObject(hDC, hfont); // Selects The Font We Want
 wglUseFontBitmaps(hDC, 32, 96, base); // Builds 96 Characters Starting At Character 32
 SelectObject(hDC, holdfont); // Selects The Font We Want
 DeleteObject(hfont); // Delete The Font
}

Ich brauche jetzt eine Funktion der ich die ensprechende, geladene Font (GLuint &base) und ein char übergebe und die mir danach sagt, wie groß das zugehörige Bitmap der zum char gehörenden Displayliste ist.

Hat jemand eine Ahnung?

mfg dixxi

Hallo Bernhard,

Ok ich hab hätte jetzt schon eine Lösung gefunden,

Ja, und wie geht die?

mfG
Martin B

Ok ich hab hätte jetzt schon eine Lösung gefunden,

Ja, und wie geht die?

Die Funktion die ich mir vorstelle sollte in etwa so aussehen:

int glPutsl(int x, int y, int width, GLuint &base, const char\* str)
{
 glRasterPos2i(x, y);

 int charsdrawn = 0;

 for(int i=0;i

x und y geben die Position an, an die der Text gezeichnet werden soll. width gibt an, wie lange der Text maximal lang sein darf. Das hat Bedeutung, da der Text später nicht über ein Quadrat ragen darf, auf das ich den Text zeichne. Base legt dan fest wo die Displaylisten für das Font zu finden sind. Die Ladefunktion hab ich bereits vorhin gepostet. str gibt dan noch den zu zeichnenden String an. Rückgabewert ist die Anzahl an erfolgreich gezeichneten chars. Damit kann dann herausfinden wie viel Zeichen des Strins wirklich gezeichnet worden sind. Was noch fehlt wird danach eine Stück drunter mit der selben Funktion gezeichnet. Soll später eine Multiline-Textbox werden.

Das einzige was ich noch brauche ist WidthOfChar(). Ich habe über base die entsprechende Font zur verfügung und ich weiß von welchem Zeichen ich die Länge will.

Kann mir jemand helfen?

mfg dixxi

Hallo Bernhard,

von OpenGL habe ich nich gar so viel Schimmer, da müsse ich mich erst rein hängen. Ich dachte, du haettest es mit GDI gelöst.

Das einzige was ich noch brauche ist WidthOfChar(). Ich habe
über base die entsprechende Font zur verfügung und ich weiß
von welchem Zeichen ich die Länge will.

Wenn du in „HDC dc“ schon den Font drin hast, geht auch:

SIZE getTextSize(const char \*te)
{
 SIZE teSize;
 GetTextExtentPoint32 (dc, te, strlen(te), &teSize);
 return teSize;
}

Die ist echt pixelgenau. Das geht sicher auch für einzelne Zeichen, natürlich immer abhängig von dem Font, der gerade im DC drin ist.

lG
Martin B

Hallo Martin!

Wenn du in „HDC dc“ schon den Font drin hast, geht auch:

SIZE getTextSize(const char *te)
{
SIZE teSize;
GetTextExtentPoint32 (dc, te, strlen(te), &teSize);
return teSize;
}

Ok, das ist schon mal ein guter Ansatz. Danke! Ich werde einmal probieren, dass in mein Projekt einzubauen.

Wenn trotzdem jemand eine andere Möglichkeit für die Länge eines Zeichens in Pixel findet, bitte posten da ich den Code vielleicht später portabel gestalten will.

Toll wäre, wenn jemand gleich eine GL Funktion kennt, wie die DrawText() aus der GDI.

mfg dixxi

Das einzige was ich noch brauche ist WidthOfChar(). Ich habe
über base die entsprechende Font zur verfügung und ich weiß
von welchem Zeichen ich die Länge will.

Kann mir jemand helfen?

mfg dixxi

Hallo,

ich kenne mich zwar nicht in OpenGL aus, aber ich würde mal behaupten, dass bei TT-Fonts die Länge eines Textes nicht unbedingt die Summe der Zeichenlängen ist. Das gilt nur bei Bitmap-Fonts.

Gruss Reinhard

ich kenne mich zwar nicht in OpenGL aus, aber ich würde mal
behaupten, dass bei TT-Fonts die Länge eines Textes nicht
unbedingt die Summe der Zeichenlängen ist. Das gilt nur bei
Bitmap-Fonts.

OpenGL erstellt aus der aktuellen Font des DC eine Displayliste für jeden Buchstaben in denen jeder Buchstabe als Bitmap gespeichert ist. Ich habe also Bitmap-Fonts.

mfg dixxi