Quando si usa clienttoscreen e screentoclient

Moderator: Enrico Maria Giordano

Quando si usa clienttoscreen e screentoclient

Postby Silvio » Tue Apr 18, 2006 12:02 am

se io clicco su un immagine al punto ( x,y) mettiamo 282,282

Code: Select all  Expand view

// prima immagine modificata
            @ 0,15 SAY "MODIFICATA"  OF oDlg
            @ 2,0 IMAGE oImg   SIZE 150,150 OF oDlg

            oImg:Progress( .f. )

            //Disegno il cerchietto dove premo
            oImg:bLClicked = { | nRow, nCol | (NMSGBOX(NROW,NCOL),DRAWCIRCLE( oDLG,  nRow, nCol, 100, CLR_HRED ))  }





io voglio far disegnare in quel punto un cerchietto rosso la funzione qui sotto me lo disegna un po spostato..

Code: Select all  Expand view
STATIC FUNCTION DRAWCIRCLE( oDLG,  nTop, nLeft, nWidth, nColor )
             LOCAL   hDC := oDlg:GetDC()
             LOCAL hPen := CREATEPEN( PS_SOLID, 2, nColor )
             LOCAL hOldPen   := SELECTOBJECT( hDC, hPen )
             LOCAL hOldBrush := SELECTOBJECT( hDC, GETSTOCKOBJECT( BRUSH_NULL ) )

              oDlg:Circle( nTop, nLeft, nWidth )

              SELECTOBJECT( hDC, hOldPen )
              SELECTOBJECT( hDC, hOldBrush )

              DELETEOBJECT( hPen )

    RETURN NIL




quando invece io carico la stessa dialog con la stessa immagine e gli faccio disegnare manualmente un cerchio a quelle coordinate

Code: Select all  Expand view
  DRAWCIRCLE( oDLG,39, 282, 23, CLR_HGREEN )


la procedura mi disegna ilcerchietto addirittura fuori del dialog in uno spazio dello schermo in alto

come è possibile ?

Qualche idea ?
Best Regards, Saludos

Falconi Silvio
User avatar
Silvio
 
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Re: Quando si usa clienttoscreen e screentoclient

Postby Enrico Maria Giordano » Tue Apr 18, 2006 7:20 am

Con il seguente esempio non noto alcuno spostamento anomalo sia con il posizionamento automatico (che ho abbinato al tasto sinistro) che con quello manuale (che ho abbinato al tasto destro):

Code: Select all  Expand view
#include "Fivewin.ch"


#define BRUSH_NULL 5


FUNCTION MAIN()

    LOCAL oDlg, oImg

    DEFINE DIALOG oDlg;
           SIZE 700, 500

    @ 0, 0 IMAGE oImg;
           FILE "\fwharbour\bitmaps\magic.bmp";
           ADJUST

    oImg:bLClicked = { | nRow, nCol | DrawCircle( oDlg, nRow, nCol, 100, CLR_HRED ) }

    oImg:bRClicked = { || DrawCircle( oDlg, 50, 50, 100, CLR_HRED ) }

    ACTIVATE DIALOG oDlg;
             ON INIT oDlg:SetControl( oImg );
             CENTER

    RETURN NIL


STATIC FUNCTION DRAWCIRCLE( oDlg, nTop, nLeft, nWidth, nColor )

    LOCAL hDC := oDlg:GetDC()

    LOCAL hPen := CREATEPEN( PS_SOLID, 1, nColor )

    LOCAL hOldPen   := SELECTOBJECT( hDC, hPen )
    LOCAL hOldBrush := SELECTOBJECT( hDC, GETSTOCKOBJECT( BRUSH_NULL ) )

    oDlg:Circle( nTop - nWidth / 2, nLeft - nWidth / 2, nWidth )

    SELECTOBJECT( hDC, hOldPen )
    SELECTOBJECT( hDC, hOldBrush )

    DELETEOBJECT( hPen )

    oDlg:ReleaseDC()

    RETURN NIL


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8315
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Quando si usa clienttoscreen e screentoclient

Postby Enrico Maria Giordano » Tue Apr 18, 2006 7:23 am

Ma credo di aver capito il tuo problema. Probabilmente dimenticavi di aggiungere lo spostamento dell'immagine rispetto alla dialog. Eccoti un altro esempio modificato rispetto al precedente:

