Focus d'un contrôle Image [Résolu]

Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
- - Dernière réponse : Calade
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
- 19 mars 2012 à 07:06
Bonjour à tous,

Je travaille actuellement sur la refonte d'un contrôle Thumbs perso' (et destiné à un usage interne uniquement). Ce contrôle est destiné à afficher des vignettes de photos un peu comme Windows Explorer.

Mon ancien contrôle que je réécris totalement était composé d'un contrôle Picture contenant un certain nombre de Contrôles Image (celui du stock de VB6). Jusque là pas de problème et les évènements se produisent aussi sans problème.

Le nouveau contient aussi un contrôle Picture avec un certain nombre de contrôles Image (mais celui issu des MSForms).
L'affichage est sans problème mais l'évènement MouseDown a un problème avec le clic droit. Un essai de lancer un menu popup se passe très bien avec le clic gauche, mais il ne réagit pas avec le clic droit SAUF SI j'ai fait un clic classique (donc gauche) auparavant. Je précise que l'index correspond bien car il réagit au MouseMove.

Je précise que j'utilise le contrôle des MSForms pour 2 raisons. Il permet l'option SizeModeClip pour la propriété PictureMode chose que la propriété Stretch du contrôle natif ne fait pas. Et 2ème raison, il est à usage interne seulement.

Voilà, si quelqu'un à des idées...
Merci d'avance


Calade
Afficher la suite 

19 réponses

Meilleure réponse
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
3
Merci
Pas faux, ca "t'oblige" a savoir ou tu as mis tes vignettes...

enfin, j'imagine que c'est une bête grille, du coup, un peu de maths et hop ...

pour le dessin, dépend de ce que tu veux faire de ton IPicture...

voir le détail de IPicture.PaintPicture pour le Natif

BitBlt et consors (StrechBitBlt...) pour la version API

(ou GDI+, hein, pour du propre, moderne, etc.)

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 187 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
3
Merci
non non, c'est bien cela.

référence plutot que pointeur... on ne sais pas trop ce que cela manipule, mais ce n'est pas une adresse mémoire directe, attention aux abus de langages

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 187 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
3
Merci
Pas hyper propre, ça...
m'enfin, plus simple sûrement à coder

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 187 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
lié au msforms... ils fonctionne étrangement.
tu n'aura pas le droit de distribuer ton appli, les msForms te l'interdisent (usage interne, noté, m'enfin)

Pourquoi passer par un quelconque controle Image, de toute façon ?

VB sais très bien dessiner des images (portions, étirées, etc...)


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Salut Renfield,

et merci de ta réponse

VB sais très bien dessiner des images (portions, étirées, etc...)


Oui mais comment, par une API ou une fonction native (et si oui laquelle ?) et alors comment récupérer les évènements MouseMove and Co sauf à mémoriser les coordonnées de toutes mes vignettes !!!

Calade
Commenter la réponse de Calade
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Les maths pures ne sont pas mon fort.

La solution GDI+ est tentante pour les raisons que tu citent et en plus j'y gagnerais certainement en rapidité, mais m'obligerait à utiliser des contrôles Picture en lieu et place des Image pour avoir au minimum un hWnd (voire un hDC) à fournir.

Donc à revoir une bonne partie de mon code.

J'essaie et je te tiens au courant.


Calade
Commenter la réponse de Calade
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
des contrôles Picture en lieu et place des Image pour avoir au minimum un hWnd (voire un hDC) à fournir.


tu confonds... ce sont les image qui ne sont pas des fenetres

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Je parlais de Contrôle Image.

et la fonction GdipLoadImageFromFile() demande un hDC pour fonctionner.

mais j'ai peut-être fait un abus de langage, ou pas compris ce que tu voulais dire...

Calade
Commenter la réponse de Calade
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
GdipLoadImageFromFile requiert un hDc ?

euh, non, docteur, c'est surr que non
si tu fais allusion au second parametre, c'est l'image que tu récupères là...

enfin, un identifiant te permettant de manipuler ton image auprès de GDI+ qui la stocke.

la valeur retour avec GDI+ est toujours le status de l'opération

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Effectivement, Mea Culpa, j'ai parlé trop vite.

Calade
Commenter la réponse de Calade
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Désolé, mais j'ai encore une question,

Effectivement on récupère via la fonction GdipLoadImageFromFile un objet image.

Mais de quel "Image" s'agit-il.
Sauf erreur de ma part, le seul objet Image VB est le contrôle dont on parlait plus tôt.
et est-ce qu'un simple Set suffit ?

Merci pour tes eclaircissements.


Calade
Commenter la réponse de Calade
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
ce n'est pas un objet, généré là.
l'image en elle même est stockée et gérée par Gdi+

s'enservir avec des GdipDrawImage et autres fonctions associées

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Donc si je comprends bien "l'objet image" récupéré est en fait un pointeur que je réinjecte dans les fonctions GdipDrawImage et cie.

Où j'ai tout faux encore une fois ?

Calade
Commenter la réponse de Calade
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
J'ai fait un certain nombre d'essais avec GDI+, le problème qu'il me reste c'est la taille de la vignette affichée.
Elle est minuscule et je pense que cela vient d'un problème d'unités (un savant mélange entre les pixels et les twips), je continue et je te tiens au courant.

Merci encore pour tout.


Calade
Commenter la réponse de Calade
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
GDI+ travaille en Pixels, par default...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Oui mais les largeurs et hauteur du contrôle recevant la vignette peuvent être passé en twips.


Calade
Commenter la réponse de Calade
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
"peuvent" et c'est là le jeu ^^

soit tu mets ton ScaleMode en vbPixels

soit tu joues avec

ScaleX(X, ScaleMode, vbPixels)
ScaleY...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Salut Renfield,

Finalement, j'ai trouvé une autre solution, beaucoup plus simple à mon avis.
J'ai utilisé l'API mouse_event qui simule un click de souris.

Cela m'évite de faire des calculs à n'en plus finir et accessoirement à me plonger dans GDI+, je n'ai pas trop le temps en ce moment, mais c'est prévu pour plus tard.

Mais pourquoi Microsoft a pondu 2 contrôles images (le natif VB et celui des MSForms) à qui il manque à chacun des propriétés mais pas les mêmes bien sur ?

Calade
Commenter la réponse de Calade
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Pas hyper propre c'est sur...
Mais entre calculer la position et les dimensions de chacune des vignettes à la main, c'est effectivement nettement plus simple.

En tout cas merci de ton aide.


Calade
Commenter la réponse de Calade