Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Imprimir el contenido completo del ScrollBox

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Imprimir el contenido completo del ScrollBox Responder citando

¿Cómo puedo imprimir el contenido completo (incluyendo la parte no visible) de un TScrollBox? ¿Es posible?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Éxito! Si alguien necesita, aquí está el código:

Código:


void __fastcall TForm1::ScrollBoxPaintTo(TScrollBox *ScrollBox,HDC DC,int X,int Y,int Wid,int Hei)
{
    int I, EdgeFlags, BorderFlags, SaveIndex;
    TRect R;

    ScrollBox->ControlState=ScrollBox->ControlState<<csPaintCopy>Handle, GWL_EXSTYLE) & WS_EX_CLIENTEDGE != 0 )
    {
        EdgeFlags  = EDGE_SUNKEN;
        BorderFlags = BF_RECT | BF_ADJUST;
    }
    else if( GetWindowLong(ScrollBox->Handle, GWL_STYLE) & WS_BORDER != 0 )
    {
        EdgeFlags = BDR_OUTER;
        BorderFlags = BF_RECT | BF_ADJUST | BF_MONO;
    }

    if( BorderFlags !=0)
    {
        R=Rect( 0, 0, Wid, Hei);
        DrawEdge(DC, &R, EdgeFlags, BorderFlags);
        MoveWindowOrg(DC, R.Left, R.Top);
        IntersectClipRect(DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top);
    }

    //?? ??? ?? ...
    //scroll?? ??? ?? ???
// ScrollBox->Perform(WM_ERASEBKGND, (int)DC, 0);
// ScrollBox->Perform(WM_PAINT, (int)DC, 0);

    for ( int i=0;i<ScrollBox>ControlCount;i++)
    {
        if(ScrollBox->Controls[i]->Visible)
        {
            if(ScrollBox->Controls[i]->InheritsFrom(__classid(TWinControl)))
            {
                ((TWinControl *)ScrollBox->Controls[i])->PaintTo(DC,ScrollBox->Controls[i]->Left+ScrollBox->HorzScrollBar->Position ,ScrollBox->Controls[i]->Top+ScrollBox->VertScrollBar->Position);
            }
            else if(ScrollBox->Controls[i]->InheritsFrom(__classid(TGraphicControl)))
            {
                 MoveWindowOrg(DC, ScrollBox->Controls[i]->Left+ScrollBox->HorzScrollBar->Position, ScrollBox->Controls[i]->Top+ScrollBox->VertScrollBar->Position);
                ((TGraphicControl *)ScrollBox->Controls[i])->Perform(WM_PAINT,(int)DC,0);// PaintTo(DC,ScrollBox->Controls[i]->Left+ScrollBox->HorzScrollBar->Position ,ScrollBox->Controls[i]->Top+ScrollBox->VertScrollBar->Position);
                 MoveWindowOrg(DC, -ScrollBox->Controls[i]->Left-ScrollBox->HorzScrollBar->Position, -ScrollBox->Controls[i]->Top-ScrollBox->VertScrollBar->Position);//MoveWindowOrg(DC, R.Left, R.Top);
            }
        }
    }
    ScrollBox->ControlState=ScrollBox->ControlState>>csPaintCopy;// Exclude(FControlState, csPaintCopy);

}

//==========================================================================

Graphics::TBitmap * __fastcall TForm1::GetScrollBoxImage(TScrollBox *ScrollBox)
{
    if(ScrollBox==NULL)return NULL;

    Graphics::TBitmap *bmp=NULL;
    TRect rc=Rect(0,0,ScrollBox->HorzScrollBar->Range,ScrollBox->VertScrollBar->Range);

    bmp=new Graphics::TBitmap;

    bmp->Width=ScrollBox->HorzScrollBar->Range; //ScrollBox->ClientWidth;
    bmp->Height=ScrollBox->VertScrollBar->Range; //ScrollBox->ClientHeight;
    bmp->Canvas->Brush = ScrollBox->Brush;
    bmp->Canvas->FillRect(rc);//ScrollBox->ClientRect);
    bmp->Canvas->Lock();

    try
    {
        int Ofs=0;
        if(GetWindowLong(ScrollBox->Handle, GWL_STYLE) & WS_BORDER )
            Ofs = -1;  // Don't draw form border
        else
            Ofs = 0;  // There is no border

        ScrollBoxPaintTo(ScrollBox,bmp->Canvas->Handle,Ofs, Ofs, rc.right,rc.bottom);
     //ScrollBox->PaintTo(bmp->Canvas->Handle, Ofs, Ofs);

    }
    __finally
    {
        bmp->Canvas->Unlock();
    }

    return bmp;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
    Graphics::TBitmap *bmp;

    bmp=GetScrollBoxImage(ScrollBox1);
// bmp->SaveToFile("C:\\TestScrollBoxImage.bmp");
    Image1->Picture->Bitmap->Assign(bmp);
    Image1->AutoSize=true;
    delete bmp;
}
//---------------------------------------------------------------------------




fuente: http://sdw8001.tistory.com/101


Ultima edición por Felip el Jue 01 Sep, 2011 1:20 pm, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿Por qué la instrucción bmp->Canvas->Lock(); borra el Text del TComboBox en la imagen?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

