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.

Image

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:

Image


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 :shock:

ya lo baje esta super :D


saluditos... :wink: