Repaint d'un composant

Repaint d'un composant - C#/.NET managed - Programmation

Marsh Posté le 07-06-2006 à 16:17:03    

Bonjour,
 
Je modifie l'affichage du composant TreeView et, pour ce, j'ai trouvé un code sur le net permettant d'implémenter l'evennement paint qui n'existe pas par défaut.
 
Le problème c'est que j'ai quelque bugs graphiques lorsque j'utilise les ascenseurs j'ai l'impression qu'il utilise un buffer et que du coups il ne demmande pas le toujours le repaint quand je remonte avec un ascenseur!
 
J'aimerais donc réduir la taille de ce buffer pour éviter ce bug qui ne semble arriver que sur les éléments déja étendu et que quand je remonte.
 
Voici le code en question:
Je suppose que les éléments à modifier se trouvent pres des ligne 73 et 88 mais pour y mettre quoi???

Code :
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Drawing2D;
  4. using System.Windows.Forms;
  5. using System.ComponentModel;
  6. namespace NewControls {
  7.     /// <summary>
  8.     /// Displays a hierarchical collection of labeled items, each represented by a System.Windows.Forms.TreeNode.
  9.     /// </summary>
  10.     [
  11.     //Use the same attibutes as TreeView
  12.     DesignerAttribute("System.Windows.Forms.Design.TreeViewDesigner, System.Design, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" ),
  13.     DefaultPropertyAttribute("Nodes" ),
  14.     DefaultEventAttribute("AfterSelect" )
  15.     ]
  16.     public class TreeViewWithPaint :TreeView {
  17.         Bitmap   internalBitmap = null;
  18.         Graphics internalGraphics = null;
  19.         private void DisposeInternal() {
  20.             if( internalGraphics != null )
  21.                 internalGraphics.Dispose();
  22.             if( internalBitmap != null )
  23.                 internalBitmap.Dispose();
  24.         }
  25.         /// <summary>Releases resources.</summary>
  26.         /// <param name="disposing">true = Both managed and unmanaged, false = Unmanaged only.</param>
  27.         protected override void Dispose(bool disposing) {
  28.             if( disposing )
  29.                 DisposeInternal();
  30.             base.Dispose (disposing);
  31.         }
  32.         /// <summary>Occurs when window is resized.</summary>
  33.         /// <param name="e">A System.EventArgs.Empty.</param>
  34.         /// <remarks>Recreates internal Graphics object. </remarks>
  35.         protected override void OnResize( System.EventArgs e ) {
  36.             if( internalBitmap == null  ||
  37.                 internalBitmap.Width != Width || internalBitmap.Height != Height ) {
  38.                 if( Width != 0 && Height != 0 ) {
  39.                     DisposeInternal();
  40.                     internalBitmap = new Bitmap( Width, Height );
  41.                     internalGraphics = Graphics.FromImage( internalBitmap );
  42.                 }
  43.             }
  44.         }
  45.         /// <summary>Occurs when a Windows message is dispatched.</summary>
  46.         /// <param name="message">Message to process.</param>
  47.         /// <remarks>Overrides WM_PAINT, WM_ERASEBKGND.</remarks>
  48.         protected override void WndProc(ref Message message) {
  49.             const int WM_PAINT = 0x000F;
  50.             const int WM_PRINTCLIENT = 0x0318;
  51.             const int WM_ERASEBKGND = 0x0014;
  52.             switch( message.Msg ) {
  53.                 case WM_ERASEBKGND:
  54.                     //removes flicker
  55.                     return;
  56.                 case WM_PAINT:
  57.                     // The designer host does not call OnResize()                     
  58.                     if( internalGraphics == null )
  59.                         OnResize( EventArgs.Empty );
  60.                     //Set up  
  61.                     Win32.RECT updateRect = new Win32.RECT();
  62.                     if( Win32.GetUpdateRect( message.HWnd, ref updateRect, false) == 0 )
  63.                         break;
  64.                     Win32.PAINTSTRUCT paintStruct = new Win32.PAINTSTRUCT();
  65.                     IntPtr screenHdc = Win32.BeginPaint(message.HWnd, ref paintStruct);
  66.                     using( Graphics screenGraphics = Graphics.FromHdc( screenHdc ) ) {
  67.                         //Draw Internal Graphics
  68.                         IntPtr hdc = internalGraphics.GetHdc();
  69.                         Message printClientMessage = Message.Create( Handle, WM_PRINTCLIENT, hdc, IntPtr.Zero ); 
  70.                         DefWndProc( ref printClientMessage );
  71.                         internalGraphics.ReleaseHdc( hdc );
  72.                         //Add the missing OnPaint() call
  73.                         OnPaint( new PaintEventArgs( internalGraphics, Rectangle.FromLTRB(
  74.                             updateRect.left,
  75.                             updateRect.top,
  76.                             updateRect.right,
  77.                             updateRect.bottom ) ) );
  78.                         //Draw Screen Graphics
  79.                         screenGraphics.DrawImage( internalBitmap, 0, 0 );
  80.                     }
  81.                     //Tear down
  82.                     Win32.EndPaint( message.HWnd, ref paintStruct );
  83.                     return;
  84.             }
  85.             base.WndProc(ref message);
  86.         }
  87.         /// <summary>Occurs when the control is redrawn.</summary>
  88.         /// <remarks>Re enable browsing attributes for the Paint Event.</remarks>
  89.         [
  90.         EditorBrowsableAttribute( EditorBrowsableState.Always ),
  91.         BrowsableAttribute(true)
  92.         ]
  93.         public new event PaintEventHandler Paint {
  94.             add   { base.Paint += value; }
  95.             remove{ base.Paint -= value; }
  96.         }
  97.     }
  98. }


