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 |
|
|
| API Windows | |
|
+6Pedro Yannick papydall Klaus silverman JL35 10 participants | |
Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: API Windows Mer 8 Mar 2017 - 17:56 | |
| J'ai trouvé (ici sûrement, mais je ne sais plus où ni qui, peut-être silverman ?) un appel à gdi32.dll pour tracer une ellipse, et ça marche très bien. Du coup par curiosité j'ai voulu regarder s'il n'y avait pas d'autres fonctions utilisables, j'ai trouvé une mine de renseignements ici: http://www.jasinskionline.com/windowsapi/ref/index.html et j'essaie une fonction: affichage d'un texte dans un picture, mais ça ne veut pas marcher, je récupère 'Not correct arithmetic expression' et je ne vois pas du tout pourquoi, ma syntaxe semble correcte... - Code:
-
' Référence: http://www.jasinskionline.com/windowsapi/ref/index.html DIM txt$,p%,x%,y%,x1%,y1%,h%,lt%,res% p% = 1: PICTURE p%: FULL_SPACE p% ' 1) tracé d'une ellipse x% = 100: y% = 50: x1% = 300: y1% = 100 DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) res% = DLL_CALL5("Ellipse",h%,x%,y%,x1%,y1%) DLL_OFF display ' 2) écriture de texte x% = 100: y% = 150: txt$ = "Hello, world" lt% = LEN(txt$): ' taille du texte DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) res% = DLL_CALL5("TextOut",h%,x%,y%,txt$,lt%) DLL_OFF END | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: API Windows Mer 8 Mar 2017 - 18:57 | |
| il y a 2 erreurs: -la fonction c'est : "TextOutA", c'est précisé sous le nom de la dll dans les pages MSDN(si on le sait pas, on le voit pas; Je me suis fait avoir aussi ) -tu ne peux pas envoyer une "string" directement, il faut passer par son pointeur Pour récupérer facilement le pointeur d'une "string", utilise ma fonction personnalisé(je l'utilise tout le temps). - Code:
-
' commande : copie de mémoire dim kernel32% kernel32%=3 LIBRARY kernel32%,"kernel32" command "copy_memory","RtlMoveMemory",kernel32%,"III","stdcall" ' ex.: copy_memory adr(destination), adr(source), taille_en_octet%
' Référence: http://www.jasinskionline.com/windowsapi/ref/index.html DIM txt$,p%,x%,y%,x1%,y1%,h%,lt%,res% dim txt_ptr% p% = 1: PICTURE p%: FULL_SPACE p% ' 1) tracé d'une ellipse x% = 100: y% = 50: x1% = 300: y1% = 100 DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) res% = DLL_CALL5("Ellipse",h%,x%,y%,x1%,y1%) DLL_OFF display ' 2) écriture de texte x% = 100: y% = 150: txt$ = "Hello, world" lt% = LEN(txt$)-1: ' taille du texte DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) copy_memory adr(txt_ptr%),adr(txt$),4 :' <----- res% = DLL_CALL5("TextOutA",h%,x%,y%,txt_ptr%,lt%) :' <----- DLL_OFF END Par contre, tu arriveras à sortir du texte sur le form 0, mais pas sur le picture; 'handle_canvas(n)' ne retourne pas systématiquement le bon handle(erreur externe, ligne xxx: xxxxxxxx is not a valid integer value) du device context(le picture dans ton cas). Va savoir pourquoi? Seul jack peut nous répondre... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: API Windows Mer 8 Mar 2017 - 19:30 | |
| - Citation :
- Va savoir pourquoi? Seul jack peut nous répondre...
Je parle sous le contrôle de Jack, mais j'ai eu quelques expériences avec le canvas des picture. A chaque modification d'un picture, le canvas est reconstruit, et son handle change. Ce n'est pas une valeur constante comme c'est le cas pour une form. Pour utiliser handle_canvas correctement, il faut le faire immédiatement avant l'appel d'une API utilisant le canvas, et encore... il ne faut pas que cette API modifie le canvas réel du picture avant l'utilisation de a valeur de handle_canvas passée en paramètre... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: API Windows Mer 8 Mar 2017 - 19:48 | |
| Merci les amis pour vos remarques. @silverman, Pour le nom de la fonction, c'était bien TextOut dans le lien que j'ai cité, avec un exemple du même nom.. TextOutA on ne peut pas l'inventer... et pour le passage de la string, je ne savais pas, mais j'aurais dû (avec les exemples donnés ici). Pour la sortie sur picture, le handle_canvas doit convenir puisque ça marche à tous les coups avec l'ellipse, sans problème. @Klaus, Pour le handle_canvas je m'en doutais un peu, qu'il faut le récupérer juste avant d'appeler la fonction, tout ça varie dynamiquement. PS effectivement silverman, ça ne semble pas marcher sur le picture, seulement sur le Form 0, et encore il s'affiche quelque chose à l'emplacement demandé mais pas ce que je voudrais... Je passe la chaîne sous la forme ADR(txt$), mais ça ne doit pas être aussi simple. PS2 J'y arrive sur le Form 0, mais pas sur le picture... - Code:
-
DIM txt$,p%,x%,y%,x1%,y1%,h%,lt%,res%,adp%,adr% ' p% = 1: PICTURE p%: FULL_SPACE p% p% = 0 ' 1) tracé d'une ellipse x% = 100: y% = 50: x1% = 300: y1% = 100 DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) res% = DLL_CALL5("Ellipse",h%,x%,y%,x1%,y1%) DLL_OFF display ' 2) écriture de texte x% = 100: y% = 150: txt$ = "Hello, world" lt% = LEN(txt$): ' taille du texte adp% = ADR(txt$): ' adresse du pointeur ' -> adr% = adresse de la chaîne (longueur + chaîne) adr% = PEEK(adp%)+256*PEEK(adp%+1)+65536*PEEK(adp%+2)+16777216*PEEK(adp%+3) DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) res% = DLL_CALL5("TextOutA",h%,x%,y%,adr%,lt%) DLL_OFF END | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: API Windows Jeu 9 Mar 2017 - 0:08 | |
| Pour info : Dans les appels des fonctions contenues dans les API, parfois on doit utiliser non pas le nom de la fonction mais son ALIAS. Par exemple : TextOut c’est le nom de la fonction et ça ne marche pas ! TextOutA c’est l’ALIAS de la fonction : le A à la fin signifie que la routine est "en version ANSI". Si vous n’arrivez pas à faire exécuter une fonction d’une API, essayez de l’appeler non pas par son nom mais par son ALIAS en ajoutant le A à la fin. Voici un exemple de tracé de la courbe de Lissajous utilisant la fonction SetPixel de la gdi32.dll - Code:
-
dim hDC%,a%,x%,y%,couleur%,ret% ' picture 10 : full_space 10 : hDC% = handle_canvas(10) hDC% = handle_canvas(0)
couleur% = hex("0000ff") : ' < --- Attention: le code est inversé c'est BGR et non RGB ' C'est rouge dans cet exemple dll_on "gdi32.dll" for a% = 100 to 10000 x% = 250+200*cos(a%/3) y% = 220+200*sin(a%/3.5) ret% = dll_call4("SetPixel",hDC%,x%,y%,couleur%) next a%
Essayez le tracé sur FORM 0 puis sur PICTURE 10 et observez le comportement. EDIT : dans le lien que tu as donné, il est bien précisé Allias "TextOutA". Il faut TOUJOURS utiliser l'Alias s'il existe. - Citation :
TextOut Function
Declare Function TextOut Lib "gdi32.dll" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: API Windows Jeu 9 Mar 2017 - 3:16 | |
| Lancez le programme et observez : il va tout seul cliquer sur le button comme si vous le faisiez vous-même. - Code:
-
rem ============================================================================ rem Simulation de ON_CLICK par mouse_event de la USER32.DLL rem ============================================================================ label test dim x%,y%,ret% button 10 : left 10,100 : top 10,50 : caption 10,"Test" : on_click 10,test x% = left(10) + 30 : y% = top(10) + 30 dll_on "user32"
' Déplacer le curseur de la souris aux coordonnées du button ret% = dll_call2("SetCursorPos",x%,y%) pause 1000 : ' Pour observer ' Simuler ON_CLICK ret% = dll_call5("mouse_event",2,0,0,0,0) : ' 2 <--- bouton gauche appuyé ret% = dll_call5("mouse_event",4,0,0,0,0) : ' 4 <--- bouton gauche relâché
end rem ============================================================================ test: message "Simulation de ON_CLICK" return
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 9 Mar 2017 - 4:22 | |
| Cela ne fonctionne pas chez moi... | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Simulation de 'on_click'. Jeu 9 Mar 2017 - 8:34 | |
| Bonjour à tous.
J'ai testé la routine. Elle ne fonctionnait pas sur mon PC sous Windows 10.
Mais, en remplaçant 30 par 40 dans la ligne suivante, tout fonctionne correctement.
y% = top(10) + 30
->
y% = top(10) + 40 | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: API Windows Jeu 9 Mar 2017 - 10:49 | |
| - Citation :
- Cela ne fonctionne pas chez moi...sous w10
Cela est dù à ce que les dimensions du bandeau sont différentes selon la version de Windows. X% et y% sont les coordonnées absolues de la souris. Pour que ça marche sur tous les Wndows (xp,7,8,10), il faut déterminer la hauteur du bandeau. Pour cela : - Code:
-
bandeau% = height(0) - height_client(0)
Puis ajouter cette valeur à y% Voici le code qui devrait marcher sous XP,7…10 - Code:
-
rem ============================================================================ rem Simulation de ON_CLICK par mouse_event de la USER32.DLL rem ============================================================================ label test dim x%,y%,ret%,bandeau% button 10 : left 10,100 : top 10,50 : caption 10,"Test" : on_click 10,test bandeau% = height(0) - height_client(0) x% = left(10) + 30 : y% = top(10) + bandeau% dll_on "user32"
' Déplacer le curseur de la souris aux coordonnées du button ret% = dll_call2("SetCursorPos",x%,y%) pause 1000 : ' Pour observer ' Simuler ON_CLICK ret% = dll_call5("mouse_event",2,0,0,0,0) : ' 2 <--- bouton gauche appuyé ret% = dll_call5("mouse_event",4,0,0,0,0) : ' 4 <--- bouton gauche relâché
end rem ============================================================================ test: message "Simulation de ON_CLICK" return
Une autre idée : déterminer les décalages dx% et dy% d’abord. Puis ajouter ces valeurs aux coordonnées x% et y% - Code:
-
rem ============================================================================ rem Simulation de ON_CLICK par mouse_event de la USER32.DLL rem ============================================================================ label test dim x%,y%,ret%,dx%,dy% button 10 : left 10,100 : top 10,50 : caption 10,"Test" : on_click 10,test dx% = width(0) - width_client(0) dy% = height(0) - height_client(0) x% = left(10) + dx% : y% = top(10) + dy% dll_on "user32"
' Déplacer le curseur de la souris aux coordonnées du button ret% = dll_call2("SetCursorPos",x%,y%) pause 1000 : ' Pour observer ' Simuler ON_CLICK ret% = dll_call5("mouse_event",2,0,0,0,0) : ' 2 <--- bouton gauche appuyé ret% = dll_call5("mouse_event",4,0,0,0,0) : ' 4 <--- bouton gauche relâché
end rem ============================================================================ test: message "Simulation de ON_CLICK" return
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: API Windows Mar 5 Déc 2017 - 22:33 | |
| Je remonte ce vieux sujet concernant l'utilisation des API Windows. J'avais soumis un code qui ne marchait pas, et qui a judicieusement été corrigé par silverman. L'objectif était de tracer une ellipse et d'écrire un texte sur un picture en utilisant gdi32.dll. Pour l'ellipse ça marche, mais on en était arrivés à la conclusion que ce n'était pas possible de tracer un texte sur le picture (seulement sur un Form). J'ai repris le code (version silverman), et juste avant l'appel au tracé de texte, j'ai ajouté une opération graphique invisible sur le picture: 2D_LINE 0,0,0,0 (ligne 24), et là miracle, le texte s'affiche bien sur le picture: - Code:
-
' commande : copie de mémoire dim kernel32% kernel32%=3 LIBRARY kernel32%,"kernel32" command "copy_memory","RtlMoveMemory",kernel32%,"III","stdcall" ' ex.: copy_memory adr(destination), adr(source), taille_en_octet%
' Référence: http://www.jasinskionline.com/windowsapi/ref/index.html DIM txt$,p%,x%,y%,x1%,y1%,h%,lt%,res% dim txt_ptr% COLOR 0,180,255,255: border_small 0 p% = 1: PICTURE p%: width p%,500: HEIGHT p%,200
' 1) tracé d'une ellipse x% = 100: y% = 50: x1% = 300: y1% = 100 DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) res% = DLL_CALL5("Ellipse",h%,x%,y%,x1%,y1%) DLL_OFF
' 2) écriture de texte x% = 40: y% = 120: txt$ = "Hello, world": txt$ = "Au clair de la lune " lt% = LEN(txt$): ' taille du texte 2D_LINE 0,0,0,0 DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) copy_memory adr(txt_ptr%),adr(txt$),4 :' <----- res% = DLL_CALL5("TextOutA",h%,x%,y%,txt_ptr%,lt%) :' <----- DLL_OFF display END Ce que je ne sais pas (encore...) par contre, c'est comment modifier les caractéristiques du texte: police, taille etc. PS Tout simplement, le texte a les caractéristiques texte du picture cible (Font_Name, Font_Size etc...) Malheureusement il s'écrit sur fond blanc (fond non transparent... dommage...) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: API Windows Mar 5 Déc 2017 - 23:09 | |
| Avant d'écrire le texte, il faudrait définir Brush.Style = bsClear Ceci signifie "fond transparent pour l'écriture" Je dis ça parce que je fais ça en Delphi dans mes fonctions de traitement d'image. Et sans avoir regardé le code - juste pour passer dans quelle direction il faut chercher... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: API Windows Mar 5 Déc 2017 - 23:15 | |
| Merci Klaus pour la suggestion, effectivement ça semble être une piste intéressante... Par contre je ne vois pas l'équivalent dans les fonctions API Windows... Il ne semble pas y en avoir dans les fonctions 'Fonts & Text' Et si on ne peut pas faire de fond transparent, ça perd évidemment tout son intérêt, autant utiliser les fonctions Panoramic d'écriture. Merci en tout cas, et maintenant... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: API Windows Mar 5 Déc 2017 - 23:39 | |
| Tout dépend des fonctions exportées par gdi32.dll. Je ne connais pas cette dll. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: API Windows Mer 6 Déc 2017 - 1:36 | |
| Salut tout le monde. Profitant d’une sensible amélioration de ma santé, j’interviens ici pour « exhiber mon savoir » - Code:
-
dim kernel32% kernel32%=3 LIBRARY kernel32%,"kernel32" command "copy_memory","RtlMoveMemory",kernel32%,"III","stdcall" dim txt_ptr% dim x%,y%,x1%,y1%,h%,res% dim txt$ : txt$ = "Salut tout le monde" dim long% : long% = len(txt$) picture 10 : full_space 10
x% = 200: y% = 100: x1% = 400: y1% = 300 DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(10) res% = DLL_CALL5("Ellipse",h%,x%,y%,x1%,y1%) : ' Tracé d'une ellipse (cercle) res% = dll_call2("SetBkColor",h%,hex("ff0000")) : ' Couleur du fond; le code est inversé c'est BGR et non RGB, ici c'est bleu res% = dll_call2("SetTextColor",h%,hex("0000ff")) : ' Couleur du texte, ici c'est rouge copy_memory adr(txt_ptr%),adr(txt$),4 res% = DLL_CALL5("TextOutA",h%,x%+50,y%+100,txt_ptr%,long%) : ' Affichage du texte DLL_OFF
- ça donne:
| |
| | | pascal10000
Nombre de messages : 812 Localisation : Troyes Date d'inscription : 05/02/2011
| Sujet: Re: API Windows Mer 6 Déc 2017 - 6:41 | |
| c cool papydall pour ton rétablissement pour ton code tu me coupe le sifflet!! à la ligne 3 et 4. panoramic devrait se planter je n'ai pas du tout compris du fait que LIBRARY et command ne soient pas déclaré en dim tu peut expliquer la chose!! merci | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: API Windows Mer 6 Déc 2017 - 8:30 | |
| Depuis la version instantanée du 20 mars 2016 : PANORAMIC V 0.9.27i6, les commandes suivantes ont été implémentées: - Citation :
- LIBRARY N, L$ : déclaration d'une bibliothèque
N : numéro de la bibliothèque L$ : nom absolu ou relatif de la bibliothèque (exemple : ma_lib.dll)
COMMAND CP$,CL$,N,T$,C$ : déclaration d'une commande CP$ : nom de la commande pour PANORAMIC CL$ : nom de la commande dans la bibliothèque (attention, CL$ est sensible à la casse : respectez majuscules et minuscules) N : numéro de la bibliothèque dans laquelle on trouve la commande T$ : chaine de caractères donnant le type de chaque paramètre : I (entier) R (réel) S (chaine de caractères) C$ : convention d'appel de la commande
FUNCTION CP$,CL$,N,T$,C$ : déclaration d'une fonction CP$ : nom de la fonction pour PANORAMIC CL$ : nom de la fonction dans la bibliothèque (attention, CL$ est sensible à la casse : respectez majuscules et minuscules) N : numéro de la bibliothèque dans laquelle on trouve la fonction T$ : chaine de caractères donnant le type de chaque paramètre : I (entier) R (réel) S (chaine de caractères) C$ : convention d'appel de la fonction
Le type de retour est dans le nom de la fonction Panoramic: fonction "fn","fonction_dans_dll",1,"II","stdcall" définit que fonction_dans_dll retourne un réel fonction "fn%","fonction_dans_dll",1,"II","stdcall" définit que fonction_dans_dll retourne un entier fonction "fn$","fonction_dans_dll",1,"II","stdcall" définit que fonction_dans_dll retourne une chaine de caractères
Pour le moment, cela ne fonctionne : - qu'avec 6 paramètres maximum, - que lorsque les paramètres sont entiers (I) - que lorsque les fonctions retournent des nombres
| |
| | | pascal10000
Nombre de messages : 812 Localisation : Troyes Date d'inscription : 05/02/2011
| Sujet: Re: API Windows Mer 6 Déc 2017 - 9:25 | |
| merci klaus pour ces précisions
je ne savais pas que ces commandes étaient disponibles j'ai cru qu'il étaient en cour de réalisation! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: API Windows Mer 6 Déc 2017 - 13:48 | |
| Tout d'abord papydall, bon courage , tu tiens le bon bout !
Une remarque: il semble que les figures (dans mon exemple une ellipse) soient tracées à 'fond plein'. Comme le texte dans ton exemple, ce qui n'est pas très intéressant, on fait aussi bien avec les commandes Panoramic.
Si je reprends ton exemple, pour voir, je colore d'abord le picture en cyan: la ligne 9 devient: picture 10 : FULL_SPACE 10: color 10,164 ,255,255
et là, mystère, plus rien ne s'affiche ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: API Windows Mer 6 Déc 2017 - 14:11 | |
| Tu peux adapter la couleur de fond du texte en modifiant la ligne - Code:
-
res% = dll_call2("SetBkColor",h%,hex("ff0000")) : ' Couleur du fond; le code est inversé c'est BGR et non RGB, ici c'est bleu en utilisant la couleur du fond... Mais ce n'est qu'ile solution partielle. En effet, si le texte est à cheval sur différents détails de l'image. Dans ce cas, il faut bien arriver à gérer la propriété "BRUSH.STYLE". Je sais faire en Delphi, mais pour cette DLL, je laisse Papydall trouver l'astuce. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: API Windows Mer 6 Déc 2017 - 14:50 | |
| Oui Klaus, je sais bien qu'on peut modifier la couleur de fond du texte, mais ça on le fait encore plus facilement en panoramic pur, donc aucun intérêt ! Ce qui m'intéresse c'est écrire à fond transparent, ce qu'on ne peut pas faire en panoramic, il faut faire appel à des ressources externes.
Je l'ai déjà fait avec avec une image en SCENE2D comme fond et des sprites contenant le texte, avec la notion de transparence, là c'est possible, mais un peu moins simple. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: API Windows Mer 6 Déc 2017 - 15:26 | |
| La fonction SetBkMode peut faire l’affaire : elle fixe le mode d’affichage pour le périphérique sélectionné (fond transparent ou font opaque) - Code:
-
rem ============================================================================ rem Affichage d’un texte sur fond opaque ou sur fond transparent rem ============================================================================
LIBRARY 1,"kernel32" command "copy_memory","RtlMoveMemory",1,"III","stdcall" dim txt_ptr% dim x%,y%,h%,res% dim txt$ : txt$ = "Salut tout le monde" dim long% : long% = len(txt$) dim transparent% : transparent% = 1 : ' fond transparent dim opaque% : opaque% = 2 : ' fond opaque full_space 0 x% = 200: y% = 100 h% = HANDLE_CANVAS(0) dll_on "user32" res% = dll_call1("PaintDesktop",H%) : ' Afficher l’image de fond du bureau dll_off DLL_ON "gdi32.dll" res% = dll_call2("SetBkMode",h%,transparent%) : ' Fond transparent res% = dll_call2("SetBkColor",h%,hex("ffffff")) : ' Couleur du fond; le code est inversé c'est BGR et non RGB, ici c'est bleu res% = dll_call2("SetTextColor",h%,hex("0000ff")) : ' Couleur du texte, ici c'est rouge copy_memory adr(txt_ptr%),adr(txt$),4 res% = DLL_CALL5("TextOutA",h%,x%,y%,txt_ptr%,long%) : ' Affichage du texte sur fond trasparent res% = dll_call2("SetBkMode",h%,opaque%) : ' Fond Opaque res% = DLL_CALL5("TextOutA",h%,x%+50,y%+100,txt_ptr%,long%) : ' Affichage du texte sur fond opaque DLL_OFF rem ============================================================================
Le code a été édité deux fois
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: API Windows Mer 6 Déc 2017 - 15:54 | |
| Génial papydall ! ça marche !
J'ai écrit sur une image dans un picture (et non sur le Form 0 comme toi), et ça fonctionne très bien. Et on peut facilement moduler les caractéristiques du texte: police, taille, couleur, etc. simplement avec les paramètres print du picture: Font_Name, Font_Size, etc.
Super, merci à toi, et soigne-toi bien surtout, on a encore besoin de tes lumières ! (c'est désintéressé...) | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: API Windows Mer 6 Déc 2017 - 16:05 | |
| Merci JL35 Je t’offre une cerise à mettre sur le gâteau. On peut définir le nombre d’espaces à mettre entre les caractères du texte. C’est la fonction SetTextCharacterExtra qui fait ça - Code:
-
rem ============================================================================ rem Affichage d’un texte sur fond opaque ou sur fond transparent rem ============================================================================
LIBRARY 1,"kernel32" command "copy_memory","RtlMoveMemory",1,"III","stdcall" dim txt_ptr% dim x%,y%,h%,res% dim txt$ : txt$ = "Salut tout le monde" dim long% : long% = len(txt$) dim transparent% : transparent% = 1 : ' fond transparent dim opaque% : opaque% = 2 : ' fond opaque dim NbEspaces% : NbEspaces% = 10 : ' Nombre d’espaces entre les caractères lors de l’écriture full_space 0 x% = 500: y% = 300 h% = HANDLE_CANVAS(0) dll_on "user32" res% = dll_call1("PaintDesktop",H%) : ' Afficher l’image de fond du bureau dll_off DLL_ON "gdi32.dll"
res% = dll_call2("SetTextCharacterExtra",h%,NbEspaces%) : ' Ajouter NbEspaces% entre chaque caractère res% = dll_call2("SetBkMode",h%,transparent%) : ' Fond transparent res% = dll_call2("SetBkColor",h%,hex("ffffff")) : ' Couleur du fond; le code est inversé c'est BGR et non RGB, ici c'est bleu res% = dll_call2("SetTextColor",h%,hex("0000ff")) : ' Couleur du texte, ici c'est rouge copy_memory adr(txt_ptr%),adr(txt$),4 res% = DLL_CALL5("TextOutA",h%,x%,y%,txt_ptr%,long%) : ' Affichage du texte sur fond trasparent res% = dll_call2("SetBkMode",h%,opaque%) : ' Fond Opaque res% = DLL_CALL5("TextOutA",h%,x%,y%+100,txt_ptr%,long%) : ' Affichage du texte sur fond opaque DLL_OFF rem ============================================================================
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: API Windows Mer 6 Déc 2017 - 16:44 | |
| Merci pour la cerise ! je n'en ai pas l'usage pour le moment, mais qui sait... Du coup la petite sub d'écriture d'un texte sur un picture, enrichie de tes lumières: - Code:
-
SUB TextToPict(p%,txt$,x%,y%,pol$,sz%,r%,g%,b%,enr%) ' Écriture du texte txt$ sur le picture p% en x%,y%, Police pol$, Taille sz% ' Couleur r%,g%,b% ' Enrichissements enr% (=1 gras, =2 italique, =4 souligné, combinables DIM_LOCAL h%,res%,pt%,lg% lg% = LEN(txt$) PRINT_TARGET_IS p%: FONT_NAME p%,pol$: FONT_SIZE p%,sz%: FONT_COLOR p%,255,0,0 FONT_BOLD_OFF p%: FONT_ITALIC_OFF p%: FONT_UNDERLINE_OFF p% IF BIN_AND(enr%,1) = 1 THEN FONT_BOLD p% IF BIN_AND(enr%,2) = 2 THEN FONT_ITALIC p% IF BIN_AND(enr%,4) = 4 THEN FONT_UNDERLINE p% LIBRARY 1,"kernel32" COMMAND "copy_memory","RtlMoveMemory",1,"III","stdcall" DLL_ON "gdi32.dll" h% = HANDLE_CANVAS(p%) res% = DLL_CALL2("SetBkMode",h%,1): ' 1 = Fond transparent copy_memory ADR(pt%),ADR(txt$),4 res% = DLL_CALL5("TextOutA",h%,x%,y%,pt%,lg%): ' Texte fond transparent DLL_OFF END_SUB | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: API Windows Jeu 7 Déc 2017 - 10:38 | |
| @JL35 Tu pouvait le faire aussi en pur panoramic: - Code:
-
picture 10 2d_target_is 10 width 10,300 : height 10,200 color 10, 50,100,150 :' couleur du fond du PICTURE ' file_load 10,"C:\Program Files\Panoramic Editor V 0.9.25\rainbow.bmp"
print_target_is 10 :' Diriger la sortie de PRINT vers le PICTURE FONT_NAME 10,"Segoe UI" font_size 10,29 :' Taille des caractères 2d_fill_color 255,255,0 :' couleur de fond du texte font_color 10,255,0,0 :' couleur du texte print_locate 15,30 : print "HELLO WORLD!"
2d_fill_color 255,255,0 :' couleur de fond du texte 2d_fill_off :' désaciver le background du texte(le rendre transparent) font_color 10,255,0,0 :' couleur du texte print_locate 15,100 : print "HELLO WORLD!"
| |
| | | Contenu sponsorisé
| Sujet: Re: API Windows | |
| |
| | | | API Windows | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |