Domanda

ho scritto il seguente comando (molto semplice) per l'uso in un'applicazione (commenti rimossi per brevità):

public partial class HorizontalRule : Control
{
    public HorizontalRule()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        var g = e.Graphics;

        var rect = new Rectangle(
            this.ClientRectangle.Left,
            this.ClientRectangle.Height / 2 + 1, 
            this.ClientRectangle.Width,
            1);

        ControlPaint.DrawBorder3D(g, rect, Border3DStyle.Etched);

        return;
    }
}

. Disclaimer: Sono un novizio a dipingere i miei controlli

ho scelto di disegnare la linea in questo modo in base alla raccomandazione in Vista orientamenti UX che suggerisce un rettangolo inciso di altezza 1 per i separatori.

Quando statica, questo sembra bene, ma ho notato che ho ridisegnare gli artefatti se ho posto questo controllo in una finestra e ridimensionarlo (via ancora, per esempio). Sto ridisegnando il mio confine oltre la larghezza del rettangolo tutta la mia cliente, ma è come se non sia effettivamente dipinta. Abilitazione DoubleBuffered nel costruttore di HorizontalRule, o nella forma che è incorporato in, non sembra fare la differenza sia.

Che cosa sto facendo di sbagliato?

Aggiornamento:

Per il suggerimento, ho provato a chiamare base.OnPaint ultimo posto di prima. Non so che cosa sarebbe cambiato, e non sembra avere cambiato nulla.

Non disegnare lo sfondo compiuto nulla di utile. Ho ancora ottenere l'artifacting, ma poi anche io non capisco il colore di sfondo così invece ho visto l'immagine di ciò che era sotto la linea orizzontale.

È stato utile?

Soluzione 2

posso incidere una soluzione che non comporta artifacting sovrascrivendo OnResize () per invalidare l'intero controllo:

protected override void OnResize(EventArgs e)
{
    base.OnResize(e);

    this.Invalidate();
}

Non sono sicuro che questa sia la soluzione "giusta", tuttavia.

Altri suggerimenti

Non chiamata base.OnPaint, oppure chiama l'ultima (Non posso ricordare ora).

Inoltre, provare l'override del metodo sfondo di vernice, in modo da non chiamare la base.

Vorrei richiamare questo su una bitmap quindi disegnare la bitmap invece di preoccuparsi di dipingere ogni volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top