Notresizablelistview : figer la largeur des colonnes

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 176 fois - Téléchargée 29 fois

Contenu du snippet

Cette classe bloque le redimensionnement des colonnes.

- Recuperation de l'objet columnheader.
- Vérification de la position du curseur et du hittest.
- Ne bloque les autres actions (Resize automatique , tri ...)

Source / Exemple :


//COPYRIGHT Original author ....

	public class NotResizableListView: ListView 
	{		
		#region Interop
		#region Consts
		const int LVM_FIRST = 0x1000;    
		const int LVM_GETHEADER = LVM_FIRST + 31;    
		const int HDM_FIRST = 0x1200;
		const int HDM_HITTEST = HDM_FIRST + 6;        
		const int HHT_ONDIVIDER = 0x0004;    
		const int WM_SETCURSOR = 0x0020;    
		const int WM_LBUTTONDOWN = 0x0201;        
		#endregion Consts

		[StructLayout(LayoutKind.Sequential)]    
			struct HDHITTESTINFO    
		{
			public Point pt;        
			public int flags;       
			public int iItem;    
		}        
		[DllImport("User32.dll")]    
		static extern int SendMessage(IntPtr hWnd, int uMsg, IntPtr wParam, IntPtr lParam); 

		#endregion Interop

		protected override void OnHandleCreated(EventArgs e)    
		{       
			base.OnHandleCreated(e);     
			//Recupere l'objet columnheader.
			IntPtr hHeader = (IntPtr)SendMessage(Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);  
			ColumnHeader nativeWindow = new ColumnHeader(hHeader);  
		}   
		
		private class ColumnHeader : NativeWindow    
		{       
			public ColumnHeader(IntPtr hHeader)
			{ 
				this.AssignHandle(hHeader);       
			}   
    
			protected override void WndProc(ref Message m)
			{
				switch(m.Msg)          
				{             
					case WM_SETCURSOR:                
						// Pas de changement de curseur
						return;             
					case WM_LBUTTONDOWN:              
						Int16 x = (Int16)m.LParam;                
						Int16 y = (Int16)((int)m.LParam >> 16);
						// Recuepere la position du cursor
						Point cursorPosition = new Point(x, y);
						HDHITTESTINFO hitInfo = new HDHITTESTINFO();
						hitInfo.pt = cursorPosition;                
						IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(hitInfo));                
						Marshal.StructureToPtr(hitInfo, buffer, true);         
						//Declenche le hit, permet l'execution des autres actions lié au click sur le header
						SendMessage(m.HWnd, HDM_HITTEST, IntPtr.Zero, buffer); 
						hitInfo = (HDHITTESTINFO)Marshal.PtrToStructure(buffer, typeof(HDHITTESTINFO));
						Marshal.FreeHGlobal(buffer);                
						if (hitInfo.flags == HHT_ONDIVIDER)                   
							//On est sur le separateur donc pas d'action
							return;                
						break;          
				}

				base.WndProc(ref m);       
			}    
		} 
	
	}

Conclusion :


C'est un bout répéré je ne sais plus ou il y a quelques mois;

A voir également

Ajouter un commentaire

Commentaires

wald39
Messages postés
68
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
23 février 2011
-
il y a des erreurs dans le code ou alors il manque des using car "StructLayout" , "DllImport" , "NativeWindow" et "Message" sont introuvable.
TheSaib
Messages postés
2369
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
12 -
Je n'ai mis aucun using.

Le using qui manque naturellement est le using System.Runtime.InteropServices;

Celà paraissait logique.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.