Focus d'un contrôle Image

Résolu
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 15 mars 2012 à 08:04
Calade Messages postés 1207 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

19 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2012 à 09:03
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2012 à 15:05
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2012 à 05:37
Pas hyper propre, ça...
m'enfin, plus simple sûrement à coder

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2012 à 08:45
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
0

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

Posez votre question
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 mars 2012 à 08:51
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
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 mars 2012 à 09:13
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2012 à 09:18
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
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 mars 2012 à 09:22
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2012 à 09:25
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
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 mars 2012 à 09:36
Effectivement, Mea Culpa, j'ai parlé trop vite.

Calade
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 mars 2012 à 12:38
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2012 à 13:08
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
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 mars 2012 à 13:17
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
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 mars 2012 à 15:08
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2012 à 15:17
GDI+ travaille en Pixels, par default...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 mars 2012 à 15:22
Oui mais les largeurs et hauteur du contrôle recevant la vignette peuvent être passé en twips.


Calade
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2012 à 15:23
"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
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
18 mars 2012 à 14:24
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
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 mars 2012 à 07:06
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
0
Rejoignez-nous