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 |
|
|
| WriteTextOverPicture | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: WriteTextOverPicture Mer 19 Fév 2014 - 22:45 | |
| Bonsoir Klaus, J'ai un comportement bizarre avec cette fonction de ta dll, pourtant il me semble bien que je l'utilisais avant sans problèmes. Parfois l'affichage ne se fait pas et je ne comprends pas pourquoi (ça n'affiche jamais d'erreur, et les codes retour sont toujours à zéro). Normalement cette fonction n'affiche qu'une seule ligne de texte, j'ai fait une petite sub pour pouvoir en afficher plusieurs, voici le petit programme de test: - Code:
-
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res% pic% = 1: PICTURE pic%: FULL_SPACE pic% DLL_ON "C:\PANORAMIC\KLAUS\DLLs\KGF.dll"
txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes" txt$ = "Ligne unique" fnt$ = "Times New Roman" pos% = 50 + 40*65536: ' x=50, y=40 attr% = 40*16: ' taille 40 coul% = 255*65536: ' couleur bleue Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) END ' ============================================================================== SUB Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res% FONT_SIZE pic%,INT(attr%/16): ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte hnd% = HANDLE_CANVAS(pic%) y% = INT(pos%/65536): x% = BIN_AND(pos%,65535) k% = INSTR(txt$,CHR$(13)+CHR$(10)): ' si multiligne IF k% > 0 REPEAT a$ = LEFT$(txt$, k%-1): txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht%: k% = INSTR(txt$,CHR$(13)+CHR$(10)) UNTIL k% = 0 END_IF pos% = x% + 65536*y%: coul% = 255: ' couleur rouge ' message txt$ res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) END_SUB (à la place de la boucle Repeat/Until j'avais un While/End_While qui est plus logique mais ça ne marchait pas du tout). Je n'affiche qu'une seule ligne de texte, que ce soit un texte de 3 ligne ou d'une ligne, et si je mets des points d'arrêt pour voir (Stop ou Message), là ça s'arrête bien mais ensuite ça n'affiche plus rien du tout. Il doit y avoir un conflit quelque part, mais j'y perds mon latin (enfin, le peu qui me reste...); Ce n'est pas vital, mais ça m'agace de ne pas comprendre ce qui se passe. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 1:11 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 9:29 | |
| Bon, j'ai trouvé. C'était dur, car ce n'est pas une erreur d'écriture de ta part. Ce n'est pas non plus un bug dans KGF.dll. C'est un vrai bug dans Panoramic. Je m'explique. Que ce soit une construction REPEAT...UNTIL ou WHILE...END_WHILE, ça ne marche pas du tout, dans ta procédure. Seule une construction LABEL...IF...GOTO marche ! J'ai ajouté la solution ans ton code, avec des commentaires. Tu peux basculer dune version à l'autre, en activant ou désactivant les lignes marquées OK ou bad. Actuellement, le code est en configuration ok: - Code:
-
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res% pic% = 1: PICTURE pic%: FULL_SPACE pic% DLL_ON "KGF.dll" txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb" ' txt$ = "Ligne unique" fnt$ = "Times New Roman" pos% = 50 + 40*65536: ' x=50, y=40 attr% = 40*16: ' taille 40 coul% = 255*65536: ' couleur bleue
dim cas$ cas$ = "REPEAT" cas$ = "GOTO" Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) END
' ============================================================================== SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul% dim_local crlf$ : crlf$ = chr$(13)+chr$(10) FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte hnd% = HANDLE_CANVAS(pic%) txt$ = xtxt$ coul% = xcoul% y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535) k% = INSTR(txt$,crlf$): ' si multiligne
label loop : ' ok loop: : ' ok ' IF k% > 0 : ' bad ' REPEAT : ' bad a$ = LEFT$(txt$, k%-1) txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht% k% = INSTR(txt$,crlf$) ' UNTIL k% = 0 : ' bad ' END_IF : ' bad if k%>0 then goto loop : ' ok
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) END_SUB C'est la solution brutale, mais tout en étant opérationnelle, elle prouve le problème dans Panoramic. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 9:48 | |
| C'est toi le meilleur Klaus ! Je subodorais bien quelque chose comme ça, puisque le Repeat marchait mieux (mais pas parfait) que le While qui ne marchait pas du tout. Et les stop et Message qui bloquaient tout. Mais je n'ai pas été comme toi jusqu'au Goto... Bizarre tout de même, parce que j'avais cette sub dans ma collection, j'avais bien dû la tester, est-ce que c'est un phénomène nouveau dans Panoramic ? Dans tous les cas un grand merci à toi Klaus qui me débloques la situation, je vais donc le faire à la brutale, avec le Goto (qui est-ce qui a dit que cette instruction devrait disparaître ?) PS: juste une remarque, il faut quand même tester en tête de la boucle si k% > 0, sinon ça plante dans le cas d'une ligne unique: - Code:
-
loop: IF k% > 0 ... END_IF IF k% > 0 THEN GOTO loop ce n 'est pas très joli, mais nécessaire. | |
| | | Invité Invité
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 10:15 | |
| Etant bloqué pour le moment, et devant mon ordi, je jette un oeil sur ce post. Je e suis pas d'accord sur la conclusion. Pour moi ce n'est pas repeat ou autre qui est en cause. Peut-être un problème avec la dll ou un focus. Si je rajoute un message tout simple après le premier envoi, même le goto ne fonctionne plus. - Code:
-
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res% pic% = 1: PICTURE pic%: FULL_SPACE pic% dll_on "C:\PANO\DLL\DLLs\kgf.dll" txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb" ' txt$ = "Ligne unique" fnt$ = "Times New Roman" pos% = 50 + 40*65536: ' x=50, y=40 attr% = 40*16: ' taille 40 coul% = 255*65536: ' couleur bleue
dim cas$ cas$ = "REPEAT" cas$ = "GOTO" Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) END
' ============================================================================== SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul% dim_local crlf$ : crlf$ = chr$(13)+chr$(10) FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte hnd% = HANDLE_CANVAS(pic%) txt$ = xtxt$ coul% = xcoul% y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535) k% = INSTR(txt$,crlf$): ' si multiligne
label loop : ' ok loop: : ' ok ' IF k% > 0 : ' bad ' REPEAT : ' bad a$ = LEFT$(txt$, k%-1) txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht% k% = INSTR(txt$,crlf$) ' UNTIL k% = 0 : ' bad ' END_IF : ' bad message a$+crlf$+txt$ if k%>0 then goto loop : ' ok
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) END_SUB Il faut chercher ailleurs. |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 11:18 | |
| Tu as raison, le comportement est quand même bizarre, mais pour moi ça vient de Panoramic. Je reprends l'exemple: - Code:
-
DIM pic%,pid%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%,crlf$ crlf$ = chr$(13)+chr$(10) width 0,700 : color 0,0,255,255
pic% = 1: PICTURE pic%: WIDTH pic%,300: HEIGHT pic%,300 ' pid% = 2: PICTURE pid%: LEFT pid%,350: WIDTH pid%,300: HEIGHT pid%,300
DLL_ON "c:\panoramic\klaus\dlls\KGF.dll" txt$ = "1ère ligne de 2 lignes"+crlf$+"2ème ligne de 2 lignes"+crlf$+"aaaa"+crlf$+"bbbb" fnt$ = "Times New Roman" pos% = 20 + 40*65536: ' x=20, y=40 attr% = 20*16: ' taille 40 coul% = 255*65536: ' couleur bleue
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) ' Text2Pic(pid%,pos%,txt$,fnt$,attr%,coul%) END
' ============================================================================== SUB Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A if label("Loop")=0 then label Loop DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res% dim_local crlf$ : crlf$ = chr$(13)+chr$(10) FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte hnd% = HANDLE_CANVAS(pic%) y% = INT(pos%/65536): x% = BIN_AND(pos%,65535) k% = INSTR(txt$,crlf$): ' si multiligne if k% > 0 Loop: a$ = LEFT$(txt$, k%-1): txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht% k% = INSTR(txt$,crlf$): if k%>0 then goto Loop end_if pos% = x% + 65536*y%: coul% = 255: ' couleur rouge res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) END_SUB Tel quel, ça marche. Mais si je déclare un deuxième picture à côté du 1er (décocher la ligne PICTURE pid%), ça tronque l'affichage du 1er, tout se passe comme si le 1er picture était réduit aux dimensions implicites (105x105), en largeur et en hauteur. Si j'affiche le texte dans le 2ème, ça se fait normalement. Et c'est ce qui se passe dans mon application, j'ai deux pictures côte à côte, et je n'arrive pas à afficher le texte dans le 1er avec la fonction de Klaus. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 11:33 | |
| Encore plus étrange: si je place le message immédiatement après le dernier appel à la fonction DLL, tout marche bien - même le dernier texte imprimé par la fonction apparaît, alors qu'à l'intérieur de la boucle, un tel message bloque l'apaprition du texte imprimé par la fonction appelée juste avant: - Code:
-
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res% pic% = 1: PICTURE pic%: FULL_SPACE pic% dll_on "kgf.dll" txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb" ' txt$ = "Ligne unique" fnt$ = "Times New Roman" pos% = 50 + 40*65536: ' x=50, y=40 attr% = 40*16: ' taille 40 coul% = 255*65536: ' couleur bleue
dim cas$ cas$ = "REPEAT" cas$ = "GOTO" Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) END
' ============================================================================== SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul% dim_local crlf$ : crlf$ = chr$(13)+chr$(10) FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte hnd% = HANDLE_CANVAS(pic%) txt$ = xtxt$ coul% = xcoul% y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535) k% = INSTR(txt$,crlf$): ' si multiligne
IF k% > 0 ' REPEAT : ' bad label loop : ' ok loop: : ' ok a$ = LEFT$(txt$, k%-1) txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht% k% = INSTR(txt$,crlf$) ' UNTIL k% = 0 : ' bad message a$+crlf$+txt$ : ' <========= cette ligne bloque la mise à jour du canvas du picture ! if k%>0 then goto loop : ' ok END_IF
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) message a$+crlf$+txt$ : ' <========= cette ligne bloque la mise à jour du canvas du picture ! END_SUB Je ne comprends pas pourquoi ça marche dans ce cas, et pas quand le message est dans la boucle. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 11:46 | |
| Je commence à y vois plus clair. En fait, le handle du canvas change d'un appel à l'autre: - Code:
-
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res% pic% = 1: PICTURE pic%: FULL_SPACE pic% dll_on "kgf.dll" txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb" ' txt$ = "Ligne unique" fnt$ = "Times New Roman" pos% = 50 + 40*65536: ' x=50, y=40 attr% = 40*16: ' taille 40 coul% = 255*65536: ' couleur bleue
dim cas$ cas$ = "REPEAT" cas$ = "GOTO" Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) END
' ============================================================================== SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul% dim_local crlf$ : crlf$ = chr$(13)+chr$(10) FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte hnd% = HANDLE_CANVAS(pic%) txt$ = xtxt$ coul% = xcoul% y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535) k% = INSTR(txt$,crlf$): ' si multiligne
IF k% > 0 ' REPEAT : ' bad label loop : ' ok loop: : ' ok a$ = LEFT$(txt$, k%-1) txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% if handle_canvas(pic%)<>hnd% then message "oups "+str$(handle_canvas(pic%)) res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht% k% = INSTR(txt$,crlf$) ' UNTIL k% = 0 : ' bad message a$+crlf$+txt$ : ' <========= cette ligne bloque la mise à jour du canvas du picture ! if k%>0 then goto loop : ' ok END_IF
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) message a$+crlf$+txt$ : ' <========= cette ligne bloque la mise à jour du canvas du picture ! END_SUB Et même si je recharge la varaible hnd% avec le nouveau handle_canvas(pic%), le lien avec le canvas précédent est perdu, et on n'affiche plus rien. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 11:56 | |
| Une nouvelle pierre au puzzle: si je cache le picture par HIDE au début, et je le réaffiche à la fin par SHOW, la situation s'améliore: - les (n-1) premières lignes sont bien imprimées MALGRE la présence des messages - seule la dernière ligne a disparue C'est donc bien lié au canvas et un problème de timing certainement pour la mise à jour visuelle. Voici la preuve: - Code:
-
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res% pic% = 1: PICTURE pic%: FULL_SPACE pic% dll_on "kgf.dll" txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb" ' txt$ = "Ligne unique" fnt$ = "Times New Roman" pos% = 50 + 40*65536: ' x=50, y=40 attr% = 40*16: ' taille 40 coul% = 255*65536: ' couleur bleue
dim cas$ cas$ = "REPEAT" cas$ = "GOTO" Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) END
' ============================================================================== SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul% dim_local crlf$ : crlf$ = chr$(13)+chr$(10) FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte hide pic% hnd% = HANDLE_CANVAS(pic%) txt$ = xtxt$ coul% = xcoul% y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535) k% = INSTR(txt$,crlf$): ' si multiligne
IF k% > 0 ' REPEAT : ' bad label loop : ' ok loop: : ' ok a$ = LEFT$(txt$, k%-1) txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% if handle_canvas(pic%)<>hnd% then message "oups "+str$(handle_canvas(pic%)) hnd% = HANDLE_CANVAS(pic%) res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht% k% = INSTR(txt$,crlf$) ' UNTIL k% = 0 : ' bad message a$+crlf$+txt$ : ' <========= cette ligne bloque la mise à jour du canvas du picture ! if k%>0 then goto loop : ' ok END_IF
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) message a$+crlf$+txt$ : ' <========= cette ligne bloque la mise à jour du canvas du picture ! show pic% END_SUB | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 13:17 | |
| Mais oui Klaus, effectivement ça semble résoudre mon problème: Je fais Hide du picture avant l'opération d'écriture puis Show après, et mon texte s'affiche correctement, toutes les lignes !
Il y a sûrement un problème de timing dans windows qui court-circuite l'affichage, bizarre tout de même et anormal, ça devrait finir par se faire, mais en tout cas j'adopte la solution Hide/Show qui fonctionne et qui me permet de faire ce que je veux, même si c'est un peu obscur...
Pour le handle, j'y avais pensé et essayé de le refaire à chaque fois, mais ça ne changeait rien.
Une petite remarque annexe, pour afficher les lignes suivantes, je fais progresser le y d'une valeur égale à Text_Height(...). Or j'ai constaté depuis longtemps que l'écartement obtenu est beaucoup trop grand, et je le multiplie par 0,65 (valeur arbitraire) pour avoir une valeur correcte. Pourquoi ? je sais pas... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 13:50 | |
| Je ne sais pas. Le l'ai constaté aussi. Dans ton exemple, si tu forces la taille de plice du picture à 24, ça semble présenter correctement. Ce qui confirme ce que tu dis. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 14:57 | |
| Une autre technique: 1. copier le picture initial via un image dans un picture caché 2. faire les écritures de textes 3. recopier le picture caché via un image dans le picture d'origine 4. faire le message qui empêchait l'affichage de la dernière ligne ===> tout est correct ! - Code:
-
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res% pic% = 1: PICTURE pic%: FULL_SPACE pic% dll_on "kgf.dll" txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb" ' txt$ = "Ligne unique" fnt$ = "Times New Roman" pos% = 50 + 40*65536: ' x=50, y=40 attr% = 40*16: ' taille 40 coul% = 255*65536: ' couleur bleue
dim cas$ cas$ = "REPEAT" cas$ = "GOTO" Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) END
' ============================================================================== SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul% dim_local crlf$ : crlf$ = chr$(13)+chr$(10) FONT_SIZE pic%,INT(attr%/16) ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
picture 2 : hide 2 : width 2,width(pic%) : height 2,height(pic%) image 3 2d_target_is pic% 2d_image_copy 3,0,0,width(pic%),height(pic%) 2d_target_is 2 2d_image_paste 3,0,0
' hide pic% hnd% = HANDLE_CANVAS(2) : ' pic%) txt$ = xtxt$ coul% = xcoul% y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535) k% = INSTR(txt$,crlf$): ' si multiligne
IF k% > 0 ' REPEAT : ' bad label loop : ' ok loop: : ' ok a$ = LEFT$(txt$, k%-1) txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht% k% = INSTR(txt$,crlf$) ' UNTIL k% = 0 : ' bad if k%>0 then goto loop : ' ok END_IF
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) message a$+crlf$+txt$ : ' <========= cette ligne bloque la mise à jour du canvas du picture !
2d_target_is 2 2d_image_copy 3,0,0,width(2),height(2) 2d_target_is pic% 2d_image_paste 3,0,0 delete 3 delete 2
' show pic% END_SUB Et dans ce cas, ça marche même avec la boucle REPEAT...UNTIL ! Plus besoin du LABEL...IF...GOTO ! - Code:
-
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res% pic% = 1: PICTURE pic%: FULL_SPACE pic% dll_on "kgf.dll" txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb" ' txt$ = "Ligne unique" fnt$ = "Times New Roman" pos% = 50 + 40*65536: ' x=50, y=40 attr% = 40*16: ' taille 40 coul% = 255*65536: ' couleur bleue
dim cas$ cas$ = "REPEAT" cas$ = "GOTO" Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%) END
' ============================================================================== SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%) ' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536), ' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63), ' couleur coul% format BGR (=(256*B + G)*256 + R). ' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul% dim_local crlf$ : crlf$ = chr$(13)+chr$(10) FONT_SIZE pic%,INT(attr%/16) ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
picture 2 : hide 2 : width 2,width(pic%) : height 2,height(pic%) image 3 2d_target_is pic% 2d_image_copy 3,0,0,width(pic%),height(pic%) 2d_target_is 2 2d_image_paste 3,0,0
' hide pic% hnd% = HANDLE_CANVAS(2) : ' pic%) txt$ = xtxt$ coul% = xcoul% y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535) k% = INSTR(txt$,crlf$): ' si multiligne
IF k% > 0 REPEAT : ' bad ' label loop : ' ok ' loop: : ' ok a$ = LEFT$(txt$, k%-1) txt$ = MID$(txt$,k%+2,1000) pos% = x% + 65536*y% res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%) y% = y% + ht% k% = INSTR(txt$,crlf$) UNTIL k% = 0 : ' bad ' if k%>0 then goto loop : ' ok END_IF
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%) message a$+crlf$+txt$ : ' <========= cette ligne bloque la mise à jour du canvas du picture !
2d_target_is 2 2d_image_copy 3,0,0,width(2),height(2) 2d_target_is pic% 2d_image_paste 3,0,0 delete 3 delete 2
' show pic% END_SUB | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 17:58 | |
| Merci Klaus de t'être obstiné là-dessus pour arriver à un résultat.
C'est la solution que je vais finalement adopter, je pense, ce qui me plaît moins c'est d'être obligé de déclarer des objets temporaire à l'intérieur d'une Sub mais bon, je prendrai les précautions d'usage.
Et avec un While k%>0 (à la place du Repeat/Until) plus besoin du test If en tête de la boucle. sauf que ça ne marche pas avec le While...
Merci à toi en tout cas. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 18:22 | |
| Pour les objets temporaires, tu peux faire ainsi: - Code:
-
dim_local PIC1%, IMG% for PIC1%=1 to 30000 if object_exists(PIC1%) then exit_for next PIC1% picture PIC1% : hide PIC1% : ... for IMG%=PIC1%+1 to 30000 if object_exists(IMG%) then exit_for next IMG% image IMG% ... delete IMG% delete PIC1% Comme ça, aucun conflit possible avec des numéros d'objets existants. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: WriteTextOverPicture Jeu 20 Fév 2014 - 18:37 | |
| Oui, c'est ce que je fais dans ce cas. | |
| | | Contenu sponsorisé
| Sujet: Re: WriteTextOverPicture | |
| |
| | | | WriteTextOverPicture | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |