ScreenFocus() : Souris sur ou en dehors d'OpenWindowedScreen

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

ScreenFocus() : Souris sur ou en dehors d'OpenWindowedScreen

Message par falsam »

[PB 4.31] Sans API. - Testé sous Windows 10

Lorsque vous codez une application 2D ou 3D utilisant un OpenWindowedScreen() et des gadgets conjointement avec un ExamineMouse(), le curseur de la souris est captif dans l'OpenWindowedScreen ce qui oblige l'utilisateur de votre application à utiliser la combinaison de touche Alt + Tab pour accéder aux gadgets ce qui, vous en conviendrez, n'est pas pratique du tout.

J'avais un bout de code que j'ai déja présenté sur ce forum mais qui finalement n'a pas bien fonctionné avec un de mes projets.

Après quelques heures de différents tests avec Gally et Crisot sur FreeChat, nous avons sortis une procédure qui permet de palier à ce que je viens de dire.

Il y a sur ce forum quelques codes qui font la même chose que notre code. Nous avons souhaités quand même vous présenter une solution au gout du jour et sans API. J’espère qu'il vous sera utile.

Code : Tout sélectionner

Procedure ScreenFocus(Window, Left, Top, RightOffset, BottomOffset)
  If IsScreenActive()
    Protected X = WindowMouseX(Window) 
    Protected Y = WindowMouseY(Window)
    Protected Value.b = Bool(X>Left And Y>Top And X<WindowWidth(Window)-RightOffset-1 And Y<WindowHeight(Window)-BottomOffset-1)
  
    ReleaseMouse(1 - Value)
    MouseLocate(X-Left, Y-Top)
  
    ProcedureReturn Value
  EndIf 
EndProcedure
je vous propose un code exemple récapitulatif que vous trouverez dans ce fichier compressé qui va vous permettre avec la souris de sélectionner un point 3D et de créer un cube avec la touche Espace qui se placera sur ce point. L'identification de l'entité sera affiché dans un gadget.

Si vous avez un souci d'éxécution sous windows 8 ou 10 (lié à DirectX), Selectionner le menu Compilateur - > Option du compilateur :Ligne Bibliothéque sous-Systéme : Tapez OpenGl

:arrow: http://s242132022.onlinehome.fr/Downloa ... nfocus.zip

Cette procédure fonctionne aussi dans un environnement 2D.
Dernière modification par falsam le mer. 09/sept./2015 8:55, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ScreenFocus()

Message par Ollivier »

Bonjour Falsam,

voici un code en version 4.10 qui peut t'intéresser.
Il n'est pas multi-plateforme par contre.

ici
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ScreenFocus()

Message par falsam »

@Ollivier: Merci pour ton lien mais datant de 2008 il ne fonctionne plus avec la version 5.30 de PB et franchement je n'ai pas envie de parcourir 780 lignes de code pour chercher la façon dont tu gères la souris.

Je préfère la méthode code minimaliste et fonctionnel qui va à l'essentiel. Je connais ta réponse
Ollivier a écrit :Franchement Falsam, tu couines un peu là...
Et même plus si affinité !! snippet est un de mes maître mots en dev. Aller droit à l'essentiel.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ScreenFocus()

Message par Ollivier »

@Falsam

J'ai dit "un peu" et "là". "Là", ce n'est pas ici. Et tout cela est loin d'être maintenant...

Je vais être sincère. C'est pour ton "bien".
Je m'explique. J'observe que tu creuses les versions. Ce qui est bien, car tu te retrouves avec des codes d'antan (j'exagère un peu, mais le temps passe incroyablement...).

Si c'est inutile, a priori, de déterrer mon vieux code, c'est très utile de trouver les détails qui le mettent à jour. Je ne suis pas méchant: il est "simplement" ajournable (déjà il y a un 16 à remplacer par #PB_Event_CloseWindow).

Ainsi, tu verras aussi les quelques codes de Kelebrindae de l'époque, qui n'ont rien à voir avec la souris mais qui, vraiment méritent le coup d'oeil (si tu ne l'as pas déjà fait).

Je dois avouer qu'il est vrai que Spock te chambre un peu sur le nombre d'heures. C'est vrai que c'est un peu injuste, parce que c'est une remarque humaine, pas une vantardise de performance.

Cependant, c'est ton sujet. Pense qu'avec le temps, tu peux faire la demande de suppression de tel ou tel message qui se désaccorde de la logique que tu souhaites exprimer et échanger. Si son code est un dupplicata, cela ne pose pas de problème.

Peut-être aussi qu'il souhaite te faire la remarque sur l'origine d'une info. Mais peut-être est-ce une coïncidence. En algorithmie, la logique est stricte par excellence, donc, en groupe, il est très impressionnant de constater que fréquemment, deux algos se ressemblent, alors que deux auteurs y ont travaillé en double aveugle, c'est-à-dire complètement indépendamment.

C'est au point tel que sans ta réponse à Spock, je n'avais même pas tilté qu'il pouvait sous-entendre quoique ce soit (vous auriez copié, etc...).

Je crois que pour la souris partagée, il n'y a qu'une à deux méthodes multi-plateforme, pas plus. C'est trop spécifique.

A]
Si j'utilise ReleaseMouse() dans le code, il faudra l'utiliser. ExamineMouse() coupe la souris et la prend pour soi, c'est l'effecteur principal: recenser l'état de la souris quand elle est sur l'écran fenêtré.

B]
Pour détecter une sortie hors d'écran, c'est qqch comme:
MouseX() + MouseDeltaX() qui n'est plus dans le domaine de la largeur de l'écran fenêtré.
Et pareil pour les 'y' à tester.

