2017-03-15 2 views
0

hinzufügen Ich mache eine Anwendung, die Texte nach Stil auf dem Bildschirm mit X Windows System und Xft genannten Rendern rendert. Mein Code funktioniert gut, wie unten gezeigt.Wie kann ich Zeilenumbrüche beim Rendern von Text mit X11,

#include <X11/Xlib.h> 
#include <X11/Xft/Xft.h> 
char * nowShowing() 
{ 
return strdup("This is a sample text This is rendered with new Driver installed This is a sample text his is rendered with new Driver installed"); 
} 
int main() 
{ 
XftFont *font; 
XftDraw *draw; 
XRenderColor render_color; 
XftColor xft_color; 
char *str; 
str = nowShowing(); 
int x = 70; 
int y = 150; 
Display *dis = XOpenDisplay (0); 
int screen = DefaultScreen (dis); 
Window w = XCreateSimpleWindow (dis, RootWindow (dis, screen), 
           0, 0, 1200, 300, 1, 
           BlackPixel (dis, screen), 
           WhitePixel (dis, screen)); 
XEvent ev; 

render_color.red = 0; 
render_color.green =0; 
render_color.blue = 0; 
render_color.alpha = 0xffff; 

XftColorAllocValue (dis, 
        DefaultVisual(dis, screen), 
        DefaultColormap(dis, screen), 
        &render_color, 
        &xft_color); 

//font = XftFontOpen(dis, screen, 
    //     XFT_FAMILY, XftTypeString, "charter", 
    //     XFT_SIZE, XftTypeDouble, 20.0, 
    //     NULL); 
font = XftFontOpenName(dis,screen,"URW Palladio L:style=Bold Italic"); //it takes a Fontconfig pattern string 

draw = XftDrawCreate(dis, w, 
        DefaultVisual(dis, screen), 
        DefaultColormap(dis, screen)); 

XSelectInput (dis, w, ExposureMask); 
XMapWindow (dis, w); 
for (;;) 
{ 
    XNextEvent (dis, &ev); 
    if (ev.type == Expose) 
     XftDrawString8(draw, &xft_color, font, x, y, (XftChar8 *) str, 
         strlen(str)); 
} 
return 0; 
} 

Aber ich frage mich, wie kann ich Zeilenumbrüche in den eingegebenen Text hinzufügen. Ich habe versucht mit "/ n" und versuchte auch Array und Loops zu machen, aber es hat nicht funktioniert.

+0

Idk X11 eingehend, aber normalerweise funktionieren solche Grafiksysteme nicht wie eine Konsole oder ein Textfeld von GUI Toolkits. Ich bin mir ziemlich sicher, dass Sie jede Zeile einzeln an den von Ihnen gewünschten Koordinaten rendern müssen. Wie sonst würde X11 wissen, an welcher X-Koordinate (ausgehend von horizontalem Text) der Textbereich beginnt? – Olaf

+0

@Olaf Wir können das mit Xft definieren, wo es Text in einem neuen Fenster zeichnen soll. mit "XftDrawString8" Funktion oder so –

+0

Sie haben den Punkt nicht verstanden. Sie geben den ** Startpunkt ** an, an den Sie zeichnen möchten. Aber das ist nicht unbedingt der Ausgangspunkt der Linie. Was passiert auf der Konsole für 'printf (" Hallo "); printf ("World \ nnice thing!"); '? – Olaf

Antwort

0

Neue Zeile "\ n" wird nicht von Xft gerendert. Sie müssen jede Zeile separat mit dem richtigen Offset rendern, abhängig von der Schriftgröße und dem gewünschten Abstand. Ich habe den Endblock Ihres Codes mit Beispieltext geändert, der zweimal in separaten Zeilen gerendert wurde.

if (ev.type == Expose) 
    { 
    int fonth = font->ascent + font->descent; 

    XftDrawString8(draw, &xft_color, font, x, y, (XftChar8 *) str, 
        strlen(str)); 
    XftDrawString8(draw, &xft_color, font, x, y+fonth, (XftChar8 *) str, 
        strlen(str)); 
    } 
+0

waow das hat funktioniert !! ok gut, ich verstehe, dass dies ein einfacher Text ist, und wir können das in verschiedenen Zeilen auf diese Weise wiederholen, indem wir den Offset ändern und so, aber was ist, wenn es einen großen Absatz gibt? wie soll ich Xft sagen, um die Linien zu ändern, wenn die Fensterbreite erreicht wird. So wie dieses Kommentarfeld funktioniert? –

+0

Xft ist sehr niedriges Niveau und Sie müssen alles selbst machen. Es handelt sich nicht um eine Textformatierungsbibliothek, sondern um eine Textdarstellungsbibliothek. Sie benötigen XGlyphInfo glyphinfo; und dann XftTextExtentsUtf8 aufrufen (xinfo.dpy, fXFT, (XftChar8 *) str, strlen (str), & glyphinfo); Untersuchen Sie glyphinfo.width und vergleichen Sie sie mit der Fensterbreite. Teilen Sie dann Ihre Zeichenfolge bei Bedarf in mehrere Zeilen auf. – user1336365

Verwandte Themen