CONTROLS ++(CONTROLS GRAPHIQUES EN CONSTRUCTION)

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 4 janv. 2010 à 15:46
bbsoft Messages postés 4 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 26 juillet 2015 - 26 juil. 2015 à 12:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51066-controls-controls-graphiques-en-construction

bbsoft Messages postés 4 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 26 juillet 2015
26 juil. 2015 à 12:21
Salutations,
Tout d'abord je te félicite pour ton travail et collaboration énorme que tu fais, je ne sais pas si tu consultes encore tes messages, mais je l'espère bien.
voilà: j'ai développé une application énorme qui m'a pris beaucoup d'années, dans ma fenêtre principale j'avais un menu déroulant style windows. quand j'ai vu tes boutons ++, j'ai eu l'idée de les utiliser comme menu principal.
j'ai beaucoup de bug (fenêtres blanches avec "... a cessé de fonctionner de windows 7".
ma question: est ce que le blocage est-il du aux boutons graphiques, si oui avez-vous une maj qui corrige le problème.
Merci et bonne continuation.
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
6 janv. 2010 à 22:56
bon, avec ces dernieres mises a jour, je trouve que ca a vraiment de la gueule ;)
j'atends vos critiques avec impassience.
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
5 janv. 2010 à 23:23
http://www.vbfrance.com/forum/sujet-ENREGISTREMENT-DANS-FICHIER-LOGIGRAMME-DESSINE-DANS-PICTUREBOX_1159298.aspx
cependant, je ne comprends pas les paramaitres a utiliser .
dois-je me placer du côté du composant en demandant son parent ou bien au niveau du parent et demander les enfants. en tous les cas je n'arrive pas a ne pas avoir le composant lui même.
ce qui au final fait que ca ne marche pas.
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
5 janv. 2010 à 13:31
pour le momment j'ai abandonné le principe d'utiliser une PictureBox
je me suis repenché sur le Usercontrol unique

originellement j'utilisait le DC du ".Parent" en fait je viens de voir que le ".Extender.Container" serrait déja mieux ^^
'#######################################################################################
Dim m_t As Long: m_t = UserControl.ScaleY(UserControl.Extender.Top, UserControl.Extender.Container.ScaleMode, vbPixels)
Dim m_l As Long: m_l = UserControl.ScaleX(UserControl.Extender.Left, UserControl.Extender.Container.ScaleMode, vbPixels)

Dim Res1 As Long
Res1 = BitBlt(UserControl.hDC, 0, 0, UserControl.ScaleWidth, UserControl.ScaleHeight, _
UserControl.Extender.Container.hDC, m_l, m_t, _
vbSrcCopy)
'#######################################################################################

la solution que j'envisage n'ai a mon avis pas tres propre mais voyons voir quand même ^^ :
- faire la liste des contrôls contenus par le conteneur.
- trouver les Plans (qui est au dessus de qui)
- récupérer les dc de chacun (pour ceux présents sur la zone souhaitée)
- ajouter chaque dc successivement
Ainsi, on retrouverait bien l'arriere plan

premiere chose sur laquelle je bloque : connaitre les diférentes position (plan) des composants les uns par rapport aux autres. Ceci dans la mesure ou il semblerait que le ZOrder est un "Sub" et non un "Property"
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 janv. 2010 à 09:31
pour le fond, le "truc" c'est que le parent ne dessine pas la zone située sous le UserControl.
ca permet de s'economiser cela (voir ClipRegion, pour de la théorie)

tu as bien un moyen, c'est de demander un DC particulier, n'incluant pas de ClipRegion

