Quando si usa clienttoscreen e screentoclient

Moderator: Enrico Maria Giordano

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

Quando si usa clienttoscreen e screentoclient

Post by Silvio »

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

Code: Select all


 // 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

 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

  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
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Quando si usa clienttoscreen e screentoclient

Post by Enrico Maria Giordano »

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

#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: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Quando si usa clienttoscreen e screentoclient

Post by Enrico Maria Giordano »

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

#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
Silvio
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Post by Silvio »

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
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Post by Enrico Maria Giordano »

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
Silvio
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Post by Silvio »

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

Post by Silvio »

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

Falconi Silvio
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Post by Enrico Maria Giordano »

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
Silvio
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Post by Silvio »

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

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

aAdd( aErr,ALLTRIM(StrToken(cdata,1,"," )))
premesso che ho dichiarato l'array

Code: Select all

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

 oImg:bLClicked = { | nRow, nCol | MyControl(oDlg, oImg, nRow, nCol,oImg1,aErr) }

il codeblock va a chiamare la mia funzioncina di controllo :

Code: Select all

 

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

129,342
39,282
254,73
188,108
107,113

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

Falconi Silvio
Post Reply