ASI
/*
- autor: wmormar, INCOS -
wmormar@hotmail.com - fecha: 31 . octubre . 2008
- hora: 03.11
*/
#include "fivewin.ch"
FUNCTION main()
LOCAL oBmp
LOCAL tCalc32
LOCAL oCalculator
Local lIncrustar:=.f.
//LOCAL this := Self
LOCAL lSalir := .f.
/*
IF ::oCalculator:classname() == "TDIALOG"
::oCalculator:restore()
::oCalculator:setfocus()
RETURN NIL
ENDIF
DEFINE DIALOG oCalculator RESOURCE "CALCULADORA" TITLE ".:: Calculadora ::." COLOR CLR_BLUE,CLR_WHITE
*/
tCalc32 := TCalculator()
DEFINE WINDOW oCalculator MDI TITLE ".:: Calculadora ::." COLOR CLR_BLUE,CLR_WHITE
DEFINE BITMAP oBmp FILE "calc.bmp" OF oCalculator //TRANSPARENT
oCalculator:bLDblClick := {|| tCalc32:cerrar_programa()}
oCalculator:bRClicked := {|| iif( !lIncrustar,;
(tCalc32:incrustar_calculadora( oCalculator ),lIncrustar:=.t.);
,)}
//oCalculator:bRClicked := {|| tCalc32:normal()}
ACTIVATE WINDOW oCalculator
/*
ON INIT equis(this:oCalculator:hWnd) ;
VALID lSalir */
RETURN NIL
///////////////////////////////////////////////////////////////////////////////
/*
Tomado: Recursos visualbasic
Fecha: 31 . octubre . 2008
Hora: 02.48
INCOS, wmormar
*/
#include "fivewin.ch"
#include "CStruct.ch"
#include "wintypes.ch"
// Constante para la llamada dinámica del API
#define DC_CALL_STD 0x0020
#define SHOWMAXIMIZED_eSW 3
// Constante para usar con el Api DeleteMenu
#define MF_BYPOSITION 0x400
#define MF_REMOVE 0x1000
// Constante para usar con el Api SendMessage para cerrar
// la aplicación ( en este caso La calculadora )
#define SC_CLOSE 61536
#define WM_SYSCOMMAND 274
// Constante para usar con GetWindowLong y SetWindowLong
#define GWL_STYLE -16
// Constantes para SetWindowPos
#define SWP_FRAMECHANGED 0x0020
#define SWP_NOMOVE 0x0002
#define SWP_NOSIZE 0x0001
#define SWP_NOZORDER 0x0004
#define HWND_TOP 0
CLASS TCalculator
// Mantiene el Handle del programa
DATA hwnd
DATA hwndcalc
DATA cTitlecalculator AS CHARACTER INIT "Calculadora"
DATA ocontainer AS OBJECT
DATA nTime AS NUMERIC INIT 25000
METHOD normal()
METHOD barra_titulo( lErase )
METHOD Eliminar_Menu( hwnd )
METHOD Cerrar_Programa( hwnd )
METHOD Cerrar_Programa( hwnd )
METHOD incrustar_calculadora( ocontainer )
METHOD Incrustar( hwnd )
METHOD liberar_programa( hwnd )
METHOD GetMenu( hwnd )
METHOD DeleteMenu( hmenu, nposition, wflags )
METHOD GetMenuItemCount( hmenu )
METHOD DrawMenuBar( hwnd )
METHOD GetWindowLong( hwnd, nindex )
METHOD SetWindowLong( hwnd, nindex, dwnewlong )
METHOD SetWindowPos( hwnd, hwndinsertafter, x, y, cx, cy, wflags )
ENDCLASS
/*******************************************************************/
// Cargando calculadora normal de windows
METHOD normal()
ShellExecute( ::hwnd,,"calc.exe",,, )
RETURN NIL
/*******************************************************************/
// Elimina y reestablece la barra de título de una ventana
METHOD barra_titulo( hwnd, lErase )
LOCAL nStyle
// Almacena en la variable el estilo actual
nStyle := ::GetWindowLong( hwnd, GWL_STYLE )
IF lErase
nStyle := nor( nStyle, WS_CAPTION )
ELSE
nStyle += nor( WS_CAPTION )
ENDIF
// Aplica el nuevo estilo
::SetWindowLong( hwnd, GWL_STYLE, nStyle )
// Mueve de posición la calculadora
::SetWindowPos( ::hwndcalc, HWND_TOP, 0, 0, 0, 0, ;
nor( SWP_FRAMECHANGED, SWP_NOMOVE, SWP_NOSIZE, SWP_NOZORDER ) )
RETURN NIL
/*******************************************************************/
//Elimina el menú de una ventana específica
METHOD Eliminar_Menu( hwnd )
LOCAL hmenu
LOCAL nmenu
LOCAL i
// Recuper el hwnd del menu del programa
hmenu := ::GetMenu( hwnd )
IF hmenu <> 0
// cantidad de menúes
nmenu := ::GetMenuItemCount( hmenu )
IF nmenu > 0
// Recorre todos los menú y los elimina
FOR i := 1 To nmenu
::DeleteMenu( hmenu, 0, nor(MF_BYPOSITION, MF_REMOVE) )
NEXT
// Repinta la barra de menú
::DrawMenuBar( hwnd )
ENDIF
ENDIF
RETURN NIL
/*******************************************************************/
// Cierra
METHOD Cerrar_Programa( hwnd )
DEFAULT hwnd := ::hwndcalc
// Cierra el programa abierto, en este caso la calculadora
SendMessage( hwnd, WM_SYSCOMMAND, SC_CLOSE, 0 )
RETURN .t.
/*******************************************************************/
// mete la ventana en el contenedor
METHOD incrustar_calculadora( ocontainer )
LOCAL aRect := {}
LOCAL nLoop := 0
::ocontainer := ocontainer
::hwndcalc := NIL
// Handle de la aplicación
::hwndcalc := FindWindow( 0, ::cTitlecalculator )
IF ::hwndcalc > 0
::Cerrar_Programa( ::hwndcalc )
::hwndcalc := NIL
ENDIF
// Abre el programa
MSGRUN( "Ejecutando calculadora...",, ;
{|| ShellExecute( ,,"C:\DusaSoft\Sueldos\sueldos.exe",,, )} )
"" aca en vez de calc.exe uso este .exe" WHILE nLoop <= ::nTime
// Handle de la aplicación
::hwndcalc := FindWindow( 0, ::cTitlecalculator )
IF ::hwndcalc <> 0
EXIT
ENDIF
SYSREFRESH()
nLoop += 1
ENDDO
// Ocultando la calculadora
ShowWindow( ::hwndcalc, 0 )
// Recupera el ancho y alto del área cliente
//aRect := GetClientRect( ::hwndcalc )
// Redimensiona el picturebox al ancho y alto del programa
//::ocontainer:nWidth := ( aRect[4] - aRect[2] ) + 25
//::ocontainer:nHeight := ( aRect[3] - aRect[1] ) + 55
// Elimina la barra de título, los menúes y lo incrusta
::Eliminar_Menu( ::hwndcalc )
::Barra_Titulo( ::hwndcalc, .t. )
::Incrustar( ::hwndcalc )
::ocontainer:refresh()
RETURN NIL
/*******************************************************************/
METHOD Incrustar( hwnd )
LOCAL nret
// Lo metemos dentro del ocontainer
SetParent( hwnd, ::ocontainer:hwnd )
// Maximizamos la ventana incrustada dentro del contenedor, mediante el _
// Api showWindow, pasándole la constante SHOWMAXIMIZED_eSW
nret := ShowWindow( hwnd, SHOWMAXIMIZED_eSW )
RETURN .t.
/*******************************************************************/
// Libera la ventana pasándole en el segundo
// parámetro el valor 0 y la cierra
METHOD liberar_programa( hwnd )
// Libera el programa
SetParent( hwnd, 0 )
// Lo cierra
::Cerrar_Programa( hwnd )
hwnd := 0
RETURN NIL
/*******************************************************************/
// Recupera el Hwnd de un menú
METHOD GetMenu( hwnd )
LOCAL pCallTemplate
LOCAL nRet
// create call template on first call
pCallTemplate := DllPrepareCall( ;
"user32.dll" , ; // external DLL
DC_CALL_STD , ; // calling convention
"GetMenu" ) // external function
nRet := DllExecuteCall( pCallTemplate, hwnd )
RETURN nRet
/*******************************************************************/
// Elimina el menú de una aplicación
METHOD DeleteMenu( hmenu, nposition, wflags )
LOCAL pCallTemplate
LOCAL nRet
// create call template on first call
pCallTemplate := DllPrepareCall( ;
"user32.dll" , ;
DC_CALL_STD , ;
"DeleteMenu" )
nRet := DllExecuteCall( pCallTemplate, hmenu, nposition, wflags )
RETURN nRet
/*******************************************************************/
// Recupera la cantidad de Item de menúes para saber cuantos hay que eliminar
METHOD GetMenuItemCount( hmenu )
LOCAL pCallTemplate
LOCAL nRet
// create call template on first call
pCallTemplate := DllPrepareCall( ;
"user32.dll" , ;
DC_CALL_STD , ;
"GetMenuItemCount" )
nRet := DllExecuteCall( pCallTemplate, hmenu )
RETURN nRet
/*******************************************************************/
// Redibuja - repinta la barra de menú luego de eliminarlo
METHOD DrawMenuBar( hwnd )
LOCAL pCallTemplate
LOCAL nRet
// create call template on first call
pCallTemplate := DllPrepareCall( ;
"user32.dll" , ;
DC_CALL_STD , ;
"DrawMenuBar" )
nRet := DllExecuteCall( pCallTemplate, hwnd )
RETURN nRet
/*******************************************************************/
// Estas tres funciones es para eliminar la barra de título
// del programa que se va a incrustar
METHOD GetWindowLong( hwnd, nindex )
LOCAL pCallTemplate
LOCAL nRet
// create call template on first call
pCallTemplate := DllPrepareCall( ;
"user32.dll" , ;
DC_CALL_STD , ;
"GetWindowLongA" )
nRet := DllExecuteCall( pCallTemplate, hwnd, nindex )
RETURN nRet
/*******************************************************************/
METHOD SetWindowLong( hwnd, nindex, dwnewlong )
LOCAL pCallTemplate
LOCAL nRet
// create call template on first call
pCallTemplate := DllPrepareCall( ;
"user32.dll" , ;
DC_CALL_STD , ;
"SetWindowLongA" )
nRet := DllExecuteCall( pCallTemplate, hwnd, nindex, dwnewlong )
RETURN nRet
/*******************************************************************/
METHOD SetWindowPos( hwnd, hwndinsertafter, x, y, cx, cy, wflags )
LOCAL pCallTemplate
LOCAL nRet
// create call template on first call
pCallTemplate := DllPrepareCall( ;
"user32.dll" , ;
DC_CALL_STD , ;
"SetWindowPos" )
nRet := DllExecuteCall( pCallTemplate, hwnd, hwndinsertafter, x, y, cx, cy, wflags )
RETURN nRet
/*******************************************************************/