Geräteabhängiger Device Context für Fonts



  • Hi!

    Ich muß folgendes machen:

    Einen Font (z.B. Arial 12) auf verschiedenen Druckern ausgeben. Der eine Drucker kann ein 300DPI Drucker sein, ein weiterer 200DPI.

    Druckertreiber stehen nicht zur verfügung. Ich muß selbst dafür sorgen das der Font auf die richtige Größe gebracht wird.

    Ich weiß aber nicht wie man das machen soll.

    Einen Device Contect erstellen - Text reinschreiben und als Grafik an den Drucker schicken ist kein Problem. Aber "die richtige" Größe macht mir Probleme.

    Wie um himmelswillen scaliert man das richtig bzw. bringt Windows bei das man ganz andere Auflösungen hat als auf dem Bildschirm ?



  • Ähm

    Druckertreiber stehen nicht zur verfügung.

    😕

    Ich sag nur:
    0 Druckertreiber -> 0 Device Context -> 0 drucken



  • Das Problem selbst noch mal:

    Der Druckertreiber ist ein Generic Text Only im RAW Modus. (Unter W98 Standard Drucker was weiß ich wie die überall heissen 🤡

    Der Drucker wird direckt in der eigenen Scriptsprache angesprochen. Die Drucker selbst haben aber eine unterschiedliche Auflösung. (Thermotransferdrucker).
    Ich muß nun aber TTF Fonts auf den Dingern ausgeben. Da die Drucker das selbst nicht können ist es notwendig eine Bitmpa zu erzeugen die den Text am ende als Grafik hält. Problem hierbei: Wie bekomm ich nun den Arial12 auch als Arial12 raus ?

    Soweit bin ich bis jetzt:

    Einen DC öffnen -> Font auswählen -> reinschreiben -> als GFX wandeln -> An Drucker schicken. Problem: Der DC is alles andere als der Drucker. (CreateComatibelDC).

    Ich suche nun nach der Möglichkeit einen DC zu ändern/erstellen damit
    CFont::CreatePointFont(); den Font richtig umrechnet.

    Ich versuche mit CreateDC und der DEVMODE Sturktur die Auflösung zu setzen aber es klappt nicht. (Ich find die Infos nicht 😞 - bin wohl einfach nur blind)
    Denn nach der DevMode struktur könnt ich mit YResolution und PrintQuality die Auflösung setzen. Nur fehlen dem DC noch informationen - das was raus kommt müll.

    Im moment kommt Arial 12 total winzig raus ;o)

    hDC dc;
        HBitmap bitmap;
        HPEN penWhite;
        HFont font;
    
        // Zum Bildschirm Kompatieblen Bereich erzeugen 
        dc = CreateCompatibleDC(NULL);
    
        // Ein Dazu kompatiebles Bitmap erzeugen    
        bitmap = CreateCompatibleBitmap(dc,xru-xlo,yru-xlo);
        // Einen weissen Stift erzeugen
        penWhite = CreatePen(PS_SOLID,3,RGB(0xFF,0xFF,0xFF));
    
        // und in den DC eintragen
        SelectObject(dc,bitmap);
        SelectObject (dc,penWhite);
    
        // Rechteck Zeichnen (hintergrund weiß färben)
        Rectangle(dc,0,0,xru-xlo,yru-xlo);
        // Textfarbe auf schwarz setzen
        SetTextColor(dc,0x000000);  
    
         // Font erstellen (geht in reiner WinAPI nu ganz anderst...
        //ret = font.CreatePointFont(fontPixelSize*10,faceName.c_str(),&dc);
        // Font aussuchen
        //dc.SelectObject(font);  
        DrawText(dc,text.c_str(),-1,CRect(0,0,xru-xlo,yru-xlo),DT_WORDBREAK);
            //[...] Weiterverarbeitung der Grafik
    

    [ Dieser Beitrag wurde am 15.10.2002 um 08:54 Uhr von Knuddlbaer editiert. ]



  • @Moderatoren

    Könnte man das mal nach WinAPI verschieben ? Erscheint mir dort vielversprechender.

    Danke



  • In WinAPI gibts aber kein CDC und CBitmap usw ...



  • Nun könnt man es aber da rein schieben ? pls!



  • Schlag doch mal im Petzold nach, der löst glaub ich genau dieses Problem in einem Kapitel seine Buchs: Windowsprorammierung. Viel Erfolg noch



  • Augenrollend hab ich da auch noch mal reingeschaut.

    Es hat auch was gebracht 🤡

    Bin auf die Formel pixelgröße/72 gestossen. Nach ein wenig suchen in der SDK fand ich dann

    MulDiv(fontPixelSize, GetDeviceCaps(dc, LOGPIXELSY), 72)

    Für mein Beispiel für Arial12 und 300DPI drucker:

    LOGFONT lf;
        memset(&lf, 0, sizeof(LOGFONT));       // zero out structure
        lf.lfHeight = - MulDiv(12,300,72);    // request a 12-pixel-height font
        strcpy(lf.lfFaceName, "Arial");      // request a face name "Arial"
        font.CreateFontIndirect(&lf);
    

    thx


Anmelden zum Antworten