Page 1 of 1

Using Say to draw

Posted: Wed Oct 08, 2008 9:13 pm
by reinaldocrespo
I recently read a post on the fwppc forum where a Tsay object is used to capture a signature using mouse movement. I've made some changes to suit my needs:

Code: Select all

function CaptureSignaure( oOwner )
local oDlg, ;
		oSig, ;
		nHdc, ;
		nOldX := -1, ;
		nOldY := -1, ;
		cFile := lower( GetTempDir() + "\signature.bmp" )

	DEFINE DIALOG oDlg TITLE "Signature" OF oOwner FROM 0,0 TO 150,350 PIXEL

	@ 15, 5 SAY oSig PROMPT "" SIZE 150, 40 PIXEL BORDER OF oDlg
	@ 01, 5 BUTTON "Clear" SIZE 25, 10 PIXEL ACTION oSig:refresh(.t.) OF oDlg 
	@ 01, 60 BUTTON "Save" SIZE 25, 10 PIXEL OF odlg ACTION ;
		( oSig:saveToBmp( cfile ), ;
		oSig:refresh(.t.), ;
		ReleaseDC( oSig:hWnd, oSig:hDC ), oDlg:end() )

	nHdc := GetDC( oSig:hWnd )

	oSig:bLButtonUp := { |x,y,z| DoDraw( nHdc, y+1, x+1,@noldx,@noldy ), nOldX := -1, nOldY := -1 }
	oSig:bMMoved := { |x,y,z| DoDraw( nHdc, y, x ,@noldx,@noldy) }
	oSig:bLClicked := { |x,y,z| DoDraw( nHdc, y, x ,@noldx,@noldy) }

	ACTIVATE DIALOG oDlg CENTER

return cFile

*------------------------------------------------------------------------------------------
STATIC Function DoDraw( hDc, x, y, noldx, noldy )

	If nOldX == -1 .And. nOldY == -1
		nOldX := x
		nOldY := y
		MoveToEx( hDC, x, y )
	Else
		LineTo( hDc,x,y )
	EndIf

RETURN Nil

*------------------------------------------------------------------------------------------
DLL STATIC FUNCTION MoveToEx( hWnd AS HDC, nX AS _INT, nY AS _INT, NULL AS _INT ) AS BOOL PASCAL LIB "coredll.dll"
But it does not work with fwh. Can someone help?



Reinaldo.

Posted: Thu Oct 09, 2008 9:34 pm
by yury
hello Mr.Reinaldo,

I dont have the coredll.dll , so I canĀ“t make a 100 % test... (I rem the call of the function MoveToEx)

I add this on your code:

oSig:lWantClick = .T.

before the activate the dialog, and the program draws a line, when I move the mouse, but not in the center of dialog (maybe because I dont use MoveToEx)

regards

Posted: Thu Oct 09, 2008 10:38 pm
by Antonio Linares
Reinaldo,

Here it is :-)

signatur.prg

Code: Select all

#include "FiveWin.ch" 

function CaptureSignature() 

   local oDlg, oSig, lPaint := .F., cFile := Lower( "signature.bmp" ), hDC 

   DEFINE DIALOG oDlg TITLE "Signature" FROM 0, 0 TO 150, 350 PIXEL 

   @ 15, 5 SAY oSig PROMPT "" SIZE 150, 40 PIXEL BORDER OF oDlg 
   
   @ 01, 5 BUTTON "Clear" SIZE 25, 10 PIXEL ACTION oSig:refresh(.t.) OF oDlg 
   
   @ 01, 60 BUTTON "Save" SIZE 25, 10 PIXEL OF odlg ;
      ACTION ( oSig:SaveToBmp( cFile ), oDlg:End() ) 

   oSig:lWantClick := .T.
   oSig:bLButtonUp := { | x, y, z | DoDraw( hDC, y+1, x+1, lPaint := .F. ) } 
   oSig:bMMoved    := { | x, y, z | DoDraw( hDC, y, x , lPaint ) } 
   oSig:bLClicked  := { | x, y, z | DoDraw( hDC, y, x, lPaint := .T. ) } 

   ACTIVATE DIALOG oDlg CENTER ;
      ON INIT ( hDC := GetDC( oSig:hWnd ) ) ;
      VALID ( ReleaseDC( oSig:hWnd, hDC ), .T. )

return nil

static function DoDraw( hDc, x, y, lPaint ) 

   if ! lPaint
      MoveTo( hDC, x, y ) 
   else 
      LineTo( hDc, x, y )
   endIf 

return nil

Posted: Thu Oct 09, 2008 10:55 pm
by reinaldocrespo
Antonio;

Sorry for the double posting and thank you for the solution.


Reinaldo.

Re: Using Say to draw

Posted: Sat Apr 25, 2009 6:36 am
by HunterEC
Antonio:

Can this program work with another input device besides the mouse ? Thank you.