LOCAL oForm
oForm = CREATEOBJECT("Tform")
oForm.Show(1)
* end of main
DEFINE CLASS Tform As Form
#DEFINE WM_CAP_START 0x0400
#DEFINE WM_CAP_DRIVER_CONNECT (WM_CAP_START+10)
#DEFINE WM_CAP_DRIVER_DISCONNECT (WM_CAP_START+11)
#DEFINE WM_CAP_DRIVER_GET_CAPS (WM_CAP_START+14)
#DEFINE WM_CAP_SET_PREVIEW (WM_CAP_START+50)
#DEFINE WM_CAP_SET_OVERLAY (WM_CAP_START+51)
#DEFINE WM_CAP_SET_PREVIEWRATE (WM_CAP_START+52)
#DEFINE WM_CAP_GET_STATUS (WM_CAP_START+54)
#DEFINE WM_CAP_GRAB_FRAME (WM_CAP_START+60)
Width=660
Height=560
Autocenter=.T.
Caption="Capturar Foto"
MinButton=.F.
MaxButton=.F.
ICON = "200785027.ico"
CLOSABLE = .F.
SHOWWINDOW = 1
windowtype = 1
hWindow=0
hCapture=0
capWidth=0
capHeight=0
capOverlay=0
ADD OBJECT cmdGetFrame As CommandButton WITH
Default=.T.,;
Left=15, Top=490, Height=27, Width=90, Caption="Capturar",;
Enabled=.F.
ADD OBJECT cmdPreview As CommandButton WITH
Default=.T.,;
Left=106, Top=490, Height=27, Width=100, Caption="Activar camara",;
Enabled=.F.
ADD OBJECT cmdClose As CommandButton WITH
Cancel=.T.,;
Left=250, Top=490, Height=27, Width=70, Caption="Cerrar"
PROCEDURE Activate
IF THIS.hWindow = 0
DECLARE INTEGER GetFocus IN user32
THIS.hWindow = GetFocus()
THIS.CreateCaptureWindow
THIS.DriverConnect
ENDIF
PROCEDURE Destroy
THIS.ReleaseCaptureWindow
PROCEDURE cmdClose.Click
ThisForm.Release
PROCEDURE cmdGetFrame.Click
ThisForm.GetFrame
MESSAGEBOX("Archivo generado en
"+sys(5)+sys(2003)+"\captura\"+"capfoto.jpg",64,"Captura realizada")
ThisForm.StartPreview
PROCEDURE cmdPreview.Click
ThisForm.StartPreview
PROCEDURE GetFrame
#DEFINE WM_CAP_FILE_SAVEDIB (WM_CAP_START + 25)
LOCAL lcFile
lcFile = "" && File name to create
lcFile = "c:\temp\sample.bmp"
xF = 0
DO WHILE .T.
xF = xF + 1
lcfile =
"captura\Cntr"+ALLTRIM(STR(xf))+".jpg"
IF !FILE(lcfile )
EXIT
ENDIF
ENDDO
*lcfile =
sys(5)+sys(2003)+"\captura\"+"capfoto.jpg"
THIS.msg(WM_CAP_GRAB_FRAME, 0,0)
THIS.msg(WM_CAP_FILE_SAVEDIB, 0, lcFile,1)
tHIS.msg(WM_CAP_GRAB_FRAME, 0,0)
RETURN
PROCEDURE CreateCaptureWindow
#DEFINE WS_CHILD 0x40000000
#DEFINE WS_VISIBLE 0x10000000
DECLARE INTEGER capCreateCaptureWindow IN avicap32;
STRING lpszWindowName, LONG dwStyle,;
INTEGER x, INTEGER y,;
INTEGER nWidth, INTEGER nHeight,;
INTEGER hParent, INTEGER nID
THIS.hCapture =
capCreateCaptureWindow("",WS_CHILD+WS_VISIBLE,10,8,640,480, THIS.hWindow,1)
PROCEDURE DriverConnect
THIS.msg(WM_CAP_DRIVER_CONNECT, 0,0)
IF THIS.IsCaptureConnected()
THIS.GetCaptureDimensions
STORE .T. TO
THIS.cmdGetFrame.Enabled,;
THIS.cmdPreview.Enabled
THIS.Caption = THIS.Caption + ":
conectado, " +;
LTRIM(STR(THIS.capWidth)) + "x"
+;
LTRIM(STR(THIS.capHeight))
ELSE
THIS.Caption = THIS.Caption + ":
falla al conectar"
ENDIF
PROCEDURE DriverDisconnect
THIS.msg(WM_CAP_DRIVER_DISCONNECT, 0,0)
PROCEDURE ReleaseCaptureWindow
IF THIS.hCapture <> 0
THIS.DriverDisconnect
DECLARE INTEGER DestroyWindow IN
user32 INTEGER hWnd
= DestroyWindow(THIS.hCapture)
THIS.hCapture = 0
ENDIF
PROCEDURE msg(msg, wParam, lParam, nMode)
IF THIS.hCapture = 0
RETURN
ENDIF
IF VARTYPE(nMode) <> "N" Or nMode=0
DECLARE INTEGER SendMessage IN
user32;
INTEGER hWnd, INTEGER Msg,;
INTEGER wParam, INTEGER lParam
= SendMessage(THIS.hCapture,
msg, wParam, lParam)
ELSE
DECLARE INTEGER SendMessage IN
user32;
INTEGER hWnd, INTEGER Msg,;
INTEGER wParam, STRING @lParam
= SendMessage(THIS.hCapture,
msg, wParam, @lParam)
ENDIF
FUNCTION IsCaptureConnected
* analyzing fCaptureInitialized member of the
CAPDRIVERCAPS structure
#DEFINE CAPDRIVERCAPS_SIZE 44
LOCAL cBuffer, nResult
cBuffer =
Repli(Chr(0),CAPDRIVERCAPS_SIZE)
THIS.msg(WM_CAP_DRIVER_GET_CAPS,
Len(cBuffer), @cBuffer, 1)
THIS.capOverlay =
buf2dword(SUBSTR(cBuffer,5,4))
nResult = Asc(SUBSTR(cBuffer,
21,1))
RETURN (nResult<>0)
PROCEDURE GetCaptureDimensions
* reading uiImageWidth and uiImageHeight members
* of the CAPSTATUS structure
#DEFINE CAPSTATUS_SIZE 76
LOCAL cBuffer
cBuffer = Repli(Chr(0), CAPSTATUS_SIZE)
THIS.msg(WM_CAP_GET_STATUS, Len(cBuffer), @cBuffer, 1)
THIS.capWidth = buf2dword(SUBSTR(cBuffer,1,4))
THIS.capHeight = buf2dword(SUBSTR(cBuffer,5,4))
PROCEDURE StartPreview
THIS.msg(WM_CAP_SET_PREVIEWRATE,
30,0)
THIS.msg(WM_CAP_SET_PREVIEW,
1,0)
IF THIS.capOverlay <> 0
THIS.msg(WM_CAP_SET_OVERLAY,
1,0)
ENDIF
PROCEDURE StopPreview
THIS.msg(WM_CAP_SET_PREVIEW, 0,0)
ENDDEFINE
FUNCTION buf2dword(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +;
BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)