2009-06-24 15 views
1

den Code Dump Entschuldigung, dies sind Funktionen innerhalb eines Usercontrol.NET Usercontrol: Size-Eigenschaft gibt falschen Wert auf Resize-Ereignis

private void PNGQuantPreviewControl_Resize(object sender, EventArgs e) 
{ 
    createOffScreenBm(); 
    draw();   
} 
private void createOffScreenBm() 
{ 
    offScreenBm = new Bitmap(this.Size.Width, this.Size.Height); 
    offScreenGfx = Graphics.FromImage(offScreenBm); 
} 
private void draw() 
{ 
    // draw background 
    offScreenGfx.FillRectangle(transTexture, 0, 0, offScreenBm.Width, offScreenBm.Height); 
    // draw image preview 
    offScreenGfx.DrawImage(pngQuantPreview, getTopLeftPosition()); 
    // apply to picture box 
    this.CreateGraphics().DrawImage(offScreenBm, 0, 0); 
} 

Also, wenn die Steueränderungen Größe, den Off-Screen-Bitmap erstellt die neue widerzuspiegeln Größe und zeichnet das Bild neu.

Wenn ich jedoch schnell die Größe des Steuerelements ändert, füllt die Bitmap es nicht, es gibt eine Lücke links und rechts.

Ich bin ziemlich neu in C#, also gibt es wahrscheinlich etwas offensichtlich, dass ich falsch mache, oder ich lese die Größenwerte zur falschen Zeit. Irgendwelche Ideen?

Antwort

2

Zuerst müssen Sie die OnPaint-Methode überschreiben, oder Paint-Ereignis abonnieren und alles dort zeichnen.

Zweitens müssen Sie keine Offscreen-Bitmap für Double-Buffering erstellen, da in .net bereits Klasse für solche Zwecke BufferedGraphics existieren.

Und drittens ist es viel besser Usercontrol descedant und ermöglichen interne .net doppelte Pufferung, um so etwas zu schaffen:

public UserControl2 
{ 
    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); 
} 

Mit diesem Ansatz werden Sie Double-Buffering bekommen, und alles, was Sie brauchen, ist zu Zeichnen Sie Ihre Grafiken in OnPaint-Methode. Sie können mehr über diese control styles in Msdn lesen.

+0

Vielen Dank. Ich habe die DoubleBuffer-Eigenschaft anstelle von SetStyle verwendet. Außerdem war mir zunächst nicht klar, dass ich das Grafikobjekt der OnPaint-Methode verwenden sollte. –

0

Haben Sie etwas wie einen Splitter auf Ihrem Steuerelement, oder eine MinSize oder MaxSize deklariert?

1

Haben Sie überlegt, die OnPaint-Methode zu überschreiben und den Code innerhalb dieser Methode zu platzieren? Dies würde dazu führen, dass Ihr Zeichnungscode jederzeit ausgeführt wird, unabhängig davon, aus welchem ​​Grund das Steuerelement neu gezeichnet werden muss.

Ein Resize-Ereignis wartet nicht unbedingt, bis die Größenänderung des übergeordneten Containers abgeschlossen ist. Wenn das resize-Ereignis ausgelöst wird, muss es warten, bis der Code beendet wird, bevor es ein neues resize -Ereignis erfassen kann. Wenn das Fenster/Steuerelement schnell skaliert wird, kann es nicht mehr so ​​gut mithalten und es ist das letzte Mal war in der Lage, das Ereignis zu erfassen, nicht unbedingt den Endzustand der Kontrolle ... wenn das irgendeinen Sinn ergibt.

Verwandte Themen