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 abere.Graphics
anstattCreateGraphics()
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 imPaint
-Ereignis (bzw. für eigene Controls inOnPaint(...)
) mittelse.Graphics.FillPath(brush, gp)
denGraphicsPath
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); }
-
Ich würde hierfür auch ein eigenes Steuerelement, abgeleitet von
Button
, erstellen.Und auch für ein (nicht-rechteckiges) Fenster kann man standardmäßig kein Antialias zusammen mit
Region
verwenden.
Es gibt jedoch in der WinAPI eine Funktion, um dies selber zu zeichnen: UpdateLayeredWindow, s.a. C++: SetWindowRgn with antialiasing sowie das dort verlinkte How to make transparent window using UpdateLayeredWindow ? (schau dir die Animation in der Antwort an!).Für C# mußt du dann diese Funktion per P/Invoke aufrufen: UpdateLayeredWindow (das dort erwähnte Beispiel ist dies: Transparent Window Sample - dort kannst du auch das C#-Demoprojekt "AlphaWindow.zip" herunterladen).
Anstatt einer statischen Image-Resource mußt du dann selbstverständlich per Code ein transparentes
Bitmap
erzeugen und dieses dann auf einer voll-transparentenForm
als Hintergrund anzeigen lassen.