voir GetDCEx
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
5 janv. 2010 à 09:24
bon ben apparament c'est caduc comme méthode ;(
en effet, on récupère bien le fond uniquement si rien ne recouvre le composant
et justement moi je le recouvre avec une PictureBox ;(
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
5 janv. 2010 à 08:21
'###########################################################################################
Dim DC1 As Long: DC1 = GetDC(0)
Dim DC2 As Long: DC2 = GetDC(0)
Dim vDC As Long: vDC = CreateCompatibleDC(DC1)
Dim vBMP As Long: vBMP = CreateCompatibleBitmap(DC2, Fond.ScaleWidth, Fond.ScaleHeight)
Dim holdBMP As Long: holdBMP = SelectObject(vDC, vBMP)
'###########################################################################################
Dim Res0 As Long
Res0 = BitBlt(vDC, 0, 0, Fond.ScaleWidth, Fond.ScaleHeight, _
UserControl.hDC, 0, 0, _
vbSrcCopy)
'------------------------------------------------------
Dim Res1 As Long
Res1 = BitBlt(Fond.hDC, 0, 0, Fond.ScaleWidth, Fond.ScaleHeight, _
vDC, 0, 0, _
vbSrcCopy)
'###########################################################################################
Call SelectObject(vDC, holdBMP): Call DeleteObject(vBMP)
Call DeleteDC(vDC)
Call ReleaseDC(0, DC2)
Call ReleaseDC(0, DC1)
'###########################################################################################
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
5 janv. 2010 à 07:51
;) une bonne baffe ca remet les idées de temps en temps. merci renfield ^^

je me suis pris la tête toute la soirée a essayer de coder ceci et sans succès :* mettre le Usercontrol transparent (avec maskcolor gris et BackColor gris)
* placer un picturBox nomé fond sur le usercontrol

ainsi, le hDC du Usercontrol devrai contenir exactement ce qu'il y a dessous. (ce que je devrai utiliser pour la transparence)
je redimensionne le "Fond" aux dimensions du Usercontrol puis j'effectue les oppérations graphiques par API. mais rien n'y fait je n'arrive a rien. Le "Fond" reste vierge.

voici le code en question :
'######################################################################################
Dim DC1 As Long: DC1 = GetDC(0)
Dim vDC As Long: vDC = CreateCompatibleDC(DC1)
Dim hOldBmp As Long: hOldBmp = SelectObject(vDC, Fond.Picture.Handle)

Call BitBlt(hDC, 0, 0, Fond.Width, Fond.Height, UserControl.hDC, m_top, m_left, vbSrcCopy)

Call SelectObject(hDC, hOldBmp)
Call DeleteDC(hDC)
Call ReleaseDC(0, DC1)
'######################################################################################
ce bout de code a pour but de rendre le Fond aussi transparent que le Usercontrol. Pas tres util en soit mais c'est juste pour les tests.

Y a t-il des propriétés a paramétrer ? je pense tout particulierement aux "Autorodraw"
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 janv. 2010 à 07:19
"Je doit pouvoir utiliser le Usercontrol.ContainerHwnd mais je ne sais pas comment récupérer le DC avec."

euh... tu utilises GetDC dans ton code, documente toi sur cette fonction ^^
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
4 janv. 2010 à 17:35
bonjour ^^

en effet le double clik n'est pas pris en charge dans la mesure ou c'est un bouton et que personnellement je n'utilise pas de double click dessus ^^
enfin, je l'ajouterais, ca ne devrait pas être trop dur a faire.

"
mets une image dans une picturebox au milieu de ta form
un bouton dans ta box
tada....
tu fais ta transparence avec ce qui est en dessous sans prendre en compte que ce n'est pas forcément la form
résultat left 0 top 0, ce qui est très souvent faux
"
dsl je ne comprends pas ^^
pour faire la transparence je récupère le DC de Usercontrol.Parent et ca ne doit pas être le bon choix. En effent non seulement le .parent.DC n'est pas le conteneur mais le la form d'origine de la hierarchie. Je doit pouvoir utiliser le Usercontrol.ContainerHwnd mais je ne sais pas comment récupérer le DC avec.
deplus, si on y réfléchi, il ne faudrait pas utiliser le DC qui ne concerne qu'un control et non pas tous ce qui est dessus ;(
je suis un petit peut perdu...
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
4 janv. 2010 à 15:46
salut,

mets une image dans une picturebox au milieu de ta form
un bouton dans ta box

tada....
tu fais ta transparence avec ce qui est en dessous sans prendre en compte que ce n'est pas forcément la form
résultat left 0 top 0, ce qui est très souvent faux

pas regardé le reste, l'effet de dessin semble très long et le double click ne semble pas pris en compte

ps : une source posté peut être "mise à jour", celle-ci correspondrait non?