He encontrado otra página ( http://pasotech.altervista.org/delphi/articolo110.htm ) con código fuente en Delphi ( http://pasotech.altervista.org/delphi/codice/Scroll2Bmp.7z ) :

Código:

function ScrollControl2Bmp(
               ScrollControl: TScrollingWinControl;
               BmpFileName: string
               ): Boolean;
var
  Bmp: TBitmap;
  R: TRect;
  Dc: HDC;
  AC: TCanvas;
  BmpW: TRect;
  P: Integer;

begin
  Result := False;

  Bmp := TBitmap.Create;
  Bmp.Width := ScrollControl.HorzScrollbar.Range + 8;
  Bmp.Height := ScrollControl.VertScrollbar.Range + 8;
  DC := GetWindowDc(ScrollControl.Handle);
  AC := TCanvas.Create;
  AC.handle := DC;
  ScrollControl.HorzScrollBar.Position := 0;
  ScrollControl.VertScrollBar.Position := 0;
  Application.ProcessMessages;
  R := ScrollControl.ClientRect;
  R.Top  := 2;
  R.Left := 2;
  BmpW   := R;
  repeat
    repeat
      Application.ProcessMessages;
      Bmp.Canvas.CopyRect(BmpW, ac, r);
      P := ScrollControl.HorzScrollBar.Position;
      ScrollControl.HorzScrollBar.Position := P + 20;
      if P <> ScrollControl.HorzScrollBar.Position then
        begin
          BmpW.Left := Bmpw.Left+20;
          BmpW.Right := Bmpw.Right+20;
          Application.ProcessMessages;
        end;
    until P = ScrollControl.HorzScrollBar.Position;
    P := ScrollControl.VertScrollBar.Position;
    ScrollControl.VertScrollBar.Position := P + 20;
    Application.ProcessMessages;
    if P <> ScrollControl.VertScrollBar.Position then
      begin
        BmpW.Top := Bmpw.Top+20;
        Bmpw.Bottom := BmpW.Bottom+20;
        Bmpw.Left := R.Left;
        Bmpw.Right := R.Right;
        Application.ProcessMessages;
      end;
    ScrollControl.HorzScrollBar.Position := 0;
    Application.ProcessMessages;
  until P = ScrollControl.VertScrollBar.Position;
  Bmp.SaveToFile(BmpFileName);
  Bmp.Free;

  Result := True;
end;




pero en C + + Builder no está funcionando:

Código:

bool  __fastcall TForm1::ScrollControl2Bmp( TScrollingWinControl  *ScrollControl , AnsiString  BmpFileName )
{

/*var*/
 Graphics::TBitmap *Bmp;
 TRect R;
 HDC DC;
 TCanvas *AC;
 TRect BmpW;
 int P;

// b e g i n
//  return  False;

  Bmp = new Graphics::TBitmap();
  Bmp->Width = ScrollControl->HorzScrollBar->Range + 8;
  Bmp->Height = ScrollControl->VertScrollBar->Range + 8;
  DC = GetWindowDC(ScrollControl->Handle);
  AC = new TCanvas();
  AC->Handle = DC;
  ScrollControl->HorzScrollBar->Position = 0;
  ScrollControl->VertScrollBar->Position = 0;
  Application->ProcessMessages();
  R = ScrollControl->ClientRect;
  R.Top  = 2;
  R.Left = 2;
  BmpW   = R;
  do  {
    do {//repeat
      Application->ProcessMessages();
      Bmp->Canvas->CopyRect(BmpW, AC, R);
      P = ScrollControl->HorzScrollBar->Position;
      ScrollControl->HorzScrollBar->Position = P + 20;
      if ( P != ScrollControl->HorzScrollBar->Position )
        {
          BmpW.Left = BmpW.Left+20;
          BmpW.Right = BmpW.Right+20;
          Application->ProcessMessages();
        }
    }  while (  P == ScrollControl->HorzScrollBar->Position );
    P = ScrollControl->VertScrollBar->Position;
    ScrollControl->VertScrollBar->Position = P + 20;
    Application->ProcessMessages();
    if ( P != ScrollControl->VertScrollBar->Position )
      {
        BmpW.Top = BmpW.Top+20;
        BmpW.Bottom = BmpW.Bottom+20;
        BmpW.Left = R.Left;
        BmpW.Right = R.Right;
        Application->ProcessMessages();
      }
    ScrollControl->HorzScrollBar->Position = 0;
    Application->ProcessMessages();
  }  while ( P == ScrollControl->VertScrollBar->Position);

//  Bmp->SaveToFile(BmpFileName);


    Image2->Picture->Bitmap->Assign(Bmp);
    Image2->AutoSize=true;

  delete Bmp;

  return  True;
}


Es posible que me he perdido en algún lugar de la conversión. ¿Pueden ayudarme?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Felip escribió:
pero en C + + Builder no está funcionando:

Recuerda que "until" es "hasta" y "while" es "mientras", y al pasar el código de Delphi a C++ no has modificado la condición, deberías cambiar en los dos while "==" por "!=".
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias, _Leo. Simplemente perfecto!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.