Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 15:43

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Apr 29, 2006 14:54 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2. type
  3.   TPglFont=^TglFont;
  4.   TglFont=class(TComponent)
  5.   private
  6.     FFontDC: HDC;
  7.     FFont: HFONT;                                    // Windows Font ID
  8.     FWinFont: TFont;
  9.     FFontList: GLUint;
  10.     FFontSize: integer;
  11.     FFontThickness: integer;
  12.     FFontWidth: integer;
  13.     FFontItalic: integer;
  14.     FFontUnderline: integer;
  15.     FFontStrikeout: integer;
  16.     FFontWeight: integer;
  17.     FFontgmf : array [0..255] of GLYPHMETRICSFLOAT;  // Address Buffer For Font Storage
  18.     FEnabled: boolean;
  19.    .
  20.    .
  21.    .
  22.  
  23. constructor TglFont.Create(AOwner:TComponent);
  24. begin
  25.   inherited Create(AOwner);
  26.   FFontList := 0;
  27.   FFont := 0;
  28.   FWinFont := nil;
  29. end;
  30.  
  31. destructor TglFont.Destroy;
  32. begin
  33.   enabled := true;
  34.   KillFont;
  35.   inherited destroy;
  36. end;
  37.  
  38. procedure TglFont.BuildFont (FontName: string; glFontDC: HDC); // Build Our Bitmap Font
  39. var
  40.   OldFont: HFONT;
  41.   FName: PChar;
  42. begin
  43.   if not FEnabled then
  44.     exit;
  45.   if FFont <> 0 then
  46.     KillFont;
  47.  
  48.   FFontDC := glFontDC;
  49.   FName := PChar (FontName);
  50.   FFontList := glGenLists(256);              // Storage For 256 Characters
  51.   //glEnable(GL_POINT_SMOOTH);
  52.  
  53.   FFont := CreateFont(-FFontSize,            // Height Of Font
  54.                       FFontWidth,            // Width Of Font
  55.                       0,                     // Angle Of Escapement
  56.                       0,                     // Orientation Angle
  57.                       FFontWeight,           // Font Weight
  58.                       FFontItalic,           // Italic
  59.                       FFontUnderline,        // Underline
  60.                       FFontStrikeout,        // Strikeout
  61.                       ANSI_CHARSET,          // Character Set Identifier
  62.                       OUT_TT_PRECIS,         // Output Precision
  63.                       CLIP_DEFAULT_PRECIS,   // Clipping Precision
  64.                       NONANTIALIASED_QUALITY,// Output Quality
  65.                       FF_DONTCARE or DEFAULT_PITCH, // Family And Pitch
  66.                       FName);                // Font Name
  67.  
  68.   FWinFont := MakeFontFromHFont (FFont);
  69.  
  70.   OldFont := SelectObject(glFontDC, FFont); // Gets the current Font and
  71.                                             // Selects The Font We Want
  72.  
  73.   if not wglUseFontOutlines(glFontDC,       // Select the wanted DC
  74.                      0,                     // Starting Character
  75.                      255,                   // Number Of Display Lists To Build
  76.                      FFontList,             // Starting Display Lists
  77.                      0,                     // Deviation From The True Outlines
  78.                      FFontThickness/10,     // Font Thickness In The Z Direction
  79.                      WGL_FONT_POLYGONS,     // Use Polygons, Not Lines
  80.                      FFontgmf[0]) then      // Address Of Buffer To Recieve Data
  81.   begin
  82.     Application.MessageBox(pChar ('Konnte Font '+FontName+' nicht installieren!'),
  83.                            'Fehler',
  84.                            0);
  85.   end;
  86.  
  87.   //OldFont := SelectObject(glFontDC, OldFont); // Selects the formerly saved Font
  88. end;
  89.  
  90. procedure TglFont.KillFont;
  91. begin
  92.   if not enabled then
  93.     exit;
  94.  
  95.   if FFontList > 0 then
  96.     glDeleteLists(FFontList, 256);            // Lösche alle 256 Zeichen
  97.   FFontList := 0;
  98.   if FFont > 0 then
  99.     DeleteObject (FFont);
  100.   FFont := 0;
  101.   if assigned (FWinFont) then
  102.     FWinFont.Free;
  103. end;
  104.  


Hat jemand einen Tipp?

Danke,

Andy


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 29, 2006 15:37 
Offline
DGL Member

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: hab ich gemacht...
BeitragVerfasst: Sa Apr 29, 2006 16:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
sofort ausprobiert, ändert aber nichts.

Ich habe den Verdacht, dass ein einmal an einen Device Context gebundener Font nicht mehr von diesem gelöst werden kann. Kann da was dran sein?

Andy


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]