Message édité par the big ben le 07-06-2006 à 16:23:38
Reply

Marsh Posté le 07-06-2006 à 16:17:03   

Reply

Marsh Posté le 07-06-2006 à 16:21:30    

Avant le bug: (Ante Buggum Natum)
http://www.pharmacommerce.be/Brol/avantBug.GIF
 
Après avoir descendu puis remonté: (Post Buggum Natum)
http://www.pharmacommerce.be/Brol/apresBug.GIF

Reply

Marsh Posté le 08-06-2006 à 10:44:44    

Nobody???

Reply

Marsh Posté le 09-06-2006 à 13:52:21    

Ca fait tjrs les mêmes décalages ou ca dépend la vitesse à laquelle tu remontes ?

Reply

Marsh Posté le 09-06-2006 à 13:56:41    

la vitesse je ne crois pas par contre la distance à laquelle je descend avant de remonter

Reply

Marsh Posté le 09-06-2006 à 14:05:13    

Je serais toi, je referais un TreeView à la main, avec la gestion des noeuds, du scrolling et du buffer.
Jouer avec la WndProc ca te colle toujours des effets de bord inopportuns (la preuve).
 
Sinon, si tu préfères persister, il doit y avoir des infos à l'endroit où tu as choppé ton code. Sinon faut voir chez MS s'il y a un bug connu qui implique l'utilisation d'une scrollbar et l'évènement WM_PAINT en win32....
 
Les avantages de la première solution, c'est que tu est sûr d'arriver à un résultat, et que ton treeview sera plus modulable :)
C'est faisable : j'en ai déjà fait un. Le plus sympa c'est les algo récursifs de dessin :)


Message édité par _Mose_ le 09-06-2006 à 14:35:21
Reply

Marsh Posté le 09-06-2006 à 14:40:38    

pareil, j'en ai refait un en winform, c'est tres sympa :)

Reply

Marsh Posté le 09-06-2006 à 18:52:55    

yep les treeview fait à la main en .net c'est du bonheur :o)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed