FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» EPP_V01 éditeur pour Panoramic
par Minibug Hier à 21:03

» [RESOLU] Quelle ligne est sélectionnée dans SYNEDIT ?
par Jean Claude Hier à 21:02

» PanExpress : l'éditeur Panoramic avec création d'objet
par Minibug Hier à 15:58

» Planétarium virtuel.
par Pedro Alvarez Hier à 9:28

» Demande pour Jack concernant PanExpress
par Marc Mar 18 Sep 2018 - 23:56

» Calculatrice
par joeeee2017 Mar 18 Sep 2018 - 9:35

» Petit coucou en passant !
par Minibug Dim 16 Sep 2018 - 15:03

» bug SEVERE fnc+sub : variables globales corrompus
par silverman Dim 16 Sep 2018 - 13:38

» Verrouiller un form en avant plan
par silverman Dim 16 Sep 2018 - 12:50

» Fin de l'aventure.
par Pedro Alvarez Sam 15 Sep 2018 - 18:16

» Demande d'explications Sur File_Write & File_writeln
par Jack Sam 15 Sep 2018 - 17:26

» MEMO avec des possibilités de commande
par Oscaribout Mer 12 Sep 2018 - 1:06

» La théorie du chaos
par jean_debord Mar 11 Sep 2018 - 9:30

» Orbites de l’ensemble de Mandelbrot
par Jean Claude Lun 10 Sep 2018 - 21:08

» Version instantanée V 0.9.29i2 du 4/09/2018
par silverman Mer 5 Sep 2018 - 10:15

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2018
LunMarMerJeuVenSamDim
     12
3456789
10111213141516
17181920212223
24252627282930
CalendrierCalendrier

Partagez | 
 

 API Windows

Aller en bas 
Aller à la page : 1, 2  Suivant
AuteurMessage
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 675
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: 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 Very Happy )
-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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5990
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
papydall

avatar

Nombre de messages : 5990
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Yannick

avatar

Nombre de messages : 8083
Age : 47
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 9 Mar 2017 - 4:22

Cela ne fonctionne pas chez moi...
Sad
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Pedro Alvarez

avatar

Nombre de messages : 1176
Date d'inscription : 19/01/2014

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5990
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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...)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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... Sleep
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
papydall

avatar

Nombre de messages : 5990
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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 » tongue

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:
 
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
pascal10000

avatar

Nombre de messages : 703
Localisation : Troyes
Date d'inscription : 05/02/2011

MessageSujet: 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 Question Question Question Question Question
du fait que LIBRARY et command ne soient pas déclaré en dim
tu peut expliquer la chose!!
merci
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
pascal10000

avatar

Nombre de messages : 703
Localisation : Troyes
Date d'inscription : 05/02/2011

MessageSujet: 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!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5990
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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é...)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5990
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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 ============================================================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 675
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: 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!"

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: API Windows   

Revenir en haut Aller en bas
 
API Windows
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» Mon ordinateur Windows Xp redémarre tout seul
» Windows média player ???
» Problème d'administration sous windows seven
» Windows 7 et carte réseau sans fil
» [résolu]problème d'arrêt windows XP

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Présentation et bavardage-
Sauter vers: