(APORTE) PickColor con Fuentes para sus Sistemas

User avatar
cuatecatl82
Posts: 614
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México
Contact:

(APORTE) PickColor con Fuentes para sus Sistemas

Post 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
Last edited by cuatecatl82 on Sat Jul 25, 2015 9:05 pm, edited 1 time in total.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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 :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
cuatecatl82
Posts: 614
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México
Contact:

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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
 
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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 .
jmartial
Posts: 457
Joined: Tue Mar 14, 2006 7:26 pm

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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.
Un Saludo,
Joaquín Martínez
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
cuatecatl82
Posts: 614
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México
Contact:

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
jmartial
Posts: 457
Joined: Tue Mar 14, 2006 7:26 pm

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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.
Un Saludo,
Joaquín Martínez
antolin
Posts: 475
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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.
Peaaaaaso de foro...
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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
 
User avatar
cuatecatl82
Posts: 614
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México
Contact:

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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)


 
User avatar
cuatecatl82
Posts: 614
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México
Contact:

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post 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 .
User avatar
AIDA
Posts: 782
Joined: Fri Jan 12, 2007 8:35 pm

Re: (APORTE) PickColor con Fuentes para sus Sistemas

Post by AIDA »

Hola
Me quede con los ojitos cuadrados se ve super bonito :shock:

ya lo baje esta super :D


saluditos... :wink:
Que es mejor que programar? creo que nada :)
Atropellada pero aqui ando :P

I love Fivewin

séʌǝɹ ןɐ ɐʇsǝ opunɯ ǝʇsǝ
Post Reply