Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Un clavier cliquable | |
| | Auteur | Message |
---|
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Un clavier cliquable Jeu 4 Juin 2015 - 19:32 | |
| Voici une petite réalisation que je viens de faire... Les touches sont cliquables et il est même possible de les nommés (a,b,c, etc...) comme un vrai clavier par CAPTION. En plus grâce a PANEL le CAPTION est automatiquement centré. Le défi c'était de faire un clavier en quelques ligne pour intégré dans une SUB. Il ne reste plus qu'a faire la nomenclature (je ne sais pas si ca se dit comme ça !) Et on aura un clavier complet. PS : je n'ai pas rajouté les chiffres mais on peut aussi le faire simplement. Aller trêve de Blabla, voila le résultat : - Code:
-
DIM a% , b% , c% , n% , x% , y% , t$ : ' Quelques variables..
DATA 1,17,8 , 5,17,8 , 9,17,8 , 13,17,8 , 30,25,15 , 34,25,8 , 46,17,24 , 50,25,8 : ' Un peu de datas ! DATA 64,25,8 , 76,34,42 , 81,103,86 , 82,23,6 , 83,23,6 , 84,23,6 , 85,23,14 , 0
DATA "éch",F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12 , imp,ver,pau DATA " ",1,2,3,4,5,6,7,8,9,0,"°","+",ret , ins,ori,"p-" DATA tab,A,Z,E,R,T,Y,U,I,O,P," "," ",sup,fin,"p+" DATA vmaj,Q,S,D,F,G,H,J,K,L,M,"%","ù",ent DATA maj,">",W,X,C,V,B,N,"?",".","/","§",maj," " DATA ctr,win,alt,espace,agr,win,men,ctr," "," "," "
LABEL clic
HIDE 0 : WIDTH 0,337 : HEIGHT 0,160 : BORDER_SMALL 0
x%=8 : y%=10 : n%=1 : READ a% : ' On initialise un peu tout ca...
REPEAT : ' Une petite boucle pour la route
PANEL n% : PARENT n%,0 : FONT_NAME n%,"Arial" : FONT_SIZE n%,6 : ON_CLICK n%,clic : ' Et hop !
IF a%=n% : READ b% : READ c% : READ a% : ELSE : b%=17 : c%=0 : END_IF
LEFT n%,x% : TOP n%,y% : WIDTH n%,b% : HEIGHT n%,17 : x%=x%+17+c% : ' Et hop !
IF n%=16 : y%=y%+5 : END_IF IF n%=16 OR n%=33 OR n%=49 OR n%=63 OR n%=77 : x%=8 : y%=y%+17 : END_IF
n%=n%+1 : ' Et hop hop hop !!!
UNTIL n%=89
TOP 63,TOP(63)-17 : HEIGHT 63,HEIGHT(63)+17 : ' Il ne reste plus qu'a agrandir le touche ENTER FOR n%=1 TO 88 : READ t$ : CAPTION n%,t$ : NEXT n% SHOW 0 : END
clic: CAPTION 0,"Clic sur le panel "+STR$(NUMBER_CLICK) RETURN ' Le tour est joué ... ou plutot le clavier est rtéalisé ! ;)
Dernière édition par Minibug le Jeu 4 Juin 2015 - 23:21, édité 1 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un clavier cliquable Jeu 4 Juin 2015 - 21:41 | |
| Bravo, en si peu de ligne, c'est un exploit. Après, je pense que pour afficher les symboles dans les touches, ça demande un peu plus de lignes: des data pour les codes normaux, d'autres pour quand on est en majuscules, d'autres pour quand on est en verr. num et les derniers pour quand on appuie sur alt gr. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un clavier cliquable Jeu 4 Juin 2015 - 23:23 | |
| Je viens de rajouter quelques lignes de DATAs pour le premier jet de la 'nomenclature'. Ça ne gère pas encore Minuscules et Majuscules, mais c'est un début... La suite au prochain épisode... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un clavier cliquable Ven 5 Juin 2015 - 8:20 | |
| Bravo, c'est déjà vachement plus complet avec les lettres et les noms des touches. Tu as aussi à trouver une astuce pour dessiner les flèches de direction (Changer la police de caractères par exemple) En tout cas, le principe est là. Bonne continuation | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Un clavier cliquable Ven 5 Juin 2015 - 9:29 | |
| Bravo Minibug, Ce qui me plait dans ton code, c'est la façon dont les touches du clavier sont dimensionnées (Width et Height): De manière automatique avec les DATA et grâce aux Panels, il fallait y penser. J'apprends... A+ | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un clavier cliquable Ven 5 Juin 2015 - 12:03 | |
| Bonjour a tous ! @Jean Claude : Merci et content que ca te convienne. Comme je l'ai dis plus haut, je voulais un code léger pour une SUB. Maintenant je vais travailler sur la nomenclature des touches MAJ et min, ainsi que les voyants VERROU MAJ et ARRET DEF... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un clavier cliquable Ven 5 Juin 2015 - 13:15 | |
| Tu pourra utiliser de petites LEDs dans le Panel pour l'état des touches, si tu veux. Eteinte => inactif / Alumée => actif | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un clavier cliquable Ven 5 Juin 2015 - 21:46 | |
| Bonsoir Jicehel ! Pour les leds, c'est prévu ! t'inquiétes pas. Le plus dur c'est de coller aux leds du clavier. Si on y regarde de près la commande SCANCODE capte l'appuie sur la touche VERROU MAJ, mais au démarrage du programme je n'ai aucune possibilité de savoir si c'est activé ou non !! J'ai cherché sur internet mais rien pour l'instant. Il faudrait que je recherche sur le forum, voir comment Klaus et les autres avait réalisés leurs claviers virtuel. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un clavier cliquable Sam 6 Juin 2015 - 12:10 | |
| Bonjour à tous, - Minibug a écrit:
- Le plus dur c'est de coller aux leds du clavier.
Bin, maintenant, ça va être moins dur - Code:
-
' Panoramic 0.9.25
' ============================================================== ' = Title : LEDs clavier ' = ' = Author : Silverman ' = ' = Date : Juin 2015 ' = ' = Version: 1.0 ' ============================================================== ' Comments : Controler les LEDs du clacier ' ==============================================================
' Fonction "keybd_event": ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms646304%28v=vs.85%29.aspx
' Virtual-Key Codes: ' https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx
dim null,result% dim OldScroll%,OldNum%,OldCaps%,key%,c dim memblock1%,memblock1$ dim memblock2%,memblock2$
' récupère l'état des LEDs GetNumLock() OldNum% = result%
GetCapsLock() OldCaps% = result%
GetScrollLock() OldScroll% = result%
' éteindre les LEDs for key%=1 to 255 SetkeyState(key%,0) next key%
' mais On aurais pu les éteindre aussi comme ça: SetScrollLock(0):SetNumLock(0):SetCapsLock(0)
c = 0 repeat cls Print "Regardez les LEDs du clavier." print "Appuyez la barre d'espace pour terminer." print
Select c case 0 SetNumLock(0) SetCapsLock(0) setScrollLock(0) case 1 SetNumLock(1)
case 2 SetCapsLock(1)
case 3 SetScrollLock(1) end_select
' on affiche une info for key%=1 to 255 GetKeyState(key%) if result%>0 print "Virtual-Key Codes = "+"0x"+hex$(key%) end_if next key%
c = c + 1 if c > 3 then c = 0 wait 500
until scancode=32
' remettre les LEDs dans leur état initial SetScrollLock(OldScroll%) SetNumLock(OldNum%) SetCapsLock(OldCaps%) print print "Fini!"
END ' ****************************************************************************** sub GetPlatform() result% = 0 dll_on "kernel32.dll" result% = dll_call0("GetVersion") dll_off end_sub
sub GetKeyState(key%) result% = 0 memblock2$=string$(256,chr$(0)) GET_BUFFER_PTR(adr(memblock2%) , adr(memblock2$)) dll_on "user32" null=dll_call1("GetKeyboardState",memblock2%) READ_BUFFER_BYTE(adr(result%),memblock2%,key%) dll_off end_sub
sub SetKeyState(key%,turnon%) dim_local null
' Windows 2000 / XP GetPlatform() if result% > 0 GetKeyState(key%) if result% <> turnon% dll_on "user32.dll" null=dll_call4("keybd_event",key%,0,1,0) null=dll_call4("keybd_event",key%,0,3,0) dll_off end_if else ' Windows 98,ME dll_on "user32.dll" memblock1$=string$(256,chr$(0)) GET_BUFFER_PTR(adr(memblock1%) , adr(memblock1$)) null=dll_call1("GetKeyboardState",memblock1%) WRITE_BUFFER_BYTE(memblock1%,key%,turnon%) null=dll_call1("SetKeyboardState",memblock1%) dll_off end_if end_sub
sub SetScrollLock(turnon%) SetKeyState(145,turnon%) end_sub
sub GetScrollLock() result% = 0 GetKeyState(145) end_sub
sub SetCapsLock(turnon%) SetKEyState(20,turnon%) end_sub
sub GetCapsLock() result% = 0 GetKeyState(20) end_sub
sub SetNumLock(turnon%) SetKeyState(144,turnon%) end_sub
sub GetNumLock() result% = 0 GetKeyState(144) end_sub
' ' ############################################################################## ' # # ' # Bibliothèque de SUBs pour gérer des mémoires tampons V1.0 # ' # # ' ############################################################################## sub READ_BUFFER_BYTE(adr_destination%,adr_source%,buffer_position%) ' BYTE = OCTET(en français) ' adr_destination% = adresse destination ' adr_source% = adresse adr_source ' copie un BYTE, 0 < BYTE < 255 poke adr_destination%,peek(adr_source% + buffer_position%) end_sub
sub READ_BUFFER_WORD(adr_destination%,adr_source%,buffer_position%) ' WORD = 2 BYTEs ' adr_destination% = adresse destination ' adr_source% = adresse adr_source ' copie un WORD, 0 < WORD < 65535 poke adr_destination%,peek(adr_source%+buffer_position%) poke adr_destination%+1,peek(adr_source%+1+buffer_position%) end_sub
sub READ_BUFFER_DWORD(adr_destination%,adr_source%,buffer_position%) ' DWORD = 4 BYTEs ' adr_destination% = adresse destination ' adr_source% = adresse adr_source ' copie un DWORD, 0 < DWORD < 4294967295 poke adr_destination%,peek(adr_source%+buffer_position%) poke adr_destination%+1,peek(adr_source%+1+buffer_position%) poke adr_destination%+2,peek(adr_source%+2+buffer_position%) poke adr_destination%+3,peek(adr_source%+3+buffer_position%) end_sub
sub READ_BUFFER_LONG(adr_destination%,adr_source%,buffer_position%) ' LONG = 4 BYTEs ' adr_destination% = adresse destination ' adr_source% = adresse adr_source ' copie un LONG, –2147483648 < LONG < 2147483647 poke adr_destination%,peek(adr_source%+buffer_position%) poke adr_destination%+1,peek(adr_source%+1+buffer_position%) poke adr_destination%+2,peek(adr_source%+2+buffer_position%) poke adr_destination%+3,peek(adr_source%+3+buffer_position%) end_sub
sub READ_BUFFER_INT(adr_destination%,adr_source%,buffer_position%) ' INT = 4 BYTEs ' adr_destination% = adresse destination ' adr_source% = adresse adr_source ' copie un INTeger, –2147483648 < INT < 2147483647 poke adr_destination%,peek(adr_source%+buffer_position%) poke adr_destination%+1,peek(adr_source%+1+buffer_position%) poke adr_destination%+2,peek(adr_source%+2+buffer_position%) poke adr_destination%+3,peek(adr_source%+3+buffer_position%) end_sub
sub READ_BUFFER_FLOAT(adr_destination%,adr_source%,buffer_position%) ' FLOAT = 8 BYTEs ' adr_destination% = adresse destination ' adr_source% = adresse adr_source ' copie un FLOAT, -1,7976931348623157×10^308 < FLOAT < 1,7976931348623157×10^308 poke adr_destination%,peek(adr_source%+buffer_position%) poke adr_destination%+1,peek(adr_source%+1+buffer_position%) poke adr_destination%+2,peek(adr_source%+2+buffer_position%) poke adr_destination%+3,peek(adr_source%+3+buffer_position%) poke adr_destination%+4,peek(adr_source%+4+buffer_position%) poke adr_destination%+5,peek(adr_source%+5+buffer_position%) poke adr_destination%+6,peek(adr_source%+6+buffer_position%) poke adr_destination%+7,peek(adr_source%+7+buffer_position%) end_sub
'############################################################################### sub WRITE_BUFFER_BYTE(adr_destination%,buffer_position%,byte%) ' BYTE = OCTET(en français) ' adr_destination% = adresse destination ' byte% = 0 < BYTE < 255 poke adr_destination%+buffer_position%,peek(adr(byte%)) end_sub
sub WRITE_BUFFER_WORD(adr_destination%,buffer_position%,word%) ' WORD = 2 BYTEs ' adr_destination% = adresse destination ' word% = 0 < WORD < 65535 poke adr_destination%+buffer_position%,peek(adr(word%)) poke adr_destination%+1+buffer_position%,peek(adr(word%)+1) end_sub
sub WRITE_BUFFER_DWORD(adr_destination%,buffer_position%,dword%) ' DWORD = 4 BYTEs ' adr_destination% = adresse destination ' dword% = 0 < DWORD < 4294967295 poke adr_destination%+buffer_position%,peek(adr(dword%)) poke adr_destination%+1+buffer_position%,peek(adr(dword%)+1) poke adr_destination%+2+buffer_position%,peek(adr(dword%)+2) poke adr_destination%+3+buffer_position%,peek(adr(dword%)+3) end_sub
sub WRITE_BUFFER_LONG(adr_destination%,buffer_position%,long%) ' LONG = 4 BYTEs ' adr_destination% = adresse destination ' long% = –2147483648 < LONG < 2147483647 poke adr_destination%+buffer_position%,peek(adr(long%)) poke adr_destination%+1+buffer_position%,peek(adr(long%)+1) poke adr_destination%+2+buffer_position%,peek(adr(long%)+2) poke adr_destination%+3+buffer_position%,peek(adr(long%)+3) end_sub
sub WRITE_BUFFER_INT(adr_destination%,buffer_position%,long%) ' INT = 4 BYTEs ' adr_destination% = adresse destination ' int% = –2147483648 < INT < 2147483647 poke adr_destination%+buffer_position%,peek(adr(long%)) poke adr_destination%+1+buffer_position%,peek(adr(long%)+1) poke adr_destination%+2+buffer_position%,peek(adr(long%)+2) poke adr_destination%+3+buffer_position%,peek(adr(long%)+3) end_sub
sub WRITE_BUFFER_FLOAT(adr_destination%,buffer_position%,float) ' FLOAT = 8 BYTEs ' adr_destination% = adresse destination ' float = -1,7976931348623157×10^308 < FLOAT < 1,7976931348623157×10^308 poke adr_destination%+buffer_position%,peek(adr(float)) poke adr_destination%+1+buffer_position%,peek(adr(float)+1) poke adr_destination%+2+buffer_position%,peek(adr(float)+2) poke adr_destination%+3+buffer_position%,peek(adr(float)+3) poke adr_destination%+4+buffer_position%,peek(adr(float)+4) poke adr_destination%+5+buffer_position%,peek(adr(float)+5) poke adr_destination%+6+buffer_position%,peek(adr(float)+6) poke adr_destination%+7+buffer_position%,peek(adr(float)+7) end_sub
'############################################################################### sub BUFFER_SIZE(adr_destination%,buffer_ptr%) ' retouve la taille du buffer poke adr_destination%,peek(buffer_ptr%-4) poke adr_destination%+1,peek(buffer_ptr%-3) poke adr_destination%+2,peek(buffer_ptr%-2) poke adr_destination%+3,peek(buffer_ptr%-1) end_sub
sub FILL_BUFFER(buffer_ptr%,value%) ' uniquement des BYTEs dim_local size%,i value%=bin_and(value%,255) BUFFER_SIZE(adr(size%),buffer_ptr%) size%=size%-1 for i=0 to size% poke buffer_ptr%+i,value% next i end_sub
sub CLEAR_BUFFER(buffer_ptr%) ' effacer un buffer revient à le remplir de 0 FILL_BUFFER(buffer_ptr%,0) end_sub
sub DISPLAY_BUFFER(buffer_ptr%,c$) ' affiche le contenu du buffer dim_local buffer_position%,i,value,tmp%,tmp,j,k buffer_position%=0 c$=upper$(c$) for i=1 to len(c$) value=asc(mid$(c$,i,1)) select value case 66 tmp%=0 READ_BUFFER_BYTE(adr(tmp%),buffer_ptr%,buffer_position%) buffer_position%=buffer_position%+1 print tmp%
case 68 tmp%=0 READ_BUFFER_DWORD(adr(tmp%),buffer_ptr%,buffer_position%) buffer_position%=buffer_position%+4 print tmp%
case 70 tmp=0 READ_BUFFER_FLOAT(adr(tmp),buffer_ptr%,buffer_position%) buffer_position%=buffer_position%+8 k=0 : for j=0 to 7 : k=k+peek(adr(tmp)+j) : next j if k=2040 print "NaN" else print tmp end_if
case 73 tmp%=0 READ_BUFFER_INT(adr(tmp%),buffer_ptr%,buffer_position%) buffer_position%=buffer_position%+4 print tmp%
case 76 tmp%=0 READ_BUFFER_LONG(adr(tmp%),buffer_ptr%,buffer_position%) buffer_position%=buffer_position%+4 print tmp%
case 87 tmp%=0 READ_BUFFER_WORD(adr(tmp%),buffer_ptr%,buffer_position%) buffer_position%=buffer_position%+2 print tmp% end_select next i end_sub
sub GET_BUFFER_PTR(adr_destination%,adr_source%) ' retrouve l'adresse du pointeur poke adr_destination%,peek(adr_source%) poke adr_destination%+1,peek(adr_source%+1) poke adr_destination%+2,peek(adr_source%+2) poke adr_destination%+3,peek(adr_source%+3) end_sub
sub DEBUG(adr%, tai%) dim_local i,k print for i=0 to tai%-1 k=peek(adr%+i) if k<16 print "0";hex$(k);" "; else print hex$(k);" "; end_if next i print for i=0 to tai%-1 k=peek(adr%+i) print chr$(k);" "; next i print end_sub
Les SUBs SetkeyState(key%) et GetkeyState(key%) ne sont pas du tout nécessaire, mais elle te seront peut-être utile pour une gestion plus souple(peut-être, j'en suis pas tout à fait certain) du clavier, c'est pour ça que je les aies inclus dans le code. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un clavier cliquable Sam 6 Juin 2015 - 12:13 | |
| @Minibug: KGF.dll contient la fonction "GetKeyboardState"... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un clavier cliquable Sam 6 Juin 2015 - 14:16 | |
| Je n'ai pas de led pour vérifier directement le programme mais j'ai regardé les fonctions et c'est un super boulot très pratique. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un clavier cliquable Sam 6 Juin 2015 - 15:18 | |
| Bonjour tous le monde ! Merci silverman et Klaus pour votre aide... Ca devrait permettre d'avancer dans ma démarche... | |
| | | Contenu sponsorisé
| Sujet: Re: Un clavier cliquable | |
| |
| | | | Un clavier cliquable | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |