2010-10-21 3 views
1

J'ai un problème étrange avec un WinForms ComboBox amélioré que j'ai écrit en C#. La boîte affiche une liste de couleurs avec la couleur elle-même et le nom de la couleur et est définie sur ComboBoxStyle.DropDownList, double mise en mémoire tampon et DrawMode.OwnerDrawFixed. Les éléments sont dessinés lorsque l'événement DrawItem est déclenché.Comment éviter de superposer des chaînes dans un panneau déroulant personnalisé de la liste déroulante pendant le défilement?

Si j'ouvre le menu DropDown et que je défile avec la molette de la souris, le comportement et l'apparence sont corrects. Si j'utilise le pouce de la barre de défilement avec le bouton gauche de la souris, le texte dans le panneau devient tout maculé. Ce n'est que si je survole les éléments affichés à nouveau que les éléments seront redessinés correctement.

http://i.stack.imgur.com/F99Zu.png

aide est très appréciée!

Michael

Edit: Code de la méthode de dessin:

private void OnDrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index == -1) 
     { 
      return; 
     } 

     e.DrawBackground(); 

     Graphics grfx = e.Graphics; 
     grfx.FillRectangle(mWhiteBrush, e.Bounds); 

     ColorInfo colorInfo = (ColorInfo)Items[e.Index]; 
     Color brushColor = colorInfo.Color; 

     using (SolidBrush brush = new SolidBrush(brushColor)) 
     { 
      Rectangle rectangleColor = e.Bounds; 
      Rectangle rectangleText = e.Bounds; 

      rectangleColor.Width = rectangleColor.Height; 
      rectangleText.X += rectangleColor.Width; 
      rectangleText.Width -= rectangleColor.Width; 

      grfx.FillRectangle(brush, rectangleColor); 
      grfx.DrawString(colorInfo.Name, e.Font, mBlackBrush, rectangleText); 
     }  
    } 

Répondre

1

Sans voir le code, à partir de votre description, il semble que il y a un bogue dans le code de votre dessin. Une chose que j'ai vue dans le passé est que la propriété DrawItemEventArgs.State des arguments d'événement peut poser des problèmes. Cela nécessite une vérification minutieuse, car il s'agit d'une énumération de drapeaux où plusieurs états peuvent être définis simultanément.

Afficher le dessin/code de mesure pour plus d'informations.

Aussi, je suppose que vous avez un double tampon ce contrôle, non?

Pour un réglage try de solution rapide ceci:

grfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;

Bien qu'une solution plus robuste consiste à gérer la double mise en mémoire tampon dans le code vous-même comme suit:

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) 
    {  
     if (e.Index == -1) 
     { 
      return; 
     } 

     using (Bitmap drawbuffer = new Bitmap(e.Bounds.Width, e.Bounds.Height)) 
     { 
      using (Graphics grfx = Graphics.FromImage(drawbuffer)) 
      { 
       grfx.FillRectangle(mWhiteBrush, 0, 0, e.Bounds.Width, e.Bounds.Height); 

       ColorInfo colorInfo = (ColorInfo)Items[e.Index]; 
       Color brushColor = colorInfo.Color; 

       using (SolidBrush brush = new SolidBrush(brushColor)) 
       { 
        Rectangle rectangleColor = new Rectangle(); 
        Rectangle rectangleText = new Rectangle(); 

        rectangleColor.Height = rectangleColor.Width = e.Bounds.Height; 
        rectangleText.X += rectangleColor.Width; 
        rectangleText.Width = e.Bounds.Width - e.Bounds.Height; 

        grfx.FillRectangle(brush, rectangleColor); 
        grfx.DrawString(colorInfo.Name, e.Font, mBlackBrush, rectangleText); 
       } 

       e.Graphics.DrawImageUnscaled(drawbuffer, e.Bounds); 
      } 
     } 
    } 
+0

Le code de la méthode de dessin est inséré. Oui, j'utilise le double tampon. – Mil

+0

Ajout d'une solution rapide qui va résoudre le flou ... –

+0

Merci beaucoup! – Mil

0

Eh bien, redessiner l'arrière-plan à chaque fois TEXT,. Puisque vous doublebuffer, vous n'aurez pas de scintillement ou tout autre problème.

Questions connexes