Announcement

Collapse
No announcement yet.

Transparenz Eigenschaft

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Transparenz Eigenschaft

    Hallo,

    ich habe folgendes Problem:

    Ich versuch mit Canvas über eine GroupBox zu zeichnen. Das klappt dummerweise nicht, weil dass dumme Ding immer unter der GroupBox zeichnet. Da ich keine Eigenschaft gefunden habe, mit der ich ÜBER einzelenen Elementen auf der Form zeichnen kann, wollte ich diese Elemente kurzerhand transparent machen. Dazu bin ich wie folgt vorgegangen:

    Code:
    TransparentColorValue=clPurple;
    TransparentColor=true;
    ManualScalingGroup->Color=TransparentColorValue;
    Ergebnis ist, das ManualScalingGroup zwar transparent ist, aber auch die Form darunter! Und das allerdümmste ist, dass das zeichnen unter der GroupBox immer noch nicht geht.

    Auf welche Eigenschaften muss ich denn Einfluss nehmen, wenn ich über einem Steuerelement mit Canvas zeichnen will?

    Schonmal danke im voraus!

    Gruß, Bodo

  • #2
    Auf das Canvas des Steuerelementes
    Christian

    Comment


    • #3
      Danke, dass klingt logisch.
      Allerdings hab ich keine Ahnung wie ich da ran komme...
      Ich versuche folgendes:
      Code:
      ManualScalingGroup->Canvas->LineTo(x,y);
      Klappt aber nicht, scheint wohl private zu sein... Fehlermeldung ist:
      Zugriff auf TCustomControl::Canvas verweigert.

      Comment


      • #4
        Bein einer GroupBox ist der Canvas protected.....

        Sehe jetzt keine Lösung, außer du legst ein transparentes drittes Objekt über alles und zeichnest darauf. Dann gibt es aber Ärger mit den Mouseevents...
        Christian

        Comment


        • #5
          Falls du nicht gerade den Rand des Groupbox überzeichnen willst: Leg eine PaintBox in die Groupbox und zeichne in dessen OnPaint-Routine.

          Comment


          • #6
            Sowas hab ich mir gedacht. Schade.

            Trotzdem Danke!

            Comment


            • #7
              Hallo zusammen,

              doch es geht, man kann auch über einer GroupBox zeichen.

              //ein neue Instanz von TCanvas
              TCanvas *zeichenflaeche = new TCanvas();

              //den Handle für FormularCanvas auf den Handle des gesamten Formulars
              zeichenflaeche->Handle = GetWindowDC(Handle);


              zeichenflache->//Anweisungen zum Zeichen.....

              Die Anweisung setzt ein Handle auf das Gesamte Formular. Somit zeichnest du über alle Objekten.


              Gruß Lukas

              Comment


              • #8
                Hallo Lukas!

                Danke, werd ich sofort mal probieren und mich dann melden!

                Gruß, Bodo

                Comment


                • #9
                  Hallo Lukas!

                  Genial, das hat geklappt! Ich danke dir!
                  Da muss man erstmal drauf kommen.

                  Gruß, Bodo

                  Comment


                  • #10
                    Hallo, dadurch hat sich leider dann doch noch eine kleine Ungereimtheit ergeben:

                    zeichne ich mit "Canvas->..." werden die ClientKoordinaten (obere linke Ecke EXCLUSIVE der Title Bar) benutzt. Zeichne ich mit "zeichenflaeche->..." bezieht er den Nullpunkt von der oberen linke Ecke der Form. Dummerweise kann ja jetzt die Title Bar verschieden groß sein (z.B. XP/WIN98). Wie kann ich also entweder
                    a) die Height der Title Bar rauskriegen oder
                    b) das Koordinatensystem entsprechend transformieren?

                    Gruß, Bodo

                    Comment


                    • #11
                      Hallo,

                      ich nochmal. Konnte mir mittlerweile (wenn acuh etwas unelegant) behelfen:
                      Code:
                      TPoint *temppnt2 = new TPoint;
                      
                      temppnt->x=0;
                      temppnt->y=0;
                      //den Handle für FormularCanvas auf den Handle des gesamten Formulars
                      zeichenflaeche->Handle = GetWindowDC(Handle);
                      zeichenflaeche->PenPos=*temppnt;
                      *temppnt2=Form1->ClientToScreen(zeichenflaeche->PenPos);
                      yoff=temppnt2->y-Form1->Top;
                      xoff=temppnt2->x-Form1->Left;
                      yoff und xoff sind dann die offsets der beiden koordinatensysteme.

                      Comment


                      • #12
                        Hallo Bodo,

                        ok gerne :-)

                        ja, das ist richtig die ist der Nullpunkt oben in der Titelleiste. Da man ja über den Formular zeichnet. Stimmt die Titelleiste kann natürlich unterschiedlich dick sein.
                        Aber klappte es nun wie du es wolltest ??

                        Gruß Lukas

                        Comment


                        • #13
                          Hallo Lukas,

                          ja, wenn ich den Offset mit derClientToScreen-Methode ermittele, klappt es tadellos. Ist zwar ein bisschen Arbeit, weil man insgesamt doch mehr Fälle abfangen muss (z.B. zeichnet er ja auch über die ScrollBars, wenn das Fenster kleiner ist) aber insgesamt hab ich jetzt endlich was ich wollte. Vielen Dank nochmal!

                          Gruß von Eltville nach Wiesbaden

                          Bodo

                          Comment

                          Working...
                          X