@Spock

C'est d'ailleurs aussi pour ça que je rechigne le ContainerGadget() alloué au screen : comment tu fais pour déterminer exactement les dimensions de l'écran en natif?

@Falsam

C]
Une fois sorti de l'écran fenêtré, il ne faut plus recenser avec ExamineMouse() sinon curseur invisible

D] Comment redétecter une venue à l'écran?
DesktopMouseX() (et Y) pour tester si elle est dans le rectangle à l'écran.

Comment calculer ce rectangle? Les largeurs/hauteurs sont connues. Reste le point 0;0 de l'écran, sa position au sein du bureau est inconnue donc
WindowX(numFenetre,#InnerCoord)
et le tour est joué!!!!

Le cycle [A][C][D] est réalisable, exécutable, stable et en natif!

Bonne discute à vous! Si questions, n'hésitez point.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ScreenFocus()

Message par Ollivier »

@Falsam

Ce sujet traite du problème. Je ne sais pas s'il faut l'ajourner.

How to manage WindowedScreen+GUI Gadgets together (NetMaestro)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ScreenFocus()

Message par falsam »

Ollivier a écrit :Ce sujet traite du problème.
Quel problème ? Je n'ai pas de souci avec le code que je propose dans mon premier message.

Je partage et ce n'est pas plus que ça. Merci pour ce lien qui me montre une façon de faire similaire au code que je montre :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ScreenFocus()

Message par Ollivier »

Tu dis quelquechose...
Falsam a écrit :La solution est Alt + Tab pour en sortir ce qui vous en conviendrez n'est pas pratique du
tout.
... puis son contraire...
Falsam a écrit :Quel problème ? Je n'ai pas de souci avec le code que je propose dans mon premier message.
Je me demande où se trouve cette foutue étiquette dans mon dos où il y a marqué 'jambon'...
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ScreenFocus()

Message par falsam »

Hello Ollivier. C'est parce que, je suis parti du constat que ce n'était pas pratique de sortir de ce screen que j'ai proposé ce code. Je n'avais aucune question à ce sujet.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ScreenFocus()

Message par Ollivier »

C'est le " Terminé le Alt-Tab. " qui me pose problème. Ça ne serait pas plutôt "terminé les problèmes avec Alt+Tab" ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ScreenFocus()

Message par falsam »

Ollivier a écrit :C'est le " Terminé le Alt-Tab. " qui me pose problème. Ça ne serait pas plutôt "terminé les problèmes avec Alt+Tab" ?
Ha ha ha, oui tu as raison et je vais effectuer les corrections nécessaires à une bonne compréhension du sujet. (Je vais t'éviter un smiley)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ScreenFocus()

Message par Ollivier »

Intéressant, votre discussion. C'est un focus sur écran video fenêtré.

Si le WindowMouseX() ne parasite rien, c'est une bonne solution aussi.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ScreenFocus()

Message par falsam »

Ollivier a écrit :Intéressant, votre discussion. C'est un focus sur écran video fenêtré.
Yeahhhhhh Olivier a vu LA différence. I'am very happy. :wink:

PS: Spock s'il ne plait ne répond pas, ça va gacher le plaisir.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ScreenFocus()

Message par Ollivier »

@Falsam

Je te prie de m'excuser: je me suis fié au titre.
Je pensais que vous cherchiez une solution souple, pour basculer du fenêtré au plein écran et vice-versa.

Dans le plein écran, on se passe de la queue d'événement de la GUI de l'OS. C'est donc plus rapide, mais le mode fenêtré permet des traitements de données simultanés et conventionnels (bureau).

C'est donc bien de prévoir une fonction qui se passe d'être ou non apparentée à une fenêtre, à moins, bien sûr de rééditer une boucle principale propre à l'interface plein écran.

A part cela, je souhaite, si possible, que tu m'informes des causes de ce qui a été effacé à la place de ce message-ci (et plus loin, puisqu'il y avait plusieurs messages), parce que je n'ai pas bien suivi, et je n'ai pas compris du tout.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ScreenFocus()

Message par falsam »

Ollivier a écrit :Je te prie de m'excuser: je me suis fié au titre.
Tu n'as pas à t'excuser, le titre est trop vague ainsi que les explications d'ailleurs.
Ollivier a écrit : le mode fenêtré permet des traitements de données simultanés et conventionnels (bureau)
Voila une bonne explication que je vais rajouter dans mon premier message. Il résume bien l'objectif de la procédure ScreenFocus() qui d'ailleurs aurait pu s'appeler IsScreenFocus().
Ollivier a écrit :je souhaite, si possible, que tu m'informes des causes de ce qui a été effacé à la place de ce message-ci
Je vais être factuel :
- Tu as pu lire des messages d'élans affectifs entre Spock et moi-même.
- Ni moi ni Spock avons posté ces messages.
- Les comptes utilisateurs ne posent pas de problème de sécurité.
- Par contre l'équipe de modération peut poster des messages en ton nom. (Normal ? pas normal ?)

Tu l'auras compris: C'était une mauvaise blague d'un membre de l'équipe de modération que je n'ai pas appréciée !.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: ScreenFocus()

Message par G-Rom »

falsam a écrit :Tu l'auras compris: C'était une mauvaise blague d'un membre de l'équipe de modération que je n'ai pas appréciée !.
Ca va... fait pas ta mijaurée , j'ai trouvé une fonction de modération & je l'ai testé sur toi :mrgreen: , d'ailleurs je n'ai toujours pas trouvé la fonction pour retiré les post-it inutile , je voulais faire un petit coup de propre ici. :)
Répondre