Hola amigos, estoy intentando concatenar imagenes de diferentes tamaños en un TBitmap y guardarlo en el portapapeles pero no se que hago mal que no se guarda correctamente en el portapapeles y si intento pegarlo por ejemplo en paint me dice "Error al obtener informacion del portapapeles".
Esto es lo que tengo hecho:
Código PHP:
void __fastcall TForm1::CopyCatImagesToClipBoard()
{
unsigned int DataHandle;
HPALETTE APalette;
unsigned short MyFormat;
int x=0,y=0;
TRect ARect, BRect;
//Solicito memoria para el bitmap que contendrá el concatenado de imagenes
Graphics::TBitmap *FullMap = new (nothrow) Graphics::TBitmap();
if(FullMap != NULL)
{
Graphics::TBitmap **b = new (nothrow) Graphics::TBitmap*[CheckListBox->Count];
if(*b != NULL)
{ //Si se obtuvo memoria correctamente...
for(int i=0; i < CheckListBox->Count; i++)
{
//Asigno memoria a cada Bitmap que contendrá a cada imagen
b[i] = new (nothrow) Graphics::TBitmap();
if(b[i] != NULL)
{ //Si se obtuvo memoria correctamente...
try
{
//Meto cada imagen en su Bitmap
b[i]->LoadFromFile(ChangeFileExt(CheckListBox->Items->Strings[i],".bmp"));
//Le sumo el ancho de la imagen actual a y
y += b[i]->Width;
//Relleno el TRect para la imagen concatenada
ARect.Left = 0;
ARect.Top = 0;
ARect.Right = b[i]->Width;
ARect.Bottom = b[i]->Height;
//Relleno el TRect para la imagen actual
BRect.Left = x;
BRect.Top = 0;
BRect.Right = y;
BRect.Bottom = b[i]->Height;
// Añado el canvas a la imagen que contendrá el concatenado de imagenes
FullMap->Canvas->CopyRect(BRect, b[i]->Canvas, ARect);
//Le sumo el ancho de la imagen actual a x
x += b[i]->Width;
}
catch(...)
{
//Si huvo algun error libero toda la memoria obtenida y salgo de la funcion
for(int v=0; v <= i; v++)
delete b[v];
delete [] b;
delete FullMap;
FullMap = NULL;
Application->MessageBoxA("Hubo un error al copiar las imagenes concatenadas al portapapeles", "Error", MB_OK | MB_ICONERROR);
}
//Si huvo algun error salgo
if(FullMap == NULL)
return;
}else{ //Si no se pudo obtener la memoria suficiente...
//Libero toda la memoria obtenida y salgo de la funcion
for(int v=0; v < i; v++)
delete b[v];
delete [] b;
delete FullMap;
Application->MessageBoxA("Hubo un error al copiar las imagenes concatenadas al portapapeles", "Error", MB_OK | MB_ICONERROR);
return;
}
}
try
{
// generate a clipboard format, with data and palette
FullMap->SaveToClipboardFormat(MyFormat,DataHandle,APalette);
// save the data to the clipboard using that format and
// the generated data
Clipboard()->SetAsHandle(MyFormat,DataHandle);
}
catch(...)
{ //Si huvo algun error libero toda la memoria obtenida
for(int v=0; v < CheckListBox->Count; v++)
delete b[v];
delete [] b;
delete FullMap;
FullMap = NULL;
Application->MessageBoxA("Hubo un error al copiar las imagenes concatenadas al portapapeles", "Error", MB_OK | MB_ICONERROR);
}
//Si huvo algun error salgo de la funcion
if(FullMap == NULL)
return;
//Libero toda la memoria obtenida
for(int i=0;i < CheckListBox->Count; i++)
delete b[i];
delete [] b;
delete FullMap;
}else{ //Si no se pudo obtener la memoria suficiente...
//Libero toda la memoria obtenida
delete FullMap;
Application->MessageBoxA("Hubo un error al copiar las imagenes concatenadas al portapapeles", "Error", MB_OK | MB_ICONERROR);
}
}else{
Application->MessageBoxA("Hubo un error al copiar las imagenes concatenadas al portapapeles", "Error", MB_OK | MB_ICONERROR);
}
}
¿que me falta para que funcione?