Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2167 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Repaint d'un composant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Repaint d'un composant

n°1382973
the big be​n
Posté le 07-06-2006 à 16:17:03  profilanswer
 

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
mood
Publicité
Posté le 07-06-2006 à 16:17:03  profilanswer
 

n°1382974
the big be​n
Posté le 07-06-2006 à 16:21:30  profilanswer
 

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

n°1383495
the big be​n
Posté le 08-06-2006 à 10:44:44  profilanswer
 

Nobody???

n°1384465
_Mose_
Lonesome coder
Posté le 09-06-2006 à 13:52:21  profilanswer
 

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

n°1384475
the big be​n
Posté le 09-06-2006 à 13:56:41  profilanswer
 

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

n°1384495
_Mose_
Lonesome coder
Posté le 09-06-2006 à 14:05:13  profilanswer
 

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
n°1384552
Tamahome
⭐⭐⭐⭐⭐
Posté le 09-06-2006 à 14:40:38  profilanswer
 

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

n°1384812
Lamarmotte
Posté le 09-06-2006 à 18:52:55  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Repaint d'un composant

 

Sujets relatifs
animation + xml + composantEclipse Ve Propriéte de chaque Composant comme dans VS
Re-designer un composant (méthode Paint)Cherche composant genre collapse panel
créer composant xulupload image avec ou sans composant
Ajouter un composant inet en VB[C#] Composant Powerpoint dans VS2005 ?
Désactiver les dates antérieures avec le composant DateFieldAppeler Composant .NET (dll) dans une page asp
Plus de sujets relatifs à : Repaint d'un composant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR