Bereichsbeschränkung für GC



  • Hallo C++-Freunde,

    ich möchte innerhalb eines Fensters
    in einen bestimmten Bereich mit xlib zeichnen.

    Alles andere soll ignoriert werden.
    Wie krieg ich das hin?

    Display display = XOpenDisplay(NULL);
    int screen_num = DefaultScreen(display);
    d = XCreateSimpleWindow(display, parentW, 0, 0, width, height, 0,XBlackPixel(display, screen_num),XWhitePixel(display, screen_num));
    XGCValues xgc;
    gc = XCreateGC(display, d, 0, &xgc);
    

    danach kann ich dann zeichnen z. B.:
    XDrawRectangle(display, d, gc, 10, 10, 500, 500);

    Ich hab es dann versucht indem ich

    Pixmap pixmap = XCreatePixmap(display, d, 200, 200, 1); //Wofür ist hier die depth???
    xgc.clip_x_origin = 200;
    xgc.clip_y_origin = 200;
    xgc.clip_mask = pixmap;
    

    vor dem erstellen des gc mit GCClipXOrigin | GCClipYOrigin | GCClipMask
    als 3. Parameter versucht.

    Aber es klappt nicht...

    Versteht ihr was ich meine? Ich möchte letztendlich, dass eine Komponente nur innerhalb
    ihres Bereiches zeichnen darf...

    Gruß,
    CSpille



  • Das würd mich aber auch mal interessieren...



  • Ich verstehe nicht genau was du machen willst.

    Aber jede xlib-Funktion, mit der man was auf ein Drawabel(Fenster/Pixmap) zeichnen kann, hat Parameter für die Anfangs-koordinaten und für die Ende-koordinaten.

    und wegen der dem depth Parameter in XCreatePixmap ist dafür da um die farbtiefe des zu erstellenden Pixmap anzugeben.

    Um jetzt das Pixmap auf ein Fenster zu zeichnen muss das Pixmap mit der selben Farbtiefe wie das XWindow system haben(z.b. 16Bit).
    Ansonsten bricht das ganze mit einem XLib Fehler im laufenden Programm ab.

    Ein 1Bit Pixmap wird bei der XLib verwendet um sogenannte Masks zu erstellen.
    Masks sind Pixmaps, die nur 0 oder 1 an der stelle (x,y) haben kann.
    Bei der Verwendung dieser Mask-Pixmaps werden dann z.b. Linien, Text nur an den stellen sichtbar(gezeichnet) an dem sich in der Mask eine 1 befindet.

    hmm langsam wird mir vieleicht klar wiso du das ganze haben willst. Du möchstest in einem bereich des Fenster nur was zeichnen lassen, auch wenn die Zeichenfunktion ausserhalb dieses bereichs beginnen möchte.

    Da kann dir, wie du schon versuchst hast, ein Mask-Pixmap(1bit Pixmap) helfen.

    Das könntest du in etwa so machen(ist nur eine grobe Beschreibung):

    1.erstelle ein 1Bit Mask-Pixmap mit der gewünschten Größe und füllst dieses Pixmap mit einsen(z.b. durch ein gefülltes Rechteck)

    2.Setzt dann diese Rechteck als Clipmask in dem eigenlichen GC vom Fenster, in dem gezeichnet werden soll, per XSetClipMask. Desweitern setzt du per XSetClipOrigin im selben GC die Start-koordinaten für diese ClipMask.

    3.Danach sollte, unter Verwendung diese GCs nur in dem Bereich das Resultat einer Zeichenfunktion sichtbar sein.

    Wenn das nicht funktionieren sollte, erstelle du das Mask-Pixmap nicht mit der Größe des gewünschten Bereiches sondern in der Größe des Fensters.
    Nu füllst du diese Fenster komplett mit nullen und danache nur den gewünschten bereich, in dem das Resultat einer Zeichenfunktion sichtbar sein soll, mit einsen(Das ganze im Mask-Pixmap).
    Der rest ist wie in den Punkt 2 und 3, nu das du die ClipOrigin auf 0,0(x,y) setzt.(es könnte auch reichen, wenn du nur die stellen mit nullen füllst, die auserhalb des bereiches liegt)

    Gruß

    firefly

    Edit: Das wichtigste am ganze ist, das bei einem Mask-Pixmap(Farbtife 1Bit) die nullen angeben wo nichts gezeichnet werden soll und die einsen das es gezeichnet werden soll. Und man muß das erstellte Pixmap erst noch entprechent "füllen"

    z.b. folgendes 1Bit Pixmap sieht so aus:

    0110
    1001
    1001
    0110

    Unter Verwendung diese Mask-Pixmaps würden dann, wenn man z.b. ein Gefülltes Rechteck zeichnen würde(mit den selben Maßen wie das Pixmap), im Fenster nur eine Null(0) sichtbar sein.


Anmelden zum Antworten