Page 1 of 2
(APORTE) PickColor con Fuentes para sus Sistemas
Posted: Sat Jul 25, 2015 5:59 pm
by cuatecatl82
Saludos Compañeros del Foro:
Les comparto el trabajo que he desarrollado en esta semana ojala en algun momento les sea útil, aún me falta una función por terminar y que espero con ayuda de todos la podamos tener 100% funcional.
Es un generador de Colores en RGB, se pueden crear colores aleatorios en base a un rango específico, capturar el color de las paletas y almacenarlas en una tabla.
Me falta la parte más importante y que no encuentro como hacerla, capturar el color de un pixel fuera de nuestra aplicación:
Maestro Antonio y compañeros del foro: recurro a ustedes para que me orienten como hacer esta funcion, les dejo el Exe y las fuentes para que lo prueben y me comenten Saludos..
http://www.mediafire.com/download/5x6bj ... orPick.zip
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Sat Jul 25, 2015 6:48 pm
by Antonio Linares
Victor,
Lo acabo de probar: simplemente espectacular. Un trabajo impresionante. Enhorabuena
Has probado a capturar el ratón desde el diálogo del picker ?
oDlg:Capture()
cuando el usuario haga click en cualquier parte de la pantalla, saltará el evento ON CLICK del diálogo.
Intenta llegar hasta ahí y luego ya vemos como acceder al pixel.
Las imágenes que has puesto no se ven, intenta ponerlas porque son realmente buenas
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Sat Jul 25, 2015 9:42 pm
by cuatecatl82
Gracias Maestro Antonio por los Animos:
Las imagenes las cambie de Hosting ojala se puedan ver, cambie el archivo con las fuentes y les agrege las imagenes.
Le comento que ya habia planteado y probado lo que me comenta, pero solo detecta las coordenadas del click del puntero dentro del Dialogo más no fuera, tampoco hace el cambio de cursor al que le indico con SetCursor, al hacer MSGINFO(hCursor) me devuelve un valor de 7079303 que indica que lo tiene en memoria, este es el código:
Code: Select all
Static Function PickColor()
Local oDlg, oClr, oBtn1, oBtn2, oHnd, oCur, aCor
local lSalida:= .F.
Local hCursor:= LoadCursor(GetResources(),"PICK")
// Cursor("PICK") -->> No Cambia el cursor a +
Define CURSOR oCur Resource "ARROW"
Define CURSOR oHnd Resource "SELECT"
Define DIALOG oDlg Resource "CAPTURAR"
Redefine SAY oClr PROMPT " " ID 100 Of oDlg UPDATE
RedeFine BUTTONBMP oBtn1 RESOURCE "GUARDAR" ID 200 Of oDlg ACTION (Msgstop(Str(cColor[1])+","+str(cColor[2])+","+str(cColor[3]),"Guardando"))
RedeFine BUTTONBMP oBtn2 RESOURCE "TERMINAR" ID 300 Of oDlg ACTION (lSalida:= .T., CursorWE(), oDlg:End())
oClr:SetColor(nRGB(cColor[1],cColor[2],cColor[3]), nRGB(cColor[1],cColor[2],cColor[3]))
oClr:lWantClick:= .T.
oClr:oCursor:= oCur
oDlg:oCursor:= oCur
oDlg:bInit:= { || SetCursor(hCursor) }
oDlg:Capture()
oDlg:bLClicked:= { || aCor:= GetCursorPos() , Msginfo(aCor[1],aCor[2]), ReleaseCapture() }
oBtn1:oCursor:= oHnd
oBtn1:cTooltip:= { "Guardar Color Capturado", "GetSysColor", 1 }
oBtn2:oCursor:= oHnd
oBtn2:cTooltip:= { "Salir del Capturador de Color", "GetSysColor", 3 }
Activate DIALOG oDlg Centered on Init(SetWindowPos( oDlg:hWnd, -1, 0, 0, 0, 0, 3 ), Self) Valid(Self,lSalida)
RETURN Nil
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Sun Jul 26, 2015 9:26 am
by mastintin
y si en vez usar odlg:capture() usas SetCapture( GetDesktopWindow() ) , ¿ no te captura toda la pantalla ? .
La duda me surge si captura los pixeles del desktop o los de las ventanas debujadas sobre él .
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Sun Jul 26, 2015 10:09 am
by jmartial
Buenas,
No sé si es una barbaridad, pero si haces una "foto" a la pantalla capturandola como un bitmap, y abres en modal esa imágen en un diálogo tipo splash, de los que ocupan toda la pantalla, recoges en ese diálogo el color del pixel y luego lo cierras.
Lo que no sé es si el usuario notará el truco.
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Sun Jul 26, 2015 10:42 am
by Antonio Linares
Victor,
Prueba asi:
Code: Select all
#include "FiveWin.ch"
function Main()
local oDlg, oBtn
DEFINE DIALOG oDlg
@ 0.5, 1.5 BUTTON oBtn PROMPT "Capture" SIZE 30, 30 ;
ACTION oDlg:Capture()
oBtn:bGotFocus = { || oDlg:Capture() }
ACTIVATE DIALOG oDlg CENTERED ;
ON CLICK MsgInfo( "click" )
return nil
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Sun Jul 26, 2015 6:57 pm
by cuatecatl82
Gracias Maestro Antonio:
Funciona igual, solo captura el click dentro del dialogo en areas donde no hay otros objetos, el ejemplo que propocriona Uwe
http://forums.fivetechsupport.com/viewt ... 70#p179970 es perfecto, pero por desgracia no proporciona su cóodigo fuente para entender como hacerlo..
Sigo investigando.
Joaquín Martínez y mastintin: gracias por su idea, ya la habia probado tambien, el efecto de la pantalla de se, le vi sus detalles, la primera es que haciendo un PrintScren la calidad de la imagen no es exactamente igual y el tamaño del archivo dejan que desear en cuanto calidad, y la mas importante es que esteticamente truena, la idea es que sea completamente transparente como cualquier programa de pago.. Saludos.
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Sun Jul 26, 2015 9:49 pm
by jmartial
Buenas,
Ahora no puedo mirarlo, pero no es un printscreen, ni pierde calidad, ni el usuario tiene que hacer nada.
Es copiar en memoria la pantalla y mostrarla ocupando toda la pantalla.
Si quieres, mañana te puedo mirar algo.
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Mon Jul 27, 2015 8:02 am
by antolin
Hola. Porque no lo intentas con WindowFromPoint(), nunca he utilizado esa función, pero según la guía de funciones te devuelve el hwnd correspondiente a unas coordenadas. Primero captura las coordenadas con GetCursorPos(), las cambias a coordenadas de pantalla con ClientToScreen(), se las pasas a WindowFromPoint() y después averiguas el color con GetPixel(). En teoría debería funcionar. Con probar...
Un saludo.
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Mon Jul 27, 2015 8:13 am
by mastintin
Veo que ya lo teneis solucionado ...
yo he creado mi version usando gdi+
la pongo aqui por si a alguien le sirve . Usa una captura de pantalla tradicional y crea un bmp gdi+ para luego hacer lo que queramos con el , grabar la pantalla como png ,bmp ,jpg ,capturar sus pixeles , etc...
codigo a añadir a gdiplus.cpp
Code: Select all
HB_FUNC( GDIPLUSCAPTURESCREEN )
{
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
HWND hDesktopWnd = GetDesktopWindow();
HDC hDesktopDC = GetDC(hDesktopWnd);
HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);
HBITMAP hCaptureBitmap =CreateCompatibleBitmap(hDesktopDC,
nScreenWidth, nScreenHeight);
SelectObject(hCaptureDC,hCaptureBitmap);
BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight,
hDesktopDC,0,0,SRCCOPY|CAPTUREBLT);
Bitmap * newImage = new Bitmap( hCaptureBitmap , NULL );
ReleaseDC(hDesktopWnd,hDesktopDC);
DeleteDC(hCaptureDC);
DeleteObject(hCaptureBitmap);
hb_retnl( ( HB_LONG ) newImage );
}
un ejemplo funcionando usando el sample de Antonio.
Code: Select all
#include "FiveWin.ch"
function Main()
local oDlg, oBtn
DEFINE DIALOG oDlg
@ 0.5, 1.5 BUTTON oBtn PROMPT "Capture" SIZE 30, 30 ;
ACTION oDlg:Capture()
oBtn:bGotFocus = { || oDlg:Capture() }
ACTIVATE DIALOG oDlg CENTERED ;
ON CLICK capturapan(odlg)
return nil
Function capturapan(odlg)
local nRed,nGreen, nBlue
local aPix := GetCursorPos()
local oGBmp := GdiBmp():new()
oGBmp:hBmp:= GDIPLUSCAPTURESCREEN()
nRed := oGBmp:GetRedPix( aPix[2], aPix[1])
nGreen := oGBmp:GetGreenPix( aPix[2], aPix[1])
nBlue := oGBmp:GetBluePix( aPix[2], aPix[1])
msginfo( "color " + str( nred) + " "+str(nGreen) +" " + str(nblue ) )
odlg:setcolor ( , nrgb(nred,nGreen,nblue) )
odlg:refresh()
RETURN NIL
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Mon Jul 27, 2015 6:19 pm
by cuatecatl82
Mastintin:
Gracias por tu aporte, te comento que lo probe, compile tu ejemplo y agregue lafuncion que compartes, al lanzar la aplicacion me muestra el boton "capture" y al hacer click me aparece un mensaje que dice "ficheros no encontrados" y termina con un error:
Application
===========
Path and name: E:\Fivewin\PRUEBAS\WinColors\ColorPick.Exe (32 bits)
Size: 3,880,960 bytes
Compiler version: Harbour 3.2.0dev (r1412151448)
FiveWin Version: FWH 11.11
Windows version: 5.1, Build 2600 Service Pack 3
Time from start: 0 hours 0 mins 3 secs
Error occurred at: 07/27/15, 12:57:52
Error description: Error BASE/1004 Message not found: GDIBMP:GETREDPIX
Args:
[ 1] = O GDIBMP
Stack Calls
===========
Called from: => __ERRRT_SBASE( 0 )
Called from: ../../../tobject.prg => GDIBMP:ERROR( 0 )
Called from: ../../../tobject.prg => (b)HBOBJECT( 0 )
Called from: ../../../tobject.prg => GDIBMP:MSGNOTFOUND( 0 )
Called from: ../../../tobject.prg => GDIBMP:GETREDPIX( 0 )
Called from: ColorPick.prg => CAPTURAPAN( 28 )
Called from: ColorPick.prg => (b)MAIN( 17 )
Called from: .\source\classes\WINDOW.PRG => TDIALOG:LBUTTONDOWN( 2008 )
Called from: => TWINDOW:HANDLEEVENT( 0 )
Called from: .\source\classes\DIALOG.PRG => TDIALOG:HANDLEEVENT( 902 )
Called from: => DIALOGBOXINDIRECT( 0 )
Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE( 286 )
Called from: ColorPick.prg => MAIN( 17 )
System
======
CPU type: Intel(R) Pentium(R) D CPU 3.20GHz 3200 Mhz
Hardware memory: 1022 megs
Free System resources: 90 %
GDI resources: 90 %
User resources: 90 %
Windows total applications running: 6
1 ,
2 , C:\WINDOWS\WinSxS\X86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83
3 , C:\WINDOWS\system32\SHLWAPI.dll
4 , E:\Fivewin\PRUEBAS\WinColors\ColorPick.Exe
5 GDI+ Window, C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.5512_x-ww_dfb54e0c\GDIPLUS
6 SysFader, C:\WINDOWS\system32\SHELL32.DLL
Variables in use
================
Procedure Type Value
==========================
__ERRRT_SBASE
Param 1: O Class: ERROR
GDIBMP:ERROR
Param 1: N 13
Param 2: N 1004
Param 3: C "Message not found"
Param 4: C "GDIBMP:GETREDPIX"
Param 5: N 1
Param 6: O Class: GDIBMP
Local 1: U
Local 2: U
(b)HBOBJECT
Param 1: C "Message not found"
Param 2: C "GDIBMP"
Param 3: C "GETREDPIX"
Param 4: N 1004
GDIBMP:MSGNOTFOUND
Param 1: O Class: GDIBMP
Param 2: C "GETREDPIX"
Param 3: N 755
Param 4: N 436
GDIBMP:GETREDPIX
Param 1: C "GETREDPIX"
Param 2: N 755
Param 3: N 436
CAPTURAPAN
Param 1: N 755
Param 2: N 436
(b)MAIN
Param 1: O Class: TDIALOG
Local 1: U
Local 2: U
Local 3: U
Local 4: A Len: 2
Local 5: O Class: GDIBMP
TDIALOG:LBUTTONDOWN
Param 1: N 50
Param 2: N 114
Param 3: N 1
Param 4: O Class: TDIALOG
TWINDOW:HANDLEEVENT
Param 1: N 50
Param 2: N 114
Param 3: N 1
TDIALOG:HANDLEEVENT
Param 1: N 513
Param 2: N 1
Param 3: N 3276914
DIALOGBOXINDIRECT
Param 1: N 513
Param 2: N 1
Param 3: N 3276914
TDIALOG:ACTIVATE
Param 1: N 4194304
Param 2: C "€ È€ Ÿ L P e B U T T O N C a p t u r e "
Param 3: N 0
Param 4: O Class: TDIALOG
MAIN
Param 1: B {|| ... }
Param 2: U
Param 3: U
Param 4: L .T.
Param 5: U
Param 6: L .T.
Param 7: U
Param 8: U
Param 9: U
Param 10: L .F.
Param 11: L .F.
Local 1: N 0
Local 2: S
Local 3: O Class: TDIALOG
Linked RDDs
===========
DBF
DBFFPT
DBFBLOB
DBFNTX
DataBases in use
================
Classes in use:
===============
1 ERROR
2 HBCLASS
3 HBOBJECT
4 TWINDOW
5 TDIALOG
6 TBRUSH
7 TCONTROL
8 TBUTTON
9 TFONT
10 TRECT
11 GDIBMP
12 TREG32
Memory Analysis
===============
213 Static variables
Dynamic memory consume:
Actual Value: 0 bytes
Highest Value: 0 bytes
Creo que no tengo soporte completo a GDIPlus. Gracias.. Sigo investigando.
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Tue Jul 28, 2015 6:42 am
by mastintin
cuatecatl82 wrote:Mastintin:
Creo que no tengo soporte completo a GDIPlus. Gracias.. Sigo investigando.
Parece que te faltan funciones ....
Añade estas a gdiplus.cpp
Code: Select all
HB_FUNC( GDIPLUSIMAGEPIXGETRED )
{
Bitmap * newImage = ( Bitmap * ) hb_parnl( 1 );
int nX = hb_parni( 2 );
int nY = hb_parni( 3 );
Color pixelColor;
newImage->GetPixel(nX, nY, &pixelColor );
long nR = pixelColor.GetR();
hb_retnl( nR );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSIMAGEPIXGETBLUE )
{
Bitmap * newImage = ( Bitmap * ) hb_parnl( 1 );
int nX = hb_parni( 2 );
int nY = hb_parni( 3 );
Color pixelColor;
newImage->GetPixel(nX, nY, &pixelColor );
long nB = pixelColor.GetB();
hb_retnl( nB );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSIMAGEPIXGETGREEN )
{
Bitmap * newImage = ( Bitmap * ) hb_parnl( 1 );
int nX = hb_parni( 2 );
int nY = hb_parni( 3 );
Color pixelColor;
newImage->GetPixel(nX, nY, &pixelColor );
long nG = pixelColor.GetG();
hb_retnl( nG );
}
y cambia esto en el codigo ...
Code: Select all
//nRed := oGBmp:GetRedPix( aPix[2], aPix[1])
//nGreen := oGBmp:GetGreenPix( aPix[2], aPix[1])
//nBlue := oGBmp:GetBluePix( aPix[2], aPix[1])
nRed:= GDIPLUSIMAGEPIXGetRed(oGbmp:hbmp,aPix[2]-1, aPix[1]-1) // se resta uno pues el primer pixel es el 0,0
nGreen:= GDIPLUSIMAGEPIXGetGreen(oGbmp:hbmp,aPix[2]-1, aPix[1]-1)
nBlue:= GDIPLUSIMAGEPIXGetTBlue(oGbmp:hbmp,aPix[2]-1, aPix[1]-1)
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Tue Jul 28, 2015 6:17 pm
by cuatecatl82
Excelente funciona ya captura el color, hay que hacer unas modicaciones para evitar que en el boton de Guardar o Salir tambien capture el color pero ya hay avance, lo único que no me gusta es que al capturar el color siempre me manda un msginfo diciendo "ficheros no encotrados", ¿Que ficheros busca o son necesarios?
Saludos..
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Wed Jul 29, 2015 6:47 am
by mastintin
cuatecatl82 wrote: lo único que no me gusta es que al capturar el color siempre me manda un msginfo diciendo "ficheros no encotrados", ¿Que ficheros busca o son necesarios?
Saludos..
¿? . ¿Puedes poner una pausa ( msginfo() ) despues de ogbmp:= tgdibmp():new() ? a ver si sale antes o despues de tu pausa. Me da que es un problema de la implementación que tienes del methodo new de tgdiplus ( es el único sitio que se me ocurre que busque ficheros ) .Mira en él a ver si existe un mensaje similar .
Re: (APORTE) PickColor con Fuentes para sus Sistemas
Posted: Thu Dec 05, 2019 5:22 pm
by AIDA
Hola
Me quede con los ojitos cuadrados se ve super bonito
ya lo baje esta super
saluditos...