Tutorial de operación del portapapeles vc++ mfc
Este artículo presenta principalmente las siguientes operaciones del portapapeles en VC++/MFC:
1 Operación del contenido de texto
2 Operación de datos WMF
.p>
3. Operaciones de mapa de bits
4. Establecer y utilizar formatos personalizados
5. Detectar cambios en el contenido del portapapeles
6. Pegar datos 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): p>
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); p>
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
El siguiente código muestra cómo recuperar datos del portapapeles. el contenido del texto:
char * buffer = NULL;
//Abrir el portapapeles
CString fromClipboard;
if ( OpenClipboard( ) )
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData);
fromClipboard = buffer;
GlobalUnlock(hData);
CloseClipboard();
}
2.
Leer y escribir datos de imágenes en el portapapeles es una función muy útil, y además es 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);
//Mostrar
CClientDC dc(this);
CRect client(0,0,200,200);
dc.PlayMetaFile(handle,client);
//Cerrar el portapapeles
CloseClipboard();
}
3. Operaciones de mapas de bits
La operación de mapas de bits es un poco más complicada. El ejemplo muestra cómo guardar un mapa de bits en el portapapeles:
if(OpenClipboard())
{
EmptyClipboard ();
CBitmap * basura = nuevo CBitmap();
CClientDC cdc(this);
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 al 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())
{
//Obtener datos del portapapeles
HBITMAP handle = ( HBITMAP)GetClipboardData(CF_BITMAP);
CBitmap * bm = CBitmap::FromHandle(handle);
CClientDC cdc( this);
CDC dc;
corriente continua
.CreateCompatibleDC(cdc);
dc.SelectObject(bm);
cdc.BitBlt(0,0,200,200,dc,0,0,SRCCOPY);
CloseClipboard();
}
4. Establezca y use formatos personalizados
Utilice la función RegisterClipboardFormat() para copiar y pegar cualquier dato que necesite escribir.
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. content
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. (); //Establezca nuestra cadena de observación Agregar el programa al portapapeles
//En su mapa de mensajes agregue:
ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //Agregar identificador de mensaje
p>//El cual se declara como:
afx_msg void OnClipChange();
Finalmente implementa:
void CDetectClipboardChangeDlg::OnClipChange()
{
CTime hora = CTime::GetCurrentTime();
SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M: %S"));
Di
splayClipboardText();
}
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. Eso es todo