Este artículo presenta principalmente las operaciones del portapapeles de los siguientes contenidos en VC/MFC:
1 Operación del contenido de texto
2. /p>
p>
3. Operaciones de mapa de bits
4. Establecer y utilizar formatos personalizados
5. 6. Pegar datos automáticamente en otra ventana de la aplicación
1. Operación del contenido de texto
El siguiente código demuestra cómo copiar contenido de texto al portapapeles (la codificación Unicode se convierte primero a ASCII) :
CString source;
//El contenido del texto se guarda en la variable fuente
if( OpenClipboard() )
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength() 1 );
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(fuente));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT, clipbuffer);
CloseClipboard();
}
El siguiente código muestra cómo llegar desde el portapapeles Contenido del texto:
char * buffer = NULL;
//Abrir portapapeles
CString fromClipboard;
if (OpenClipboard())
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData);
fromClipboard = buffer;
GlobalUnlock(hData);
CloseClipboard();
}
2. Operación de datos WMF
p>Leer y escribir datos de imágenes en el portapapeles es una función muy útil y también muy sencilla de implementar.
El siguiente código muestra cómo copiar un metarchivo extendido al portapapeles:
if(OpenClipboard());
{
EmptyClipboard();
//Crear metarchivo DC
CMetaFileDC * cDC = new CMetaFileDC();
cDC-CreateEnhanced(GetDC(), NULL, NULL, "the_name ");
//Llamar a la rutina de dibujo
//Cerrar CMetafileDC y obtener su identificador
HENHMETAFILE handle = cDC-CloseEnhanced();
p>//Copiar al portapapeles
SetClipBoardData(CF_ENHMETAFILE, handle);
CloseClipboard();
//Eliminar dc
eliminar cDC;
}
El siguiente código demuestra cómo obtener el metarchivo del portapapeles y dibujarlo en el DC del cliente:
if(OpenClipboard())
{
//Obtener datos del portapapeles
HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);
//Pantalla
CClientDC dc(este);
CRect cliente(0, 0, 200, 200);
dc.PlayMetaFile(identificador, cliente);
//Cerrar el portapapeles
CloseClipboard();
}
3. Operaciones de mapas de bits
La operación de mapas de bits es una un poco más complicado El siguiente ejemplo muestra cómo guardar un mapa de bits en el portapapeles:
if(OpenClipboard())
{
EmptyClipboard();
CBitmap * basura = nuevo CBitmap();
CClientDC cdc(este);
CDC dc;
dc.CreateCompatibleDC(cdc );
Cliente CRect(0, 0, 200, 200);
junk-CreateCompatibleBitmap(cdc, client.Width(), client. Height());
dc.SelectObje
ct(junk);
DrawImage(dc, CString("Bitmap"));
//Copiar datos a el portapapeles
SetClipboardData(CF_BITMAP, junk-m_hObject);
CloseClipboard();
eliminar basura;
}
El siguiente código muestra cómo obtener datos de mapa de bits del portapapeles:
if(OpenClipboard())
{ p>
//Obtener datos del portapapeles
HBITMAP identificador = (HBITMAP)GetClipboardData(CF_BITMAP);
CBitmap * bm = CBitmap::FromHandle(mango);
CClientDC cdc(este);
CDC dc; .CreateCompatibleDC(cdc);
dc.SelectObject(bm);
cdc.BitBlt(0, 0, 200, 200, dc, 0, 0, SRCCOPY); p>
cdc.BitBlt(0, 0, 200, 200, dc, 0, 0, SRCCOPY); p>
CerrarClipboard();
}
4. Configure y use formatos personalizados
Utilice la función RegisterClipboardFormat() para copiar y pegar cualquier tipo de datos que necesite.
Por ejemplo, tenemos el siguiente tipo de datos:
struct MyFormatData
{
long val1;
int val2;
};
Queremos copiarlo al portapapeles, puedes usar el siguiente código:
Formato UINT = RegisterClipBoardFormat("MY_CUSTOM_FORMAT");
if(OpenClipboard())
{
Datos MyFormatData;
datos.val1 = 100;
datos.val2 = 200;
HGLOBAL clipbuffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData));
MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);
//Guardar en la memoria
*buffer = datos;
//Guardar en el portapapeles
GlobalUnlock(clipbuffer);
SetClipboardData(formato, clipbuffer);
CerrarClipboard();
}
Leer Utilice el siguiente código para obtener datos:
Formato UINT = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
Datos MyFormatData;
if(Openclipboard())
{
HANDLE hData =GetClipboardData(formato);
MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
data = *buffer ;
GlobalUnlock(hData);
CloseClipboard();
}
5.
Puedes detectar si el contenido del portapapeles ha cambiado a través de los mensajes de Windows. El código es el siguiente:
//En tu código de inicialización, llama:
SetClipboardViewer(. ); //Configura nuestro programa agregado a la cadena de observación del portapapeles
//En tu mapa de mensajes agrega:
ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //Agregar identificador de mensaje
//El cual se declara como:
afx_msg void OnClipChange();
Finalmente implementa:
void CDetectClipboardChangeDlg::OnClipChange()
{
CTime tiempo = CTime::GetCurr
entTime();
SetDlgItemText(IDC_CHANGED_DATE, time.Format("a, b d, Y -- H:M:S"));
DisplayClipboardText();
}
6. Pegue datos automáticamente en otra ventana de la aplicación
Simplemente obtenga el identificador de la ventana correspondiente y envíe un mensaje