|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre régulier
![]() Inscription : juillet 2010 Messages : 230 ![]() |
Bonjour à tous,
Le titre de mon post ne reflète pas complètement mon problème mais je n'ai pas trouvé mieux... J'ai une application qui utilise la bibliothèque ClgDiPlus développé par Arkham46. Cette application a tous ses formulaires personnalisés visuellement et lors de son utilisation la fenêtre Access n'est pas visible. (voir fichier joint) Les utilisateurs de l'application ont tous 2 écrans. Certains utilisateurs souhaitent que l'application s'ouvre à chaque fois sur le 2ème écran. Pour cela je voudrais utiliser un autre code qu'Arkham46 propose ICI. Il permet facilement de décider sur quel écran l'application doit s'ouvrir. Voici le code dans le module : Code :
Code :
Code :
Ce que j'aimerais faire c'est pouvoir décider de la position de mes formulaires sur le 2ème écran. L'API SetWindowPos est ce qui positionne le form mais dans mon cas je ne sais pas comment je peux essayer d'appliquer mes conditions (Reste à savoir si c'est possible). Je viens donc demander vos conseils Merci de m'avoir lu Cordialement Guillaume |
||||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Inscription : septembre 2003 Messages : 4 300 ![]() |
bjr,
si tu souhaites un centrage (?), on peut récupérer la taille du formulaire en pixels avec GetWindowRect par exemple, puis utiliser je pense le rcWork du moniteur qui doit correspondre à la zone de travail (c-à-d sans la barre des tâches) un savant calcul permet de trouver la bonne position pour un centrage j'ai écris la suite sans avoir de 2è écran, c'est à tester et adapater si besoin : Code :
__________________
Assistant de création/modification de rubans Office Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL Blog Office Mon Site DVP |
||
|
|
00
|
|
|
#3 | ||
|
Membre régulier
![]() Inscription : juillet 2010 Messages : 230 ![]() |
Bonjour Arkham46
Tout dabord merci pour ta réponse, je crois que tu étais le mieux placé pour le faire Je viens de tester ce que tu me propose. Tu as bien cerné mon besoin. Je souhaite en effet pouvoir centrer mes forms mais dans "l'espace de travail" donc sans la barre des taches. Ta proposition fonctionne très bien pour cela et je n'ai plus à me préocuper de choisir entre EXPRESSION.Move ou l'autre fonction. J'ai juste modifier le resultat final pour le top en rajoutant + 17. Les forms se collaient à la barre des taches. J'ai l'impression que GetWindowsRect prend en compte le bandeau même si il ne s'affiche pas. cela donne : Code :
Lorsque je test avec la valeur 1, les formulaires ne se centrent pas, c'est même le contraire ils sont complètement décalés. (les tests s'effectuent en 1024X768). Lorsque je test avec la valeur 2, les formulaires ne s'ouvrent pas sur le 2ème moniteur. Au niveau du positionnement, ils ont l'air de ce centrer en largeur mais pas en longueur. Le bas est en partie caché par la barre des tâches. Par contre cela n'a rien a voir avec le test en valeur 1 (décalage complet, en partie mordu par les coins droit et bas de l'écran.) Un autre test me fait constater que : Les formulaires se positionnent de la même facon avec 1 écran, PosFormOnMonitor Me, 2 et 2 écrans activés, PosFormOnMonitor Me, 1. Je précise que les utilisateurs de l'application sont pratiquement tous en résolution 1024x768. J'ai oublié l'idée de les amener vers une résolution plus grande. (les changements ne sont pas trop apprécié... ). Mes formulaires sont donc adapté pour tenir dans "l'espace de travail" c'est à dire entre le haut du bureau et la barre des taches (petite marge de 5 pixel de chaque coté, ils ne collent donc pas complètement les bords Haut, droite, gauche et la barre des taches)J'avoue qu'à ce niveau je suis perdu et je manque sérieusement de compétence pour espérer trouver l'origine du problème. Merci en tout cas pour ton aide. J'apprécie énormément. |
||
|
|
00
|
|
|
#4 | ||
![]() ![]() Inscription : septembre 2003 Messages : 4 300 ![]() |
j'ai dû oublier le décalage du moniteur :
Code :
tu devrais retrouver les positions et tailles des moniteurs et y voir plus clair
__________________
Assistant de création/modification de rubans Office Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL Blog Office Mon Site DVP |
||
|
|
00
|
|
|
#5 | ||||
|
Membre régulier
![]() Inscription : juillet 2010 Messages : 230 ![]() |
Ca y est tout est résolu !
Tes conseils ont été bénéfique ! J'ai mal étudié le comportement de la fonction et c'était logique que cela ne fonctionne pas. Voila ce que ça donne maintenant : Code :
![]() J'ai cependant 2 questions et peut être que tu auras une piste à me donner. Comment savoir si les 2 moniteurs sont activé avec l'API GetMonitorInfo? --> J'aimerais pouvoir proposer un formulaire avec choix (1er ou 2nd moniteur) si les 2 moniteurs sont activés sinon pas d'affichage du formulaire et donc forcément 1er moniteur par défaut. Il y a t-il possibilité d'avoir le rcmonitor du second écran ? --> Comme tu peux le voir dans la fonction je fais : Code :
|
||||
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : septembre 2003 Messages : 4 300 ![]() |
d'abord pour l'écran activé ou non, je ne sais pas...
sinon je crois que ça n'est pas bon... MonitorEnumProc est appelé pour chaque moniteur c'est pourquoi je décrémente dwData.MonitorNumber jusqu'à zéro si tu regardes bien l'exécution, tu verras que cette fonction est exécuté 2 fois si on demande le 2ème moniteur (et donc tu positionnes 2 fois ton formulaire) la première fois on décrémente dwData.MonitorNumber s'il tombe à zéro c'est qu'on a demandé le premier moniteur, sinon on continue et à l'exécution suivante on otient le positionnement du deuxième moniteur normalement tu n'a pas besoin de regarder le premier moniteur pour te positionner sur le second, le rcMonitor ou rcWork doit être correct pour chaque moniteur indépendamment de l'autre sinon on peut aussi regarder le lInfo.dwFlags qui doit valoir 1 pour le moniteur primaire et 0 pour le secondaire
__________________
Assistant de création/modification de rubans Office Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL Blog Office Mon Site DVP |
|
|
00
|
|
|
#7 | ||
![]() ![]() Inscription : septembre 2003 Messages : 4 300 ![]() |
je précise : je ne sais pas déterminer si un écran est allumé ou éteint
par contre on peut compter le nombre de moniteurs activés dans les paramètres d'affichage, même si ma méthode n'est pas des plus simple ça devrait marcher Ajouter la déclaration : Code :
Private Declare Function EnumDisplayMonitorsCount Lib "user32" Alias "EnumDisplayMonitors" (ByVal hdc As Long, ByRef lprcClip As Any, ByVal lpfnEnum As Long, dwData As Long) As Long Code :
__________________
Assistant de création/modification de rubans Office Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL Blog Office Mon Site DVP |
||
|
|
00
|
|
|
#8 | ||||
|
Membre régulier
![]() Inscription : juillet 2010 Messages : 230 ![]() |
Nickel pour la fonction CountMonitor() c'est exactement ce qu'il me faut. Encore une fois tu assures
Par contre je ne suis pas certain de comprendre quand tu dis : Citation:
mais c'est la ou je ne comprend pas car lorsqu'il execute ceci, la fonction se ferme puis on retourne à Code :
EnumDisplayMonitors ByVal 0&, ByVal 0&, AddressOf MonitorEnumProc, ldata Citation:
Code :
Je vois ce que j'ai fais et en effet je ne fais que décaler le postionnement du formulaire situé sur le 1er moniteur... |
||||
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : septembre 2003 Messages : 4 300 ![]() |
Je vais essayer d'être plus clair
:- EnumDisplayMonitors exécute MonitorEnumProc pour chaque écran tant qu'on donne la valeur 1 au retour de cette fonction MonitorEnumProc - je passe une structure en paramètre qui contient le formulaire et le numéro de l'écran recherché - ce numéro est décrémenté à chaque passage dans la fonction MonitorEnumProc - s'il tombe à zéro on est arrivé à l'écran recherché et on obtient alors les informations de cet écran avec GetMonitorInfo on doit donc mettre MonitorEnumProc à 1 pour continuer l'énumération, et à 0 pour l'arrêter une fois qu'on est passé sur l'écran désiré si la fonction CountMonitor te renvoie bien 2 quand il y a 2 écrans, c'est que ça marche en débug pas à pas, je ne garantis pas qu'on voit l'enchaînement des fonctions en effet MonitorEnumProc redonne la main à EnumDisplayMonitors qui est une fonction externe, donc pas forcément étonnant qu'on ne revienne pas à MonitorEnumProc pour un deuxième passage, le déboggueur est un peu perturbé essaye de mettre un point d'arrêt ou un Stop directement dans le code de la fonction MonitorEnumProc, ça devrait y rentrer 2 fois lorsque nécessaire pour ce qui est des rcMonitor et rcWork pour 2 écrans de 1024*768 tu devrais avoir quelque chose du genre : => Ecran n°1 rcMonitor.left = 0 rcMonitor.top = 0 rcMonitor.right = 1024 rcMonitor.bottom = 768 => Ecran n°2 rcMonitor.left = 1024 rcMonitor.top = 0 rcMonitor.right = 2048 rcMonitor.bottom = 768 je crois que le pixel en haut à gauche est 0,0 , et celui en bas à droite est exclu l'écran n°1 va en fait de 0 à 1023 et de 0 à 767 l'écran n°2 va de 1024 à 2047 et de 0 à 767 la taille de l'écran est donc : rcMonitor.right - rcMonitor.left rcMonitor.bottom - rcMonitor.top (il ne faut pas retirer 1 comme je l'ai fait dans un code au-dessus) même chose pour rcWork mais sans la barre des tâches, par exemple : => Ecran n°1 rcWork.left = 0 rcWork.top = 0 rcWork.right = 1024 rcWork.bottom = 745 => Ecran n°2 rcWork.left = 1024 rcWork.top = 0 rcWork.right = 2048 rcWork.bottom = 745 voilà, bon courage
__________________
Assistant de création/modification de rubans Office Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL Blog Office Mon Site DVP |
|
|
00
|
|
|
#10 |
|
Membre régulier
![]() Inscription : juillet 2010 Messages : 230 ![]() |
Merci beaucoup Arkham !!
Je suis en train de mettre à jours mes post "non résolu" et je vois que je ne t'avais pas répondu !! Tout fonctionne parfaitement.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com