Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
Ich habe, basierend auf dem hier verfügbaren Tutorial, eine Font-Komponente geschrieben. Es klappt auch ganz prima und ich bin damit zufrieden.
Da ich weiss, dass man Fonteigenschaften von OutlineFonts nicht nachträglich ändern kann, habe ich mir überlegt, wie man es doch noch hinkriegen kann. Meine Komponente hat eine Create, eine BuildFont, eine Killfont und eine Destroy Methode (und noch ein paar, aber die sind hier nicht wichtig).
Ich lege also eine Fontkomponente an (Create) und erzeuge den Font (BuildFont) mit den von mir gewünschten Eigenschaften. Wenn ich jetzt eine Fonteigenschaft ändern will (z.B. die Fontgröße), dann zerstöre ich den Font (Killfont) und gebe die Komponente frei (Free->Destroy). Dann lege ich eine neue Komponente mit den neuen Eigenschaften an, erzeuge den Font, ... usw.
Das dumme ist nur, dass es nicht klappt. Ich werde langsam wahnsinnig. Ist der Font, den man dem Device Context zuweist in Stein gemeißelt? Kriegt man denn immer nur zum Programmstart gesetzt? Ich kann die Größe, den Font selber, jede beliebige Eigenschaft ändern und es scheint auch alles zu funktionieren. Die Zuweisung zum Device Context bleibt aber ohne Auswirkung auf den angezeigten Font.
Code:
type
TPglFont=^TglFont;
TglFont=class(TComponent)
private
FFontDC: HDC;
FFont: HFONT;// Windows Font ID
FWinFont: TFont;
FFontList: GLUint;
FFontSize:integer;
FFontThickness:integer;
FFontWidth:integer;
FFontItalic:integer;
FFontUnderline:integer;
FFontStrikeout:integer;
FFontWeight:integer;
FFontgmf :array[0..255]of GLYPHMETRICSFLOAT;// Address Buffer For Font Storage
FEnabled:boolean;
.
.
.
constructor TglFont.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
FFontList :=0;
FFont :=0;
FWinFont :=nil;
end;
destructor TglFont.Destroy;
begin
enabled :=true;
KillFont;
inherited destroy;
end;
procedure TglFont.BuildFont(FontName:string; glFontDC: HDC);// Build Our Bitmap Font
var
OldFont: HFONT;
FName:PChar;
begin
ifnot FEnabled then
exit;
if FFont <> 0then
KillFont;
FFontDC := glFontDC;
FName :=PChar(FontName);
FFontList := glGenLists(256);// Storage For 256 Characters
//glEnable(GL_POINT_SMOOTH);
FFont := CreateFont(-FFontSize,// Height Of Font
FFontWidth,// Width Of Font
0,// Angle Of Escapement
0,// Orientation Angle
FFontWeight,// Font Weight
FFontItalic,// Italic
FFontUnderline,// Underline
FFontStrikeout,// Strikeout
ANSI_CHARSET,// Character Set Identifier
OUT_TT_PRECIS,// Output Precision
CLIP_DEFAULT_PRECIS,// Clipping Precision
NONANTIALIASED_QUALITY,// Output Quality
FF_DONTCARE or DEFAULT_PITCH,// Family And Pitch
FName);// Font Name
FWinFont := MakeFontFromHFont (FFont);
OldFont := SelectObject(glFontDC, FFont);// Gets the current Font and
// Selects The Font We Want
ifnot wglUseFontOutlines(glFontDC,// Select the wanted DC
0,// Starting Character
255,// Number Of Display Lists To Build
FFontList,// Starting Display Lists
0,// Deviation From The True Outlines
FFontThickness/10,// Font Thickness In The Z Direction
WGL_FONT_POLYGONS,// Use Polygons, Not Lines
FFontgmf[0])then// Address Of Buffer To Recieve Data
begin
Application.MessageBox(pChar('Konnte Font '+FontName+' nicht installieren!'),
'Fehler',
0);
end;
//OldFont := SelectObject(glFontDC, OldFont); // Selects the formerly saved Font
end;
procedure TglFont.KillFont;
begin
ifnot enabled then
exit;
if FFontList > 0then
glDeleteLists(FFontList,256);// Lösche alle 256 Zeichen
Registriert: Mi Dez 15, 2004 20:36 Beiträge: 454 Wohnort: Wien, Österreich
Zitat:
Wenn ich jetzt eine Fonteigenschaft ändern will (z.B. die Fontgröße), dann zerstöre ich den Font (Killfont) und gebe die Komponente frei (Free->Destroy).
Du solltes nicht das Objekt selbst zerstören, sonder nur ->killFont->Build font aufrufen.
_________________ "Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.