Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Guardar y recuperar color pixel originales de una zona pantalla (https://www.clubdelphi.com/foros/showthread.php?t=85218)

NEG1414 07-03-2014 12:02:56

Buenas...

Veo escafandra, que tienes mas pacienza que el Santo Job ... Al revisar tu nuevo algoritmo note que era muy similar al ultimo que yo habia implementado: en el que la aplicacion Refresh no me mostraba el panel encima del TImage pero lo mostraba fuera de este, en el resto del componente (no aplique Imagen->Align = alClient).... Partiendo de que es muy raro (por no decir imposible) que muestres un algoritmo que no funcione.. me plantee si el error no era que el TPanel se mostrase en "segundo plano" (por debajo del TImage) y .. Eureka.. el error por que no me el muestra el TPanel encima del TIMage es que no reconoce la accion pulsar botones raton cuando el cursor esta encima de este.. que es cuando debe de visualizarlo o no...

Código:


 void __fastcall  WMLbuttonDown (Messages::TMessage Message);
 void __fastcall  WMRbuttonDown (Messages::TMessage Message);
 BEGIN_MESSAGE_MAP
  VCL_MESSAGE_HANDLER(WM_RBUTTONDOWN, TMessage, WMRbuttonDown);
  VCL_MESSAGE_HANDLER(WM_LBUTTONDOWN, TMessage, WMLbuttonDown);
 END_MESSAGE_MAP (TWinControl);
 
 void __fastcall  TPrueba::WMLbuttonDown (TMessage Message)
  {
      MostrarPanel
 
 void __fastcall  TPrueba::WMRbuttonDown (TMessage Message)
  {
      AnularPanel


Ahora solo me queda detectar cuando se acciona el raton sobre el TIMage

Muchisimas gracias por tu pacienza.

escafandra 07-03-2014 19:33:06

El sistema de pintado de rayas es el mismo que tu pusiste, quería que el código comenzase a serte familiar.

Tienes una forma de detectar las pulsaciones del ratón que es asignar los eventos del mismo a una función tuya, exactamente como lo haces en el entorno visual con un formulario. La mecánica sería OnEvento = MiFuncion. Esto es aplicable a cualquier evento del control sobre el que trabajes, sólo tienes que declarar tu función como se declara el evento y asignar el puntero. De esta forma to tienes que capturar los mensajes de Windows, reservando esa técnica para cuando el control no reacciona a cierto evento que te interese.

Para ilustrar el tema te pongo un ejemplo sobre el anterior:
Código:

class TPrueba: public TWinControl
{
  __published:
    void __fastcall PruebaMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); 
  private:
    TImage *Imagen;
    TPanel *Panel;
  public:
  __fastcall TPrueba(TComponent* Owner);
};

Código:

__fastcall TPrueba::TPrueba(TComponent* Owner): TWinControl(Owner)
{
  Imagen = new TImage(this);
  Imagen->Parent = this;
  Imagen->Align = alClient;
  for(int y=0; y<200; y++) {
    if((y%2)==0){Imagen->Canvas->Pen->Color = clRed;}else{Imagen->Canvas->Pen->Color = clBlue;}
    Imagen->Canvas->Pen->Width = 1;
    Imagen->Canvas->MoveTo(0,y);
    Imagen->Canvas->LineTo(199,y);
  }

  Panel = new TPanel(this);
  Panel->Top = 0;
  Panel->Left = 0;
  Panel->Width = 20;
  Panel->Height = 20;
  Panel->Parent = this;

  Imagen->OnMouseDown = PruebaMouseDown;  // Asignando el evento del TImage...
}

void __fastcall TPrueba::PruebaMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
  // Tu respuesta al ratón
}


Saludos.

NEG1414 11-03-2014 22:05:04

Buenas

Gracias por contestarme escafandra...recurro a ti otra vez (espero que sea ya la ultima) por que temgo problemas a la hora de dimensionar el componente TWinControl

Código:

__fastcall TPrueba::TPrueba(TComponent* Owner)
        : TWinControl(Owner)
{
  Width = 1000;
  Height= 1000;

  Grafica = new  TImage(this);
  Grafica->Parent  = this;
  Grafica->Align  = alClient;

  ...............................
  ..............................

no dimensiona el componente

y si quiero redimensionar e TImage en tiempo de ejecucion

Código:

void TPrueba::Pintar()
{

  Grafica->Width =200;
  Grafica->Height=200;

no lo hace...

Que hago mal....
Gracias


La franja horaria es GMT +2. Ahora son las 12:00:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi