Page 1 of 1
Due problemini
Posted: Fri Apr 14, 2006 10:38 pm
by Silvio
1) Qualcuno di voi sa dirmi se è possibile premere su un'immagine con il mouse e la procedura mi restituisce le coordinate esatte dove ha "puntato" il mouse ?
2)E' possibile creare un piccolo cerchio rosso nel punto dove ha cliccato il mouse sempre sull'immagine per determinare appunto l'area interessata ?
Re: Due problemini
Posted: Sat Apr 15, 2006 9:26 am
by Enrico Maria Giordano
Silvio wrote:1) Qualcuno di voi sa dirmi se è possibile premere su un'immagine con il mouse e la procedura mi restituisce le coordinate esatte dove ha "puntato" il mouse ?
Al codeblock bLClicked vengono passate automaticamente tali coordinate:
oImg:bLClicked = { | nRow, nCol | MyFunc( nRow, nCol ) }
Silvio wrote:2)E' possibile creare un piccolo cerchio rosso nel punto dove ha cliccato il mouse sempre sull'immagine per determinare appunto l'area interessata ?
Usa il codeblock di cui sopra unito ai vari esempi di cerchi che ti ho preparato in passato.
EMG
Posted: Sat Apr 15, 2006 12:54 pm
by Silvio
Grazie Emg
cmq tu credi che si possa fare su un immagine jpg?
Posted: Sat Apr 15, 2006 1:12 pm
by Enrico Maria Giordano
Certo, basta utilizzare la classe TImage.
EMG
Posted: Sat Apr 15, 2006 1:17 pm
by Silvio
mi da errore non trova hdc
Code: Select all | Expand
Error occurred at: 08/01/03, 14:08:12
Error description: Error BASE/1003 Variable does not exist: HDC
Code: Select all | Expand
#include "Fivewin.ch"
#include "Image.ch"
FUNCTION MAIN()
LOCAL oDlg
Local oImg
LOCAL nX := 100
LOCAL nY := 100
LOCAL nMinRad := 20
LOCAL nMaxRad := 100
LOCAL nStep := 10
DEFINE DIALOG oDlg;
SIZE 600, 400
@ 0, 0 IMAGE oImg SIZE 150, 150 OF oDlg ADJUST
oImg:Progress( .f. )
oImg:bLClicked = { | nRow, nCol | CIRCLES( oDlg, hDC, nRow, nCol, nMinRad, nMaxRad, nStep ) }
@ 1, 28 BUTTON "Select Image" SIZE 50,10 OF oDlg ACTION GetImage( oImg )
ACTIVATE DIALOG oDlg CENTER
// ON PAINT CIRCLES( oDlg, hDC, nX, nY, nMinRad, nMaxRad, nStep );
RETURN NIL
#define BRUSH_NULL 5
STATIC FUNCTION CIRCLES( oDlg, hDC, nX, nY, nMinRad, nMaxRad, nStep )
LOCAL hOldBrush := SELECTOBJECT( hDC, GETSTOCKOBJECT( BRUSH_NULL ) )
LOCAL i
FOR i = nMinRad TO nMaxRad STEP nStep
oDlg:Circle( nX - i, nY - i, i * 2 )
NEXT
SELECTOBJECT( hDC, hOldBrush )
RETURN NIL
//----------------------------------------------------------------------------//
function GetImage( oImg )
local gcFile := cGetFile( "Bitmap (*.bmp)| *.bmp|" + ;
"DIB (*.dib)| *.dib|" + ;
"PCX (*.pcx)| *.pcx|" + ;
"JPEG (*.jpg)| *.jpg|" + ;
"GIF (*.gif)| *.gif|" + ;
"TARGA (*.tga)| *.tga|" + ;
"RLE (*.rle)| *.rle|" + ;
"All Files (*.*)| *.*" ;
,"Please select a image file", 4 )
if ! Empty( gcFile ) .and. File( gcFile )
oImg:LoadBmp( gcFile )
endif
return nil
[/code]
Posted: Sat Apr 15, 2006 1:26 pm
by Enrico Maria Giordano
Devi utilizzare i metodi
hDC = oDlg:GetDC()
e alla fine
oDlg:ReleaseDC()
EMG
Posted: Sat Apr 15, 2006 1:33 pm
by Silvio
ma dentro alla funzione circle ?
o in main
ma perchè non se lo prende da solo ?
Posted: Sat Apr 15, 2006 2:00 pm
by Enrico Maria Giordano
Dentro la funzione Circle(). Non se la prende da solo perché non sei nella ON PAINT. Guardati le classi. Ci sono quanti esempi vuoi di questa tecnica.
EMG
Posted: Sat Apr 15, 2006 2:05 pm
by Silvio
SCUSAMI MA
l'avevo già messa dentro circle ma mi dava errore lo stesso
cmq dopo il caffè riprovo....
cmq BUONA PASQUA A TE E ALLA TUA FAMIGLIA
Posted: Sat Apr 15, 2006 2:12 pm
by Enrico Maria Giordano
Così funziona:
Code: Select all | Expand
#include "Fivewin.ch"
#include "Image.ch"
FUNCTION MAIN()
LOCAL oDlg
Local oImg
LOCAL nX := 100
LOCAL nY := 100
LOCAL nMinRad := 20
LOCAL nMaxRad := 100
LOCAL nStep := 10
DEFINE DIALOG oDlg;
SIZE 600, 400
@ 0, 0 IMAGE oImg SIZE 150, 150 OF oDlg ADJUST
oImg:Progress( .f. )
oImg:bLClicked = { | nRow, nCol | CIRCLES( oDlg, nRow, nCol, nMinRad, nMaxRad, nStep ) }
@ 1, 28 BUTTON "Select Image" SIZE 50,10 OF oDlg ACTION GetImage( oImg )
ACTIVATE DIALOG oDlg CENTER
// ON PAINT CIRCLES( oDlg, hDC, nX, nY, nMinRad, nMaxRad, nStep );
RETURN NIL
#define BRUSH_NULL 5
STATIC FUNCTION CIRCLES( oDlg, nX, nY, nMinRad, nMaxRad, nStep )
LOCAL hDC := oDlg:GetDC()
LOCAL hOldBrush := SELECTOBJECT( hDC, GETSTOCKOBJECT( BRUSH_NULL ) )
LOCAL i
FOR i = nMinRad TO nMaxRad STEP nStep
oDlg:Circle( nX - i, nY - i, i * 2 )
NEXT
SELECTOBJECT( hDC, hOldBrush )
oDlg:ReleaseDC()
RETURN NIL
//----------------------------------------------------------------------------//
function GetImage( oImg )
local gcFile := cGetFile( "Bitmap (*.bmp)| *.bmp|" + ;
"DIB (*.dib)| *.dib|" + ;
"PCX (*.pcx)| *.pcx|" + ;
"JPEG (*.jpg)| *.jpg|" + ;
"GIF (*.gif)| *.gif|" + ;
"TARGA (*.tga)| *.tga|" + ;
"RLE (*.rle)| *.rle|" + ;
"All Files (*.*)| *.*" ;
,"Please select a image file", 4 )
if ! Empty( gcFile ) .and. File( gcFile )
oImg:LoadBmp( gcFile )
endif
return nil
EMG
Posted: Sat Apr 15, 2006 3:26 pm
by Silvio
si c'ero gia arrivato
Ma...
hai visto cosa fa ?
se io premo in 145,145 lui crea il cerchio a 137 circa
io ho inserito per vedere se crea il cerchio nelle cordinate giuste :
prima :
oImg:bLClicked = { | nRow, nCol |( NMSGBOX(NrOW,NcOL),CIRCLES( oDlg, nRow, nCol, nMinRad, nMaxRad, nStep )) }
e poi nella funzione circle
// PER FARE UN CERCHIETTO
oDlg:Circle( nX , nY , 50 )
? NX
?NY
ho levato i cerchi concentrici in questo programma mi serve un solo cerchio( rosso/verde) max 50/60 di diametro
Posted: Sat Apr 15, 2006 3:28 pm
by Silvio
la funzione circle è stata moificata cosi :
Code: Select all | Expand
STATIC FUNCTION CIRCLES( oDlg, nX, nY, nMinRad, nMaxRad, nStep )
LOCAL hDC := oDlg:GetDC()
LOCAL hOldBrush := SELECTOBJECT( hDC, GETSTOCKOBJECT( BRUSH_NULL ) )
// PER FARE UN CERCHIETTO
oDlg:Circle( nX , nY , 50 )
? NX
?NY
SELECTOBJECT( hDC, hOldBrush )
oDlg:ReleaseDC()
RETURN NIL