IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#]Controles utilisateurs : problème d'affichage


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut [C#]Controles utilisateurs : problème d'affichage
    J'ai créé un contrôle utilisateur qui regroupe trois composants basiques : un textBox, un button et une listeView.

    Ce contrôle a pour but de se comporter comme une combobox mais avec la possibilité d'avoir des colonnes dans sa zone de liste. En effet, une combobox ne permet seulement que d'afficher du text brut avec un style, une police et un fond je crois bien, mais impossible de formater l'affichage en colonne.

    Mon probème se situe au niveau de l'affichage. Mon controle fait 140 pixels sur 20 (la taille exacte du texteBox + celle du button). La listeBox se situe en dessous du textbox, hors de la surface d'affichage du contrôle. Ensuite, dès que l'utilisateur clique sur le bouton, j'agrandi la surface d'affichage du contrôle pour rendre visible la listeView. Tout ceci fonctionne très bien. Cependant, si le contrôle est situé dans un groupBox par exemple, la listeView du contrôle sera coupée car considérée commme à l'intérieur du groupBox. Une comboBox ne se comporte pas de la sorte, la zone de liste reste visible !

    Je me demandais s'il était possible donc d'appliquer une sorte de priorité à l'affichage de la listeView du contrôle (agir sur le OnPaint() de la listView ?) et aussi s'il est possible de rendre le fond du contrôle transparent pour ne pas masquer les autres composants ?
    J'espère avoir été précis et méthodique dans ma description.

    Merci pour votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    tu as été précis, mais en fait tu ne peux pas toi directement procéder de la sorte.

    Explications: La combobox est un composant intégré de windows parmis la collection des composants de base.
    C'est de là que ce composant tire sa liste déroulante "top of screen".

    En réalité tu te complique la vie pour rien. Effectivement la combobox de base ne gèrepas les colonnes, ne gère pas le formattage commeon pourrait le vouloir et ne gère pas l'affichage d'icones devant l'entrée en question...
    cependant il y a un moyen simple de palier à cela.

    Tu refait une combobox perso qui hérite du controle ComboBox.
    rien de bien sorcier, tu publie les propriétés dont tu as besoin.

    Tu modifie quelques propriétés et t'assure qu'elles ne peuvent pas être modifiées, et parmis celles là il y a le mode d'affichage.
    Maintenant tout va dépendre de toi... c'est plus facile si tu opte pour un type d'affichage "simple" où toutes les lignes (entrées) font la même hauteur, auquel cas cettehauteur doit etre définie dans les propriétés publique de la combo quand tu fait ton initializecomponent()

    ensuite il ya une méthode protégée à surcharger (override), celle qui se charge du dessin.

    voila quelques parcelles de code qui t'aiderons...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    	public class ImageCombo : System.Windows.Forms.ComboBox
    	{
    		public ImageCombo()
    		{
    			//on veut le dessiner nous même
    			this.DrawMode = DrawMode.OwnerDrawFixed;
    			//forcement un DropDownList
    			this.DropDownStyle = ComboBoxStyle.DropDownList;
    			m_oColumns = 1;
    		}
     
    		private ImageList m_oImageList;
    		public ImageList ImageList
    		{
    			get { return m_oImageList; }
    			set	{ m_oImageList = value;	}
    		}
     
    		private int m_oColumns;
    		public int Columns
    		{
    			get { return m_oColumns; }
    			set 
    			{
    				if (value > 0)
    					m_oColumns = value;
    				else
    					throw new Exception("Nombre de colonnes incorrect");
    			}
    		}
     
    		protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
    		{
    			this.DropDownStyle = ComboBoxStyle.DropDownList;
    			base.OnDrawItem(e);
    			if (e.Index == -1)
    				return;
     
    			System.Drawing.SolidBrush oB;
    			if (this.ImageList != null)
    			{
    				ImageItem oItem = this.Items[e.Index] as ImageItem;
    				//l'image associée
    				Image oImg = null;
     
    				if (oItem != null && oItem.ImageIndex >= 0)
    				{
    					oImg = this.ImageList.Images[oItem.ImageIndex];
    					//dessin de l'image
    					e.Graphics.DrawImage(oImg, e.Bounds.X, e.Bounds.Y);
    				}
    				//dessin du texte
    				StringFormat oSF = new StringFormat();
    				oSF.Alignment = StringAlignment.Near;
    				oSF.LineAlignment = StringAlignment.Center;
     
    				string text = this.Items[e.Index].ToString();
    				string[] itms = text.Split('\t');
     
    				int tW = e.Bounds.Width - this.ImageList.ImageSize.Width;
    				int lX = e.Bounds.X + this.ImageList.ImageSize.Width;
     
    				int cC = itms.Length;
    				int CW = tW / m_oColumns;
     
    				int[] CX = new int[m_oColumns];
     
    				oB = new System.Drawing.SolidBrush(this.ForeColor);
     
    				for (int i = 0; i < m_oColumns; i++)
    				{
    					CX[i] = (i > 0) ? CX[i - 1] + CW : lX;
     
    					Rectangle oRect = new Rectangle(
    						  CX[i],
    						  e.Bounds.Y,
    						  CW,
    						  e.Bounds.Height);
    					e.Graphics.DrawString((i < cC) ? itms[i] : "", this.Font, oB, oRect, oSF);
    				}
     
    				oB.Dispose();
    				return;
    			}
    			oB = new System.Drawing.SolidBrush(this.ForeColor);
    			e.Graphics.DrawString(this.Items[e.Index].ToString(), this.Font, oB, e.Bounds);
    			oB.Dispose();
    		}
    	}
    J'ai simplifié et supprimé pas mal de code mais ca ressemble à peut près a ce que tu peux rencontrer.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut
    Merci beaucoup pour ta réponse, en effet cette solution m'a l'air plus simple et plus propre. Cependant, j'ai pas trouvé le namespace de "ImageItem"....

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut
    j'ai réussi à dériver la combobox, mais maintenant j'aimerai l'appliquer à la DataGridViewComboBoxCell, mais la méthode OnDrawItem() n'existe pas apparemment.
    Comment s'y prendre ?

    merci

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    beh, en créer un datacolumnItem ou bien en héritant de la columncombobox

    The Monz, Toulouse

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut
    "columncombobox" fait partie de quel namespace ? car je ne le trouve pas, idem sur le web...

Discussions similaires

  1. [Custom Control] Comment résoudre un problème d'affichage uniquement dans Blend ?
    Par choas dans le forum Windows Presentation Foundation
    Réponses: 15
    Dernier message: 29/09/2008, 12h23
  2. Problème d'affichage de controle
    Par Kalite dans le forum MFC
    Réponses: 1
    Dernier message: 26/01/2008, 15h27
  3. Problème d'affichage de Tab Control
    Par Kemanke dans le forum MFC
    Réponses: 20
    Dernier message: 06/03/2007, 14h53
  4. Réponses: 3
    Dernier message: 20/09/2006, 18h49
  5. [MFC]List Control : problème d'affichage
    Par gege2061 dans le forum MFC
    Réponses: 5
    Dernier message: 25/07/2005, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo