2009-10-22 2 views
6

Quindi, sono abbastanza poco pratico con lo sviluppo di Windows Form.Come cancellare la grafica su un controllo trasparente nei moduli di Windows

che sto cercando di creare un componente "hey io sono occupato a fare cose" che appena gira una forma intorno. Voglio che questo controllo sia transitorio e attingere a qualsiasi altro controllo. La classe eredita direttamente da Control.

Così ho questo nel costruttore:

SetStyle(ControlStyles.Opaque, true); 

e questo:

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams parms = base.CreateParams; 
     parms.ExStyle |= 0x20; 
     return parms; 
    } 
} 

Il che mi fa un controllo che si avvarrà in cima ad altri controlli.

Ora il mio problema è questo. Ripasso il controllo alcune volte al secondo per dare l'impressione di un'animazione fluida. Tuttavia, non riesco a capire come cancellare ciò che è stato disegnato nel frame precedente. L'utilizzo di e.Graphics.Clear(Color.Transparent) in OnPaint trasforma l'intero controllo in nero.

Esiste un modo per cancellare solo i contenuti disegnati di un controllo?

ho notato che il ridimensionamento del controllo sarà chiaro lo sfondo.

cose che non funzionano

  1. Overriding OnPaintBackground di non fare nulla. O semplicemente chiamando base.OnPaintBackground. Stessi risultati

risposta

4

Ok, ho trovato la soluzione qui: http://www.bobpowell.net/transcontrols.htm

controlli il genitore effettivamente deve essere invalidato per mantenere lo sfondo trasparente.

+1

Non è necessario per invalidare l'intero controllo padre, ma solo l'area corrispondente al controllo dell'utente: this.Parent.Invalidate (this.ClientRectangle, true); –

+0

@Eric: Grazie per il suggerimento. Penso che possa aver fatto proprio questo! – snicker

+1

Questo non funzionerà correttamente a meno che usercontrol non sia in posizione (0,0). Devi invalidare l'area genitore coperta da usercontrol e utilizzare le coordinate genitore. Inoltre, se l'UserControl aveva una zona non-client trasparente, questa zona non sarebbe ottenere invalidato neanche. Mi piacerebbe andare per 'this.Parent.Invalidate (new Rectangle (this.Location, this.Size), true);' – takrl

2

Potrebbe essere necessario eseguire l'override OnPaintBackground quali l'articolo presenta: http://saftsack.fs.uni-bayreuth.de/~dun3/archives/creating-a-transparent-panel-in-net/108.html

Potrebbe anche essere necessario per invalidare il controllo quando ha bisogno di essere cancellata per forzare OnPaintBackground di essere chiamato.

+0

Ciò non risolve il problema. E stavo invalidando il controllo prima. Grazie comunque. – snicker

+0

Ma ho trovato il link per la soluzione reale nei commenti di quella pagina, quindi +1 e grazie. – snicker

+0

Non ogni controllo può ignorare onpaintbackground, come tooltip – Mike