Mettre des TCheckBox dans un TStringGrid

cs_Elvis68 Messages postés 3 Date d'inscription mardi 28 juin 2005 Statut Membre Dernière intervention 9 septembre 2005 - 28 juin 2005 à 08:48
cs_OrsE Messages postés 44 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 20 octobre 2005 - 29 juin 2005 à 09:52
Bonjour,

je cherche à faire une colonne verticale dans un TStringGrid comportant dans chaque case un TCheckbox, le reste des colonnes verticales étant utilisé pour du texte.
Quelqu'un pourrait-il me proposer une solution?

Merci d'avance

Elvis

1 réponse

cs_OrsE Messages postés 44 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 20 octobre 2005
29 juin 2005 à 09:52
Il y a bien sûre plusieur solution, j'en vois deux:


<li> La première est de mettre une image d'un
TCheckBox sur toutes les cellules dans lesquelles tu veux un checkbox,
et lors d'un click, tu change l'état de ta avriable et de ton image.
Pour se faire, utilise les fonctions win32 DrawThemeText,
DrawThemeBackGround ... donc dans ton cas, utilise (désolé je parle
qu'en C/Cpp) OpenThemeData(this->Handle,L"BUTTON");</li>

(le "BUTTON" c pour avoir le thème qui corresponds aux boutons, et une
checkbox en fait partie. Ensuite, tu récupère un HTHEME, que tu utilise
dans
DrawThemeBackGround(hTheme,GetDC(this->Handle),BP_CHECKBOX,CBS_NORMAL
ou CBS_HOT ou CBS_UNCHECKEDNORMAL, &Rect, NULL);

et pour finir tu fait un cloeThemeData(hTheme);

De cette manière, tu as pas réellement une vrai checkbox mais tu en a
l'apparence. Inconvéniant: Si tu es pas sous winXP, tu as pas ces
fonctions là, alors il faut les remplacer par
DrawFrameControl(GetDC(this->Handle),&rect,DFC_BUTTON,DFCS_BUTTONCHECK|DFCS_CHECKED
ou DFCS_INACTIVE|DFCS_TRANSPARENT);


<li>La deuxième solution, est de mettre de vrais checkbox que tu
places au dessus de chaque cellule de ta grille. Le problème que j'ai
rencontré quand j'ai voulu faire ça, c'est qu'une grille ne peut pas
contenir de composants, donc il faut que tu mettre comme parent des
checkbox, le parent de ta grille, le problème qui en résulte, c'est que
uand tu cliques sur un checkbox, tu perds le focus sur ta grille, faut
bien faire gaffe en bougeant ta grille de faire bouger les checkbox qui
vont avec, de les réduire si tu réduits les colonnes, et si tu vois une
moitié de colonne, alors le checkbox dépassera de ta grille en donnant
un mauvais effet.Mais au moins, tu n'as pas à gérer l'affichage, que tu
sois sous XP ou 2000. Tu dois avoir autant de composants que tu as de
lignes dans ta grille, et faire gaffe si pendant l'exécution, ton nombr
de ligne change, car tu as pas d'évènements associés à ça. Et faut
afficher que celles que tu peux voire (forcément :) )

</li>

Voilà. Personellement, je préfère la première solution. Elle est plus
propre, plus simple à mettre en oeuvre, tu claques le bout de code que
j'ai mis dans le OnDrawCell et le tour est joué.

Voilà, bon code.
0
Rejoignez-nous