 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Mie 31 Ago, 2011 5:19 am Asunto: Imprimir el contenido completo del ScrollBox |
|
|
| ¿Cómo puedo imprimir el contenido completo (incluyendo la parte no visible) de un TScrollBox? ¿Es posible? |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Jue 01 Sep, 2011 5:29 am Asunto: |
|
|
É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 |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Jue 01 Sep, 2011 7:05 am Asunto: |
|
|
| ¿Por qué la instrucción bmp->Canvas->Lock(); borra el Text del TComboBox en la imagen? |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Jue 01 Sep, 2011 1:17 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 01 Sep, 2011 3:23 pm Asunto: |
|
|
| 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 |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Jue 01 Sep, 2011 4:04 pm Asunto: |
|
|
| Gracias, _Leo. Simplemente perfecto! |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|