2008-09-24 4 views

Répondre

12

Je pense this.SuspendLayout() & ResumeLayout() devrait le faire

3

tiers les plus complexes Windows Forms composants ont BeginUpdate et EndUpdate méthodes similaires, pour effectuer une série de mises à jour et puis dessiner la contrôle. Au niveau du formulaire, il n'y a pas une telle chose, mais vous pourriez être intéressé en activant Double buffering.

0

Vous pouvez utiliser les méthodes SuspendLayout et ResumeLayout dans le formulaire ou les contrôles lors de la mise à jour des propriétés. Si vous liez des données à des contrôles, vous pouvez utiliser les méthodes BeginUpdate et EndUpdate.

+0

méthodes BeginUpdate et EndUpdate sur lequel? Un formulaire ne les a pas. –

0

SuspendLayout contribuera à la performance si les mises à jour impliquent des modifications de commandes et mise en page: MSDN

4

Vous pouvez utiliser l'ancienne Win32LockWindowUpdate fonction:

[DllImport("user32.dll")] 
private static extern long LockWindowUpdate(long Handle); 

try { 
    // Lock Window... 
    LockWindowUpdate(frm.Handle); 
    // Perform your painting/updates... 
} 
finally { 
    // Release the lock... 
    LockWindowUpdate(0); 
} 
+0

Hmmmm. Intéressant. –

+4

Essayez plutôt cette syntaxe: private static extern long LockWindowUpdate (IntPtr Handle); et LockWindowUpdate (IntPtr.Zero); –

+3

LockWindowUpdate n'est pas conçu pour arrêter le scintillement. Vous devriez utiliser 'SetWindowRedraw (hwnd, false)'. (http://blogs.msdn.com/b/oldnewthing/archive/2004/06/10/152612.aspx) –

12

Je ne trouve pas SuspendLayout() et ResumeLayout() fait ce que vous demandez. LockWindowsUpdate() mis au point par moobaa fait l'affaire. Toutefois, LockWindowUpdate ne fonctionne que pour une fenêtre à la fois.

Vous pouvez aussi essayer ceci:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Win32; 
using System.Runtime.InteropServices; 

namespace WindowsTest 
{ 
    public partial class Form1 : Form 
    { 
    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam); 
    private const int WM_SETREDRAW = 11; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     SendMessage(this.Handle, WM_SETREDRAW, false, 0); 

     // Do your thingies here 

     SendMessage(this.Handle, WM_SETREDRAW, true, 0); 

     this.Refresh(); 
    } 
    } 
}