PictureBoc et méthode graphique

PierreBlais Messages postés 4 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 6 août 2008 - 4 août 2008 à 16:59
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 6 août 2008 à 02:20
Hello,

Ceci est ma première intervention sur ces forums. Soyez indulgents.

Je peine depuis une semaine à comprendre une problématique.

Je résume brièvement:

On dit souvent que PictureBox est supérieur au contrôle Image, et je n'en doute pas. Je préférerais PictureBox parce que je pourrais charger dedans des icones en run time et que la grosseur du contrôle s'ajusterait.

Pour les besoins de mon applic, j'ai besoin de dessiner une ligne (qui en mode en run time sera dessinée segment par segment) qui puisse passer PAR-DESSUS une image,de manière à déterminer si la ligne intercepte l'image (en regardant la couleur du pixel), et non par-DESSOUS.

Lorsque j'utilise des contrôle PictureBox, la ligne passe par-dessous.
Lorsque j'utilise des contrôle Image, la ligne passe par-dessus, comme je le souhaite

Très facile à vérifier :

1) Créez un Form1
2) Mettez-y un bouton, un contrôle PictureBox et un contrôle Image
3) Collez ce code dans le Command1_Click()

Picture1.Top = 1000


Picture1.Left = 1000
 
Image1.Top = 2000
Image1.Left = 2000
 
Line (0, 0)-(ScaleWidth, ScaleHeight), RGB(0, 0, 255

)

Démarrez et cliquez sur le bouton. Vouz voyez ce que je veux dire ? Il m'est absolument essentiel que la ligne puisse passer PAR-DESSUS le PictureBox, comme elle le fait pour le Image. Comment faire ? Y a-t-il une propriété de la PictureBox que je pourais utiliser?

Des idées, solutions, commentaires, bêtises ?

Merci à l'avance

9 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
4 août 2008 à 17:05
Bon,jour,

En dessinant lma ligne sur ta form, elle passera bien évidemment en dessous du contrôle PictureBox.

Il te faut la dessiner dans ta picturebox

ta_picturebox.line ... (et la suite)...
0
bonjourcheval Messages postés 228 Date d'inscription mercredi 13 décembre 2000 Statut Membre Dernière intervention 8 août 2011
4 août 2008 à 19:14
Ou bien si la ligne à la propriété ZOrder, met la propriété à 0
0
PierreBlais Messages postés 4 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 6 août 2008
4 août 2008 à 20:02
Bon, effectivement, je me doutais que mon exemple très minimaliste allait amener des propositions intéressantes mais qui ne répondent pas à mon besoin. C'est souvent ce qui arrive quand on réduit trop un exemple.


Pourquoi la ligne passe-t-elle SOUS le contrôle PictureBox alors qu'elle passe SUR le contrôle Image ? 

Alors je résume un peu plus.

Non, la ligne ne peut être tracée DANS la PictureBox, mais bien dans son conteneur, qui est lui-même un gros PictureBox.

Et non, je ne désire pas savoir quand il y a une intersection entre les BORDS de la PictureBox et la ligne.

Dans les faits, il y a plusieurs PictureBox (présentement des contrôle Image, parce que je n'arrive pas à faire ce que je veux avec le PictureBox).

Imaginons que les PictureBox sont des objets, étoiles, vaisseaux, etc.

La ligne est dans les faits dessinée en run time en obéissant à la gravitation, inertie, accélération, etc.

Les PictureBox sont placées à l'exécution, et leur image est chargée aussi à l'exécution, d'où l'avantage de pouvoir travailler avec PictureBox.

À chaque déplacement de la ligne, je fais un Point pour détecter la couleur du pixel, ce qui m'indique si la ligne a touché un objec, ce qui n'a pas vraiment de lien avec le bord de la Picture Box.

Et présentement, le problème si j'utilise PictureBox au lieu de Image, la ligne passe derrière la PictureBox, donc ne prend pas la couleur du pixel de la PictureBox main bien du pixel dessous, alors la ligne ne frappe rien.

Voilà, c'est plus clair ainsi ?
0
PierreBlais Messages postés 4 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 6 août 2008
4 août 2008 à 20:04
ce n'est pas une ligne contrôle avec des priorités, mais bien une méthode graphique dessinée à l'exécution.


 
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
4 août 2008 à 22:23
Bon,

l'équation d'une droite est de type y = ax + b

a est le coefficient angulaire
x et y sont les coordonnées de chaque point de la droite

que la droite soit alors visible ou non à lécran et qu'elle passe au dessus ou au dessous d'un contrôle, elle sera toujours composée d'une successions de points dont l'ordonnée y pourra toujours être calculée en fonction de l'abscisse x ...

une picturebox (comme tout autre contrôle) est également positionnée (ses propriétés top et Left) par rapport au coin supérieur gauche de son container.
Dès lors (soustractions et additions) tu peux calculer les coordonnées relatives en fonctions des coordonnées réelles (et donc relever le pixel y correspondant).

Ce n'est là que de l'algèbre, beaucoup plus que du code VB !
Commence par l'algorithme nécessaire...(indépendant de tout code de développement) .... on t'aidera à le transposer en code si vraiment nécessaire.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
4 août 2008 à 23:20
salut,

une LINE, SHAPE, IMAGE (tout comme picture1.Line....) sont des faux contrôles (on va dire)
ils n'ont pas de handle et sont dessinés sur le parent

l'image est dessinée sur le fond, tout comme la LINE, pas la picturebox qui elle est plus concrète
pareil avec un label par exemple

cela dit dans ce genre de "jeu graphique", il est préférable de tout dessiner (y compris les images) et non d'ajouter autant de contrôles que de... missiles

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 août 2008 à 09:09
complément a ce qu'a dit PCPT

Shape, Line, Image et Label sont des controles "WindowLess" ("Sans fenetre")
Ils sont simplement dessinés sur le conteneur.

=> gain en ressources (Windows était plus limité en nombre de handle qu'il peut allouer)

du coup, les "vrais" contrôles qui utilisent des fenêtres (Bouton, textbox, zones de liste, PictureBox, etc.) seront forcément au dessus des contrôles WindowLess

et les dessins effectués via le code, sur la form, directement, passerons par dessus (puisque dessinés après) ces faux contrôles.
0
PierreBlais Messages postés 4 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 6 août 2008
6 août 2008 à 02:14
Excellent ! Merci pour vos remarques. Je réalise maintenant la différence du contrôle PictureBox avec les autres objets dessinés.


PCPT, tu dis "préférable de tout dessiner". Je suppose que tu fais référence à un truc comme "PaintPicture" ? Oui, c'est une solution. Mais je préfère encore le contrôle Image, parce que lorsque touché par la trajectoire du missile, je n'ai qu'à virer Image(i).visible à False et l'objet disparait.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 août 2008 à 02:20
je pensais plus à différentes API mais çà se tient
0
Rejoignez-nous