Antialias bei Region



  • Hallo zusammen, mal wieder. Steuerelemente haben die Eigenschaft "Region". wenn ich folgenden Text ausführe, wird der Button nicht glatt gezeichnet. Ich habe gelesen, dass bei Region kein Antialias möglich ist, stimmt das ?

            Graphics gr = button1.CreateGraphics();
            gr.SmoothingMode = SmoothingMode.AntiAlias;
            GraphicsPath gp = new GraphicsPath();
            button1.BackColor = Color.Blue;
            Rectangle rec = button1.ClientRectangle;
            rec.Inflate(-5, -5);
            gp.AddEllipse(rec);
            button1.Region = new Region(gp);
    

    Übrigens, den Text im button1-Paint Händler ausführen ergibt eine Endlosschleife, beim Anclicken, weil button1 beim "Mausbewegen" immer Paint aufruft. Ich habe den Text im Load-Händler untergebracht. Auch keine Lösung ? Wo bringt man den unter ? Ganz vergessen zu sagen, ich arbeite mit VS 2010.



  • Der Beispielcode für Region wird aber auch innerhalb des Paint-Ereignisses ausgeführt (dort dann aber e.Graphics anstatt CreateGraphics() benutzen).

    Rufst du selber beim MouseMove ein Neuzeichnen auf? Standardmäßig sollte dies nicht passieren.

    Und wie du richtig gelesen hast, ist bei Region kein Antialias möglich, aber man kann auch direkt im Paint-Ereignis (bzw. für eigene Controls in OnPaint(...)) mittels e.Graphics.FillPath(brush, gp) den GraphicsPath mit Antialias zeichnen, s. die Antwort in How to make smooth arc region using graphics path.
    Und der zweite Code der Antwort verbindet beides zusammen.



  • Habe folgendes versucht, bin etwas durcheinander, da erscheint der rechteckige Bereich vom Button, innen drin der rote Kreis, und der Text ist logischerweise auch weg. Also ein Ersatz für Region ist das bis dahin noch nicht. Bleibt wohl nur die Möglichkeit, das Steuerelement, hier den Button, selbst zu erstellen. Was ist, wenn man dem Haupt-Fenster eine beondere Gestalt geben will ? Ich habe das gleich ausprobiert, bei Verwendung von Region, ist das Haupt-Fenster auch nicht glatt. Wie würde man das lösen ? Bin etwas nervig, zugegeben ...

    private void button1_Paint(object sender, PaintEventArgs e)
            {
                //Graphics gr = e.Graphics;
                //gr.SmoothingMode = SmoothingMode.AntiAlias;
                Graphics gr = e.Graphics;
                gr.SmoothingMode = SmoothingMode.AntiAlias;
                GraphicsPath gp = new GraphicsPath();
                //button1.BackColor = Color.Blue;
                Rectangle rec = button1.ClientRectangle;
                rec.Inflate(-5, -5);
                gp.AddEllipse(rec);
                //button1.Region = new Region(gp);
                gr.FillPath(new SolidBrush(Color.Red), gp);
            }
    

Anmelden zum Antworten