dupille
Messages postés5Date d'inscriptionvendredi 16 mars 2007StatutMembreDernière intervention27 mars 2007
-
26 mars 2007 à 17:23
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
27 mars 2007 à 12:27
Bonjour, je cherche à illustrer le niveau d’eau dans une buse en fonction du débit. J’ai réussit à calculer la hauteur en fonction du débit mais je bloque au niveau de l’illustration, je voudrais obtenir une cercle remplie jusqu'a la hauteur d'eau calculé.
Je pense que le plus simple est de dessiner une rectangle de la taille de ma picturebox, au centre duquel j'aurai enlevé une cercle représentant la buse. Le niveau d'eau serait alors illustré par une rectangle bleu plein derrière le cercle (2 couches l'une devant l'autre, la première est le rectangle percé d'un cercle, le second un rectangle bleu plein).
créé un nouveau projet, ajoute un Timer (Timer1)
et ajoute ce code :
Private Declare Function CreateEllipticRgn Lib "gdi32.dll" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SelectClipRgn Lib "gdi32.dll" (ByVal hdc As Long, ByVal hRgn As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Sub Form_Load()
Dim hRgn As Long
Me.Show
DoEvents
Me.ScaleMode = vbPixels
Timer1.Interval = 1
hRgn = CreateEllipticRgn(0, 0, Me.ScaleWidth, Me.ScaleHeight)
SelectClipRgn Me.hdc, hRgn
DeleteObject hRgn
End Sub<hr />
Private Sub Timer1_Timer()
Static nSize As Long
nSize = nSize + 1
If nSize = 100 Then
Me.Cls
nSize = 0
End If
Me.Line (0, (100 - nSize) * Me.ScaleHeight / 100)-(Me.ScaleWidth, Me.ScaleHeight), vbBlue, BF
End Sub , ----
By Renfield
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 26 mars 2007 à 17:35
Bonsoir,
On "n'enlève" pas un cercle (comment, d'ailleurs, imaginer "enlever" des pixels parmi d'autres).
On peut par contre dessiner un cercle rempli de la couleur de son choix .
VB t'offre pour celà la méthode Circle (existe également la possibilité de faire la même chose avec la fonction Ellipse de la librairie Gdi32 de l'Api de Windows
dupille
Messages postés5Date d'inscriptionvendredi 16 mars 2007StatutMembreDernière intervention27 mars 2007 26 mars 2007 à 17:45
Je comprends bien ta réponse jmfmarques mais elle ne répond que partiellemnt à ma question. Les pixels transparent n'existant pas, comment puis-je illustrer le remplissage de ma buse.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 26 mars 2007 à 18:08
1) Je n'ai jamais dit que l'on ne pouvait pas rendes des pixels transparents ! celà est possible, mais pour tous les pixels d'une même couleur (déclarée comme transparente). Celà ne fera pas ton affaire.
2) Comment faire alors ton truc ?
Il me semble t'avoir répondu .... avec la méthode Circle et en dessinant, au fur et à mesure du remplissage, 2 secteurs de cercle, superposés, l'un de la couleur de ton liquide (celui du dessous) et l'autre de la couleur du contenant (celui de dessus)
Où est le problème ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
2) lis ce que dit ton aide en ligne pour la méthode circle
3) analyse de plus près mon petit bout de code
4) sers-t'en dans ton projet en faisant évoluer les dimensions :
- a) d'un secteur "vide" (celui du haut)
- b) d'un secteur "plein" (celui du bas)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 26 mars 2007 à 22:13
Tiens!
Tu n'es plus là ! (enthousiame diminué face aux nécessités de calculer ?)
Saches maintenant qu'il y a une autre méthode : elle ne demande aucun calcul mais beaucoup en concentration de la pensée) :
Je te la donne :
en lieu et place de ta buse circulaire : une pictureBox carrée avec une couleur définie comme transparente transparente et étant celle du cercle le plus grand qu'elle contient (donc un cercle centré au centre du carré et de rayon égal à la moitié d'un côté).
Cette picturebox A doit être posée exactement au dessus d'une autre picturebox B , de mêmes dimensions, tout en conservant le 1er plan (zorder) .
Tu fais alors monter le niveau du liquide par la couleur de ton choix dans la picturebox B et tu superposes la picture A avec sa transparence, en utilisant la fonction transparentBlt de la librairie GDI32 de l'API de Windows.
Si tout celà te rébute également : il te restera alors à faire une buse d'une forme en rapport avec ton niveau de volonteé : carrée !... et tout devrait alors être simple ... (faut savoir ce que l'on veut, c'est tout...)
Le Papa de Thibaut
Messages postés53Date d'inscriptionmercredi 22 novembre 2006StatutMembreDernière intervention 7 mars 20151 27 mars 2007 à 02:35
bonjour,
je n'ai pas bien compris ton probleme alors je te propose 2 idées:
une solution moche mais simple sans calcul:
fais 2 images (avec ms paint) 1 bol plein et un bol vide
Recouvre ton bol vide avec ton bol plein.
Au fur et à mesure que le bol se remplit, allonge l'image du bol plein tout en la remontant.
si c'est la taill du rond qui t'importe, utilise le controle Shape avec les attributs qui te conviennent (rond de couleur...)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 27 mars 2007 à 08:39
facile, en fait, via des API
CreateEllipticRgn pour créer ta "bulle"
ensuite, SelectClipRgn pour associer la Region créée au hDc d'un PictureBox
enfin, tu n'a plus qu'a dessiner ton rectangle, comme si de rien n'était. Il n'aura d'effet qu'a l'interieur du cercle définit préalablement.
- d'allonger une image tout en la remontant et en lui gardant la forme d'un secteur de cercle dont le côté plat est dessus ?
Il ne s'agit pas d'un bol qui se remplit, mais d'autre chose : un peu comme si tu voyais (et devais représenter) monter le niveau de l'eau au travers d'un hublot de machine à laver à tambour horizontal !
Si le hublot était rectangulaire, ce serait fastoche. Mais voulà : le hublot (ici sa buse) est circulaire...
dupille
Messages postés5Date d'inscriptionvendredi 16 mars 2007StatutMembreDernière intervention27 mars 2007 27 mars 2007 à 10:10
jmfmarques, je vois qu'avec ton alégorie de la machine à laver tu as exactement saisie ce que je veux faire et ton idée des deux picturebox superposé se rapproche de l'idée que j'avais d'un cerlce transparent mais je ne voyait pas comme le mettre en place. Je vais creuser dans cette direction.
Merci beaucoup pour le tuyau de la fonction transparentBlt de la librairie GDI32
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 27 mars 2007 à 10:42
"Je vais creuser dans cette direction"
=> ma solution ne te convient-elle pas ?
on créée un cercle, on dit à windows qu'il n'a le droit de dessiner que dans ce cercle
on dessine un rectangle plus grand, au niveau souhaité, sachant qu'il sera découpé pour "rester" dans le cercle...
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 27 mars 2007 à 11:29
Si ton problème est celui d'avoir ce "remplissage" dans une picturebox dont tu dois déterminer la position et les dimenseion :
Reprends simplement le code de renfield et change me.
par Picture1.
partout...
Donne à ta pictyrebox devant contenir ton "hublot" une forme carrée (hauteur = largeur)
Rien ne t'empêche, de surcroît, de mettre cette picturebox contenant ton "hublot" dans une autre picturebox servant de container, si tu le veux
dupille
Messages postés5Date d'inscriptionvendredi 16 mars 2007StatutMembreDernière intervention27 mars 2007 27 mars 2007 à 11:43
Bonjour Renfield , pas que ta solution ne me convienne pas mais j'ai été un peu effrayé par les "Lib "gdi32.dll" " que je ne connait pas. Je me penche de suite sur tes lignes de code en me rangeant à la convergence des avis.
Merci à tous, je vous tiens au courant de la suite.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 27 mars 2007 à 11:56
Tiens,
Je t'ai un peu adapté le code de Renfield pour qu'il corresponde à tes besoins, car je devine comment tu veux dessiner ...
Tu as là, maintenant , tout ce qu'il te faut pour jouer comme tu l'entends avec les différentes couleurs.
Ne t'inquiète ni des positions, ni des dimensions des pictureboxes (ce petit code s'en charge). pas la peine, non plus, de mettre hublot dans picture1 (le code s'en charge)
Private Declare Function CreateEllipticRgn Lib "gdi32.dll" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SelectClipRgn Lib "gdi32.dll" (ByVal hdc As Long, ByVal hRgn As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Sub Timer1_Timer()
Static nSize As Long
nSize = nSize + 1
If nSize = 100 Then
hublot.Line (0, 0)-(100, 100), vbWhite, BF
nSize = 0
End If
hublot.Line (0, (100 - nSize) * hublot.ScaleHeight / 100)-(hublot.ScaleWidth, hublot.ScaleHeight), vbBlue, BF
End Sub
Voilà !
Essaye, ... comprends... et remercie Renfield