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.
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.
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.
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.
Ja, wenn alle Rechtecke in einem Path sind, dann ist klar...
Ja, dann werde ich die Rechtecke trennen müssen.
Ich werdes es mal versuchen...
Vielen Dank
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...