Page 1 sur 3

Inkey() et KeyboardInkey()

Publié : lun. 26/avr./2021 19:09
par jak64
Bonjour à toutes et tous,
Je souhaite utiliser l'équivalent de la fonction Inkey() ou KeyboardInkey() mais uniquement avec une fenêtre Windows.

1) Inkey() ne fonctionne qu'en mode Console
2) KeyboardInkey() exige d'avoir une fenêtre OpenScreen() ou OpenWindowScreen()

Or je ne veux avoir qu'une fenêtre OpenWindow()

Comment saisir un caractère à la volée dans ce cas ?

Merci pour votre aide.

Re: Inkey() et KeyboardInkey()

Publié : lun. 26/avr./2021 20:31
par Marc56
Bonsoir jak64,

Soit tu réaffecte tout le clavier avec AddKeyboardShortcut() le temps de la saisie.
Soit tu analyse la dernière lettre saisie dans un gadget à chaque changement (#PB_EventType_Change) sur un gadget.

:wink:

Re: Inkey() et KeyboardInkey()

Publié : lun. 26/avr./2021 20:37
par jak64
Bonjour marc56,
Merci de ta réponse, cela me confirme donc qu'il n'y a pas d'équivalent Inkey() pour une fenêtre Windows.
Je vais donc me rabattre en créant une fenêtre OpenWindowedScreen(), ce sera le plus simple pour ce que je veux faire.
Bonne soirée

Re: Inkey() et KeyboardInkey()

Publié : lun. 26/avr./2021 22:49
par Ollivier
@jak64

Marc56, que je salue est fatigué : soit ci, soit ça.

Ça manque d'une tonalité ouverte, laissant libre l'esprit de quêter.
T'as d'autres méthodes : Dans ce topic, j'avais publié une API Windows. En une seule fonction, t'as tout le clavier, les boutons de souris compris. C'était il y a 14 ans. Avec la fascination d'avoir cherché sans imaginer être surpris par Flype qui connaissait cette API avec 4 ans d'avance.

Si tu veux être multi-plateforme (Windows+Linux), tu peux aussi créer un canvas d'un pixel : il y a tous les états de touches disponibles en temps réel, ceux de la souris y compris, la molette y compris. Comme ton canvas fait un pixel, ça ne bouffe pas de ressources.

J'adore le "screen" mais si tu as commencé un projet avec la GUI du bureau, et que tu intègres un screen fenêtré uniquement pour ça, ça perdra le bon sens de Purebasic : faire des exécutables légers avec le moins possible de fichiers dépendants. Ça peut démotiver.

Tu prends la doc et tu trouves les extraits suivant :

Code : Tout sélectionner

#PB_EventType_Focus           : Le gadget a obtenu le focus clavier
  #PB_EventType_LostFocus       : Le gadget a perdu le focus clavier
  #PB_EventType_KeyDown(*)      : Une touche clavier a été pressée 
  #PB_EventType_KeyUp(*)        : Une touche clavier a été relâchée 
  #PB_EventType_Input(*)        : Du texte a été entré dans le gadget
KeyUp et KeyDown sont affiliés à un scancode clavier :

Code : Tout sélectionner

 - #PB_Canvas_Key  : Renvoie la touche du clavier qui a été enfoncée ou relâchée après un évènement #PB_EventType_KeyDown ou un évènement #PB_EventType_KeyUp et 
                      la valeur retournée est l'une des constantes #PB_Shortcut_ ... qui sont utilisées par la fonction AddKeyboardShortcut(). 
                      Note: Cet attribut renvoie la première touche pressée. 
                      Note: Pour obtenir un texte saisi au clavier dans le Canvasgadget, il est préférable d'utiliser l'évènement #PB_EventType_Input 
                            avec l'attribut #PB_Canvas_Input, car il permet la saisie de texte à partir d'une combinaison de plusieurs touches telles 
                            que la touche 'Shift' et autres touches muettes.
Conclusion : soit canvas_key pour un scancode clavier (tu veux capter une ou plusieurs touches spécifiques);
Soit canvas_input pour une saisie clavier : la touche A te renvoie un A etc...

@marc56

Désolé d'être casse-grelot.

Re: Inkey() et KeyboardInkey()

Publié : lun. 26/avr./2021 23:13
par jak64
Bonjour Olivier,
Merci pour ton message mais comme je ne pratique Purebasic que depuis quelques mois, je n'ai pas compris.
J'ai copié le code de ton topic dans l'éditeur de Purebasic et, quand je le lance, il m'affiche une grille et rien ne se passe si j'appuie sur une touche.
Merci de me guider.
Cordialement,

Re: Inkey() et KeyboardInkey()

Publié : lun. 26/avr./2021 23:16
par jak64
En fait, je voudrais détecter uniquement l'appui sur ces 4 touches :
m
q
Return
Esc

Re: Inkey() et KeyboardInkey()

Publié : lun. 26/avr./2021 23:55
par Ollivier
Regarde l'aide sur le canvas. J'ai mis le lien de la page. Le canvas est le plus souple et complet des objets de la GUI. Je me lève dans 4 heures donc je ne peux pas être productif maintenant...

Re: Inkey() et KeyboardInkey()

Publié : mar. 27/avr./2021 0:09
par cage
Bonsoir,

Code : Tout sélectionner

#WinApp=10

Enumeration Keys
  #KeyEnter
  #KeyM
  #KeyQ
  #KeyEscape
EndEnumeration

Flags = #PB_Window_TitleBar|#PB_Window_ScreenCentered|#PB_Window_SystemMenu

If OpenWindow(#WinApp, 100, 100, 500, 400, "Windows", Flags)
  CanvasGadget(0, 0, 0, 500, 400, #PB_Canvas_Keyboard)

  
  AddKeyboardShortcut(#WinApp, #PB_Shortcut_M     , #KeyM)
  AddKeyboardShortcut(#WinApp, #PB_Shortcut_Q     , #KeyQ)
  AddKeyboardShortcut(#WinApp, #PB_Shortcut_Return, #KeyEnter)
  AddKeyboardShortcut(#WinApp, #PB_Shortcut_Escape, #KeyEscape)

  Repeat
    Event = WaitWindowEvent(20)
    Select Event
      Case #PB_Event_Menu
        indexMenu = EventMenu()
        Select indexMenu
          Case #KeyM      : Debug "M"
          Case #KeyQ      : Debug "Q"
          Case #KeyEnter  : Debug "Entée"
          Case #KeyEscape : Debug "Escape"
        EndSelect
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
EndIf
Juste pour te faire une idée.
cage

Re: Inkey() et KeyboardInkey()

Publié : mar. 27/avr./2021 0:14
par jak64
Bonjour cage,
Merci beaucoup, c'est exactement ce que je souhaitais et je pense que c'est plus rapide que d'être obligé d'avoir une fenêtre screen avec un test KeyboardInkey() dans la boucle.

Re: Inkey() et KeyboardInkey()

Publié : mar. 27/avr./2021 8:33
par falsam
l'exemple de Cage fonctionne aussi sans l'utilisation du canvas ^^

Re: Inkey() et KeyboardInkey()

Publié : mar. 27/avr./2021 9:31
par jak64
Bonjour Falsam,
Effectivement, j'ai testé sans le canvas et ça fonctionne aussi.
merci.

Re: Inkey() et KeyboardInkey()

Publié : mar. 27/avr./2021 9:43
par jak64
Bonjour,
Petite question subsidiaire.
Comment définir ce qu'est un canvas ? Une zone de dessin ? l'équivalent d'une petite fenêtre ? une surface définie ? etc...
Autant je comprends ce que sont d'autres gadgets (bouton, zones de listes, calendrier, etc), autant j'ai du mal à appréhender "canvas".

La définition de l'aide Ce gadget offre une surface de dessin sans canal alpha et d'évènements pour la souris et le clavier dans le but de créer facilement des affichages personnalisées n'est pas très claire pour moi.

Merci de votre explication.

Re: Inkey() et KeyboardInkey()

Publié : mar. 27/avr./2021 10:00
par Marc56
Bonjour,

Le CanvasGadget est une surface de dessin qui peut-être interactive avec l'utilisateur en cours de programme, contrairement à l'ImageGadget où le contenu est créé uniquement par le programme.
Le Canvas a aussi beaucoup plus de fonctions, comme déterminer l'emplacement d'un clic de souris et le maintient enfoncé des boutons etc, là ou L'imageGadget ne peut déterminer que s'il est cliqué ou reçoit un élément par Drag-and-Drop.

L'exemple de la doc montre bien ce qu'on peut faire avec
https://www.purebasic.com/french/docume ... et.pb.html

:wink:

Re: Inkey() et KeyboardInkey()

Publié : mar. 27/avr./2021 10:08
par jak64
Merci Marc,
Je pense avoir compris, par exemple, je peux dessiner dans cette zone avec ma souris même lorsque le programme s'exécute. C'est le mot lui-même (canvas) qui me troublait. C'est une "zone de dessin interactive", cette définition est plus claire pour moi.

Re: Inkey() et KeyboardInkey()

Publié : mar. 27/avr./2021 10:37
par jak64
Bonjour,
Par contre, on ne peut pas utiliser de Sprites dans un canvas, c'est bien ça ?
Merci