Laden...

LinearGradientBrush in gezeichnetem Object anwenden

Erstellt von Martinar vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.328 Views
M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 12 Jahren
LinearGradientBrush in gezeichnetem Object anwenden

Hallo Community,

bevor ich mit meinem Problem beginnen möchte, möchte ich sagen, dass die
Tutorials von herbivore,progger und vielen Anderen zu dem dem Thema Paint/onPaint wirklich gut sind.

Ich habe mir den Quellcode von progger zum Üben genommen.

Nun kommt mein Problem:

Den LinearGradientBrush kann ich nicht direkt auf das Rectangle anwenden, sondern es wird auf meinem Panel angewendet.

Ich möchte aber diesen Farbverlauf in jedem gezeichnetem Object darstellen.

Wie kann ich das lösen, dass das LinearGradienBrush im Object wirkt und nicht im Panel.

4.921 Beiträge seit 2008
vor 12 Jahren

Hallo Martinar,

ich denke, du wirst dann jeweils jedes Rechteck in einem eigenen GraphicsPath-Objekt zeichnen müssen (und dann jeweils den LinearGradienBrush angeben).

Am besten, du legst dir dann eine List<GraphicsPath> dafür an.

C
1.214 Beiträge seit 2006
vor 12 Jahren

Was genau ist das Problem? Dass der Farbverlauf in jedem Rechteck anders ist? Dann musst du einfach die Koordinaten von dem LinearGradientBrush für jedes Rechteck richtig setzen.

4.921 Beiträge seit 2008
vor 12 Jahren

Hallo Coder007,

nein, das Problem ist, daß man beim graphics.DrawPath(pen, graphicsPath) nur einen Pen (bzw. Brush) angeben kann und sich dieser dann auf alle Objekte innerhalb des GraphicsPath bezieht, d.h. bei Martinar erstreckt sich der Verlauf über alle Objekte von oben nach unten.

C
1.214 Beiträge seit 2006
vor 12 Jahren

Ja, wenn alle Rechtecke in einem Path sind, dann ist klar...

M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 12 Jahren

Ja, dann werde ich die Rechtecke trennen müssen.
Ich werdes es mal versuchen...

Vielen Dank

M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 12 Jahren

Irgendwie bekomme ich die Trennung nicht hin.

public abstract class MyGraphicObject
    {

        private Pen _pen;
        private Brush _brush;
        private bool _bVisible = true;
        private GraphicsPath _path = new GraphicsPath();

        private Point _Location = new Point(100, 100);
        public Point Location
        {
            get { return _Location; }
            set { _Location = value; }
        }

        public MyGraphicObject(Brush brush)
        {
            _pen = new Pen(Color.DimGray, 1);
            _brush = brush;
        }
        protected GraphicsPath Path
        {
            get { return _path; }
        }
        public Pen Pen
        {
            get { return _pen; }
        }
        public Brush Brush
        {
            get { return _brush; }
        }
        public bool Visible
        {
            get { return _bVisible; }
            set { _bVisible = value; }
        }
        public virtual bool Contains(Point pt)
        {
            return _path.IsVisible(pt);
        }

        public virtual void Draw(Graphics g)
        {
            
            g.DrawPath(_pen, _path);
            g.FillPath(_brush, _path);
        }

Ich vermute mal, dass ich das GraphicsPath in eine List<> packen muss,
ist dieser Ansatz riichtig?

Also ich glaube nun das Problem gefunden zu haben:

HIer muss ich etwas ändern,denke ich:

private void MyPanel1_Paint(object sender, PaintEventArgs e)
        {
            base.OnPaint(e);
           
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;

            _canvas = e.ClipRectangle;
            Region clip = new Region(_canvas);
            clip.Intersect(e.Graphics.Clip);
            e.Graphics.Clip = clip;
            e.Graphics.Clear(Color.White);
            //e.Graphics.TranslateTransform(MyPanel1.AutoScrollPosition.X, MyPanel1.AutoScrollPosition.Y);
            // Der Bereich, der neugezeichnet werden soll, wird auf die Zeichenfläche
            // beschränkt, damit Objekte, die darüber hinausschauen abgeschnitten werden.
            foreach (MyGraphicObject go in _graphicObjects)
            {
                go.Draw(e.Graphics);
            }
            
        }

Aber was???, damit die Rechtecke für sich selbst den Farbverlauf zeichnen...