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
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