Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Panel con color degradado (https://www.clubdelphi.com/foros/showthread.php?t=71363)

NEG1414 15-12-2010 12:22:09

Panel con color degradado
 
Buenas...

Buscando he encontrada este codigo (Gracias Cesar) que realiza un degradado del color (de Azul a Rojo) de un Form.


Código:

void TForm1::PintarDegradadoH(TCanvas *canvas, TRect& rect, TColor c1, TColor c2,
    int nTonos)
{
    c1 = static_cast<TColor>( ColorToRGB(clNavy) );
    c2 = static_cast<TColor>( ColorToRGB(clRed) );
    //rojo
    int Rf = GetRValue(c1);
    int Rd = GetRValue(c2)-Rf;
    // verde
    int Gf = GetGValue(c1);
    int Gd = GetGValue(c2)-Gf;
    // azul
    int Bf = GetBValue(c1);
    int Bd = GetBValue(c2)-Bf;
    Canvas->Brush->Style =bsClear;
    canvas->Unlock();
    int R, G, B;
    float incremento = (float)nTonos/ (rect.right>1?rect.right:1);
    for (int i= rect.left; i < rect.right; i++)
    {
        R = Rf + MulDiv(incremento * i , Rd , nTonos);
        G = Gf + MulDiv(incremento * i , Gd , nTonos);
        B = Bf + MulDiv(incremento * i , Bd , nTonos);
        //Canvas->Pen->Color = (Graphics::TColor)RGB(R, G, B);
        canvas->Pen->Color = (TColor) RGB(R, G, B);
        Canvas->MoveTo(i, rect.Bottom );
        Canvas->LineTo(i, rect.Top);
        Canvas->FrameRect(rect);
    }
    canvas->Brush->Color = clRed;
    Canvas->DrawFocusRect(rect);
    canvas->Lock();
}



//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)
{
  PintarDegradadoH(this->Canvas,(TRect )this->GetClientRect(),clBtnFace,clBlack,95);
}

Necesito hacer lo mismo pero solo en un Panel de ese Form ...Alguien puede Indicarme como puedo adaptar el codigo para que realize el degradado solo en el panel

Gracias....

Ñuño Martínez 15-12-2010 12:48:01

Simplemente pasándole al método "PintarDegradadoH" el Canvas del panel.

NEG1414 15-12-2010 13:34:43

Gracias por contestar...

He puesto en el evento Click del Panel la llamada a PintarDegradado

Código:

void __fastcall TForm1::Panel1Click(TObject *Sender)
{
PintarDegradadoH(this->Canvas,(TRect &)this->GetClientRect(),clBtnFace,clBlack,95);
}

entra en la funcion al Hacer Click sobre el Panel pero no hace nada ..

coso 15-12-2010 13:50:52

this->canvas enfoca al canvas del form, no del panel. Prueba Panel1->canvas

NEG1414 15-12-2010 14:17:44

Gracias po contestar

he puesto

Código:

  PintarDegradadoH(Panel1->Canvas,(TRect &)this->GetClientRect(),clBtnFace,clBlack,95);
Tanto en el evento PaintForm1 como en el evento ClickPanel1 y me da los siguientes errores

'TCustomControl::Canvas is not accesible'
'Type mistmatch in parameter 'Canvas' (wanted 'TCanvas *', got 'TCanvas *')

escafandra 15-12-2010 17:20:14

El problema es que el Canvas de un TPanel no es accesible. Pero nada te impide crear uno nuevo.

Vamos a realizar algún cambio en la función de degradado y reescribimos el evento OnPaint

Código:

void TForm1::PintarDegradadoH(TCanvas *Canvas, TRect& rect, TColor c1, TColor c2,
    int nTonos)
{
    c1 = static_cast<TColor>( ColorToRGB(c1) );
    c2 = static_cast<TColor>( ColorToRGB(c2) );
    //rojo
    int Rf = GetRValue(c1);
    int Rd = GetRValue(c2)-Rf;
    // verde
    int Gf = GetGValue(c1);
    int Gd = GetGValue(c2)-Gf;
    // azul
    int Bf = GetBValue(c1);
    int Bd = GetBValue(c2)-Bf;

//    Canvas->Brush->Style =bsClear;
    int R, G, B;
    float incremento = (float)nTonos/ (rect.right>1?rect.right:1);
    for (int i= rect.left; i < rect.right; i++)
    {
        R = Rf + MulDiv(incremento * i , Rd , nTonos);
        G = Gf + MulDiv(incremento * i , Gd , nTonos);
        B = Bf + MulDiv(incremento * i , Bd , nTonos);
//        Canvas->Pen->Color = (Graphics::TColor)RGB(R, G, B);
        Canvas->Pen->Color = (TColor) RGB(R, G, B);
        Canvas->MoveTo(i, rect.Bottom);
        Canvas->LineTo(i, rect.Top);
        Canvas->FrameRect(rect);
    }
//    Canvas->Brush->Color = clRed;
//    Canvas->DrawFocusRect(rect);
}




void __fastcall TForm1::FormPaint(TObject *Sender)
{
  TControlCanvas *CV = new TControlCanvas;
  CV->Control = Panel1;
  Panel1->Update();
  TRect R;
  ::GetClientRect(Panel1->Handle, &R);
  PintarDegradadoH(CV, R, clBtnFace, clBlack, 95);
  delete CV;
}

Saludos.

NEG1414 15-12-2010 17:51:05

Gracias por contestar escafranda ..

de esa manera en el panel se degrada el color pero la degradacion no es completa si el el Panel no es lo suficientemente Ancho...si la degradacione es de Azul a Rojo la degradacion no llega al rojo si el ancho es menor de Aprox
Whith = 350 (que es lo que yo necesitaba)

Gracias

escafandra 15-12-2010 18:06:54

Vuelve a comprobarlo. Edite el mensaje con algún cambio mas en la función de degradado. A mi me funciona Ok.



Saludos. ;)

NEG1414 15-12-2010 19:26:09

Como siempre tenias razon..funciona correctamente

la culpa era mia habia cometido un error:(

Muchas Gracias


La franja horaria es GMT +2. Ahora son las 10:45:24.

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