2010-08-28 4 views
1

En fait, je l'ai mis en place une classe pour gérer l'envoi de messages WM_SETREDRAW comme ceci:C# - dessin de verrouillage

public static class DrawingLocker 
{ 
    [DllImport("user32", CharSet = CharSet.Auto)] 
    private extern static IntPtr SendMessage(IntPtr hWnd, 
      int msg, int wParam, IntPtr lParam); 

    private const int WM_SETREDRAW = 11; //0xB 

    public static void LockDrawing(IntPtr Handle) 
    { 
     SendMessage(Handle, WM_SETREDRAW, 0, IntPtr.Zero); 
    } 

    public static void UnlockDrawing(IntPtr Handle) 
    { 
     SendMessage(Handle, WM_SETREDRAW, 1, IntPtr.Zero); 
    } 
} 

J'ai ensuite une méthode Redessiner dans mon contrôle utilisateur personnalisé:

public void Redraw() 
{ 
    try 
    { 
     DrawingLocker.LockDrawing(Handle); 
     using (Graphics graphics = Graphics.FromHwnd(Handle)) 
     { 
      //Draw Stuff 
     } 
    } 
    finally { DrawingLocker.UnlockDrawing(Handle); } 
} 

Mon Le problème est que je ne dessine rien où le commentaire "Draw Stuff" est tiré. Qu'est-ce que je fais mal? Redémarrage est appelé lorsque les valeurs qui modifient le dessin, y compris le redimensionnement)

+0

... pourquoi utilisez-vous ce drapeau en premier lieu? –

+0

Arrêtez de scintiller en dessinant, s'il y a une meilleure façon que j'ai manquée, n'hésitez pas à l'afficher comme réponse. – Blam

Répondre

1

Je ne suis pas vraiment dans Windows et d'autres choses, mais à en juger par ce que MSDN dit à propos de ce drapeau, il ne fait pas ce que vous pensez qu'il fait. Il est utilisé pour désactiver les contrôles de redessin (pensez à une vue de liste) pendant que vous changez leur contenu. Le désactiver à l'intérieur de la fonction de rafraîchissement ne fera probablement rien. Voyez si vous pouvez trouver quelque chose en rapport avec "double buffering", parce que c'est une technique utilisée pour éviter le scintillement.

+0

Oh ok, bien je vais juste utiliser le double tampon qui je suppose dessine pour dire une image, puis dessiner l'image sur le contrôle, mais je vais google cette fois pour s'assurer que je ne fais pas une autre erreur idiote. Je vais mettre à accepter une fois qu'il me le permet, et n'oubliez pas de toujours google: D – Blam