Enlever un cercle dans un rectangle !!!

Résolu
dupille Messages postés 5 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 27 mars 2007 - 26 mars 2007 à 17:23
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 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).

Merci d'avance pour vos réponses.

17 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 mars 2007 à 08:48
Je t'ai fait une petite maquette....

je t'invite a consulter la documentation surles fonctions API en cause :
http://msdn2.microsoft.com/en-us/library/ms532580.aspx

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

Renfield
Admin CodeS-SourceS- MVP Visual Basic
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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
0
dupille Messages postés 5 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 27 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.

Cordialement

Dupille
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
26 mars 2007 à 18:37
Bon...
Je ne vais pas tout te faire, quandmême...

1) regarde ce que fait ceci :

Private Sub Command3_Click()
    Picture1.ScaleMode = 3
    Picture1.AutoRedraw = True
    Picture1.FillColor = vbRed
    Picture1.FillStyle = vbSolid
    Pi = 4 * Atn(1)
    ang1 = -(Pi * 90) / 180
    ang2 = -(Pi * 180) / 180
    Radius = 10
    Dim CX, CY
    CX = Picture1.ScaleWidth / 2
    CY = Picture1.ScaleHeight / 2
    Picture1.Circle (CX, CY), 30, vbRed, ang1, ang2
End Sub

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)

Bon travail
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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...)
0
Le Papa de Thibaut Messages postés 53 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 mars 2015 1
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...)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
27 mars 2007 à 08:43
Bonjour, Le Papa de Thibaut

Tu peux expliquer comment tu envisages :

- 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...
0
dupille Messages postés 5 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 27 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

PS: à 22h13, je ne suis plus au boulot...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
27 mars 2007 à 10:55
Bonjour  dupille;

C'est la solution de Renfield qui est la meilleure et m'en veux de ne pas y avoir pensé !
Adopte-la sans hésiter.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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
0
dupille Messages postés 5 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 27 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.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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.

Sur une Forme :

- 1 picturebox Picture1
- 1 picturebox bublot
- 1 timer timer1

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 Form_Activate()
  Dim hRgn As Long
   Me.Show
   DoEvents
   Me.ScaleMode = vbPixels
   Picture1.ScaleMode = vbPixels
   Picture1.Move Me.ScaleWidth / 4, Me.ScaleHeight / 4, 200, 200
   hublot.ScaleMode = vbPixels
   Me.Move 0, 0, Screen.Width / 2, Screen.Height / 2
   hublot.Move 10, 10, 100, 100
   Set hublot.Container = Picture1
   hublot.BackColor = vbYellow
   Timer1.Interval = 50
   hRgn = CreateEllipticRgn(0, 0, hublot.ScaleWidth, hublot.ScaleHeight)
   SelectClipRgn hublot.hdc, hRgn
   DoEvents
   hublot.Line (0, 0)-(100, 100), vbWhite, BF
   DeleteObject hRgn
End Sub


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
0
dupille Messages postés 5 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 27 mars 2007
27 mars 2007 à 12:23
Merci à tous les deux

Renfield et jmfmarques

 c'est exactement ce que je voulais faire.

Bonne journée

Dupille
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 mars 2007 à 12:27
euh.... ben de rien ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous