Page 1 sur 2

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

Publié : lun. 07/sept./2015 13:21
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.

Re: ScreenFocus()

Publié : lun. 07/sept./2015 16:46
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

Re: ScreenFocus()

Publié : lun. 07/sept./2015 17:49
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.

Re: ScreenFocus()

Publié : lun. 07/sept./2015 18:11
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.

Re: ScreenFocus()

Publié : mar. 08/sept./2015 0:10
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)

Re: ScreenFocus()

Publié : mar. 08/sept./2015 0:19
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:

Re: ScreenFocus()

Publié : mar. 08/sept./2015 10:21
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'...

Re: ScreenFocus()

Publié : mar. 08/sept./2015 11:15
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.

Re: ScreenFocus()

Publié : mar. 08/sept./2015 14:08
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" ?

Re: ScreenFocus()

Publié : mar. 08/sept./2015 14:14
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)

Re: ScreenFocus()

Publié : mar. 08/sept./2015 15:40
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.

Re: ScreenFocus()

Publié : mar. 08/sept./2015 15:43
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.

Re: ScreenFocus()

Publié : mer. 09/sept./2015 0:02
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.

Re: ScreenFocus()

Publié : mer. 09/sept./2015 7:56
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 !.

Re: ScreenFocus()

Publié : mer. 09/sept./2015 17:24
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. :)