tutorial de funcionamiento del portapapeles vc mfc

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())

{

//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);

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