Fonts und Displaylists



  • Hallo Leute,

    mittlerweile habe ich es geschafft Outlinefonts einigermassen ,gesittet' darzustellen.
    Ich habe mir eine Klasse Font gezimmert:

    class Font
     {
     private:
      GLuint base;
      GLYPHMETRICSFLOAT gmf[256];
      HFONT hOldFont;      
     public:
      Font()
       {
        HFONT   font;
        base = glGenLists(256);
        font = CreateFont(...);
        hOldFont = (HFONT)SelectObject(hddc, font);
        wglUseFontOutlines(...);
        SelectObject(hddc, hOldFont);
       }
      ~Font() {  glDeleteLists(base, 256); }
      void DrawText()
       {
        glPushMatrix();
         glPushAttrib(GL_LIST_BIT);
          glListBase(base);                        
          glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); //text ist initialisiert
         glPopAttrib();                        
        glPopMatrix();
       }
     };
    

    Folgendes Problem taucht trotzdem noch auf.
    Rufe ich irgendwo in einer Funktion

    class Font *f=new Font(...);
    f->DrawText(...);
    delete f;
    

    auf, so wird die Schrift an der richtigen Stelle korrekt dargestellt.

    Initialisiere ich aber f vorher irgendwo, lösche es am Ende und rufe mittendrin f->DrawText auf, so passiert gar nichts !!

    so z.B in

    class a
    {
    Font *f;
    a(){ f=new Font();}
    void b(){ f->DrawText(...);}
    ~a(){delete f;}
    }
    

    Hier passiert nichts !

    Warum nicht, ist da etwa irgendwas mit den APIs SelectObject falsch, oder muss man irgendwo noch DeleteObject einbauen ??
    An der Projektions - Matrix kann es doch nicht liegen, die wird doch vorher noch gepushed !

    Danke.

    Edit by Headhunter : C++ Tags

    [ Dieser Beitrag wurde am 02.03.2003 um 16:39 Uhr von Headhunter editiert. ]



  • Hi !

    Kann es sein dass du die Funktion a::b () net aufrufst ?



  • Hälst Du eigentlich alle für so dämlich ??



  • Ja.
    Das ist für mich der einzig logische Grund warum deine Fontklasse so nicht funktioniert. Natürlich hätte man mehr Raum für Spekulationen wenn du was mehr Code posten würdest...



  • Vergiss es, ich bin selbst drauf gekommen.
    Wenn man eine Klasse initialisiert, die vor dem Einschalten von OpenGL eine Display-List anfordert, funktioniert es nicht und es kommt nur 0 als ListBase zurück.


Anmelden zum Antworten