Code: Select all  Expand view
#include "Fivewin.ch"


#define BRUSH_NULL 5


FUNCTION MAIN()

    LOCAL oDlg, oImg

    DEFINE DIALOG oDlg;
           SIZE 700, 500

    @ 2, 0 IMAGE oImg;
           FILE "\fwharbour\bitmaps\magic.bmp";
           ADJUST

    oImg:bLClicked = { | nRow, nCol | DrawCircle( oDlg, oImg, nRow, nCol, 100, CLR_HRED ) }

    oImg:bRClicked = { || DrawCircle( oDlg, oImg, 50, 50, 100, CLR_HRED ) }

    ACTIVATE DIALOG oDlg;
             ON INIT oImg:SetSize( 320, 200 );
             CENTER

    RETURN NIL


STATIC FUNCTION DRAWCIRCLE( oDlg, oImg, nTop, nLeft, nWidth, nColor )

    LOCAL hDC := oDlg:GetDC()

    LOCAL hPen := CREATEPEN( PS_SOLID, 1, nColor )

    LOCAL hOldPen   := SELECTOBJECT( hDC, hPen )
    LOCAL hOldBrush := SELECTOBJECT( hDC, GETSTOCKOBJECT( BRUSH_NULL ) )

    oDlg:Circle( nTop - nWidth / 2 + oImg:nTop, nLeft - nWidth / 2 + oImg:nLeft, nWidth )

    SELECTOBJECT( hDC, hOldPen )
    SELECTOBJECT( hDC, hOldBrush )

    DELETEOBJECT( hPen )

    oDlg:ReleaseDC()

    RETURN NIL


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8315
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Silvio » Tue Apr 18, 2006 9:54 am

grazie EMG
oggi provo le tue idee ma ierisera avevo modificato drawcircle inserendo alposto di oDlg oImg e stranamente tutti i punti ( cerchietti) mi si visualizavano correttamente .

Però non mi piace parlare di una cosa senza sapere qual'è lo scopo :

Ti spiego :

io avevo fatto in PHP un gioco che è il semplice gioco delle differenze
dato che non loposso usare perchè il server ( vecchio Netfinity3000) mi da problemi hopensato di trasformato il game in fw e xharbour con molte difficoltà

Ho due immagini (377, 314) una originale e l'altra modificata : lo scopo del gioco è di riuscire in minor tempo di trovare le differenze

quindi io avrei fatto un archivio ( dbf) con l'elenco delle immagini ( ori,Mod) e poi le coordinate degli errori (x,y) in PHP uso anche un terzo paramentro per il diametro del cerchietto ma in fw posso anche ometterlo.

Quindi adesso con l'aiuto di Linares e il TUO siamo arrivati a prendere ( random) un record e visualizzare le immagini(377,314) su una dialog , sull'immagine modificata posso cliccare e creare un cerchietto rosso

A questo punto il programma dovrebbe riconoscere che cliccando sull'immagine mopdificata nel punto x,y clicca sulle coordinate esatte di un errore e accettare il "cliccamento" e visualizzare con un cerchietto verde nell'altra immagine quella oroginale altrimenti non fa niente.

Domandina semplice se carico le coordinate in un array aIMG[5] come gliele carico dato che sono 2 parametri (x,y) per ogni errore ?

e poi quando l'utente clicca come posso vedere se le coordinate sono giuste?


p.s. questa è un 'idea semplice e carina per far capire a quelli che programmano in Delphi e VB che (clipper) harbour e xharbour non servono solo a fare gestionali!!!!!!!!!!!


grazie
Best Regards, Saludos

Falconi Silvio
User avatar
Silvio
 
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Postby Enrico Maria Giordano » Tue Apr 18, 2006 11:11 am

Silvio wrote:Domandina semplice se carico le coordinate in un array aIMG[5] come gliele carico dato che sono 2 parametri (x,y) per ogni errore ?


Per ogni elemento dell'array memorizza un array di due elementi. Es.:

aImg = { { 1, 2 }, { 3, 4 }, ... }

Silvio wrote:e poi quando l'utente clicca come posso vedere se le coordinate sono giuste?


Confronta quelle (nRow, nCol) che ti passa il codeblock con quelle memorizzate nell'array.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8315
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Silvio » Tue Apr 18, 2006 2:56 pm

grazie
io normalmente per caricare un array ad una dimensione faccio

AAdd(aErr,"")
AAdd(aErr,img->errx)

ma essendo due paramentri (x,y) non saprei farlo dove posso andare a vedere un esempio ?
Best Regards, Saludos

Falconi Silvio
User avatar
Silvio
 
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Postby Silvio » Tue Apr 18, 2006 2:59 pm

cmq ho provato e funzia bene :adesso dove clicco disegna il cerchietto!!!
Best Regards, Saludos

Falconi Silvio
User avatar
Silvio
 
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Postby Enrico Maria Giordano » Tue Apr 18, 2006 4:20 pm

Silvio wrote:grazie
io normalmente per caricare un array ad una dimensione faccio

AAdd(aErr,"")
AAdd(aErr,img->errx)

ma essendo due paramentri (x,y) non saprei farlo dove posso andare a vedere un esempio ?


AAdd( aErr, { valore1, valore2 } )

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8315
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Silvio » Tue Apr 18, 2006 10:38 pm

Dapprima volevo usare un dbf ma poi ho pensato che dato che ho gia per ogni immagine un file ascii con le coordinate potrei usare quello e allora ho pensato :

Code: Select all  Expand view
function GetImage( oImg, oImg1,aErr )
   LOCAL gcFile,gcFile, cScelto
   LOCAL aJPGs := Directory( "generale/*.jpg" )

       if Len( aJPGs ) > 0

         cScelto:=  nRandom( Len( aJPGs ) )
         ?  cScelto

   else
      MsgAlert( "No JPGs images found!" )
   endif





    //prendo le immagini
      gcFile:="generale/"+AllTrim(Str(cScelto)+"_ORI.JPG"
      gcFile1:="generale/"+AllTrim(Str(cScelto)+"_MOD.JPG"

      // E LE CARICO
      oImg:LoadBmp( gcFile)
      oImg1:LoadBmp( gcFile1)

     // prendo il file
        cFile := AllTrim(Str(cScelto)+".pl")
        cData := MEMOREAD( "generale/"+cFile)



quindi secondo il mio ragionamento tra tutti i file che sono nella cartella generale prendo un file

carico l'originale e quello modificato

poi voglio leggere il file ascii corrispondente a quel file xx.pl

a questo punto dovrei caricare dentro l'array i valori delle coordinate degli errori :

Code: Select all  Expand view
aAdd( aErr,ALLTRIM(StrToken(cdata,1,"," )))


premesso che ho dichiarato l'array
Code: Select all  Expand view
LOCAL aErr:= {}


anche se io so già che sono sempre 5 errori


poi ritornando al programma main quando l'utente ha la possibilità di cliccare sull'immagine per segnare la parte errata dell'immagine :

Code: Select all  Expand view
oImg:bLClicked = { | nRow, nCol | MyControl(oDlg, oImg, nRow, nCol,oImg1,aErr) }



il codeblock va a chiamare la mia funzioncina di controllo :

Code: Select all  Expand view


FUNCTION MyControl(oDlg, oImg, nRow, nCol,oImg1,aErr)

                   LOCAL cRow := ALLTRIM(STR(nRow))
                   LOCAL cCol := ALLTRIM(STR(nCol))
                   LOCAL cFind := cCol + "," + cRow

                     IF aScan( aErr, cFind ) # 0
                         // it's in the array!!
                               // se le coordinate sono uguali
                                // scrivo i cerchietti

                       DrawCircle( oDlg, oImg, nRow, nCol, 50, CLR_HRED)
                       DrawCircle( oDlg, oImg1, nRow, nCol, 50, CLR_HGREEN)
                               ELSE

                         // it's not in the array
                 // Altrimenti levo un po di tempo e suono un rumore strano
                // avvertendo l'utente che ha sbagliato
                       EndIF


         RETURN NIL



ma purtroppo non funziona ....
dove sta l'inghippo ?

il file xx.pl è un normale file ascii per esempio 1.pl contenente:


Code: Select all  Expand view
129,342
39,282
254,73
188,108
107,113



qualche idea ?
se vuoi posso postare il file
Best Regards, Saludos

Falconi Silvio
User avatar
Silvio
 
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy


Return to All products support

Who is online

Users browsing this forum: No registered users and 24 guests

cron