| auteur : Farscape |
bool CopyBitmapToClipBoard (CBitmap * pBitmap)
{
if (! AfxGetMainWnd ()- > OpenClipboard ()) return false ;
if (! EmptyClipboard ()) return false ;
bool bret= (SetClipboardData (CF_BITMAP, pBitmap- > m_hObject)! = NULL );
bret= (CloseClipboard ()= = TRUE);
return bret;
}
CBitmap * pBmp= CopyWindowToBitmap (this ,true );
CopyBitmapToClipBoard (pBmp);
|
|
| auteur : Farscape | L'exemple ci-dessus suppose que le presse-papiers contient une image.
Le scénario est le suivant :
Récupération de l'image au format DIB en effectuant une copie.
Création d'un bitmap au format DDB.
Impression du bitmap avec la fonction PrintBmp voir faq : Comment imprimer une boîte de dialogue ?
Effacement du presse-papiers et insertion de la copie de l'image DIB à nouveau dans le presse-papiers.
HBITMAP DIBToDDB ( HANDLE hDIB )
{
LPBITMAPINFOHEADERlpbi;
HBITMAP hbm;
CPalettepal;
CPalette* pOldPal;
CClientDCdc (NULL );
if (hDIB = = NULL )
return NULL ;
lpbi = (LPBITMAPINFOHEADER)hDIB;
int nColors = lpbi- > biClrUsed ? lpbi- > biClrUsed :
1 < < lpbi- > biBitCount;
BITMAPINFO & bmInfo = * (LPBITMAPINFO)hDIB ;
LPVOID lpDIBBits;
if ( bmInfo.bmiHeader.biBitCount > 8 )
lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors +
bmInfo.bmiHeader.biClrUsed) +
((bmInfo.bmiHeader.biCompression = = BI_BITFIELDS) ? 3 : 0 ));
else
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
if ( nColors <= 256 & & dc.GetDeviceCaps (RASTERCAPS) & RC_PALETTE)
{
UINT nSize = sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * nColors);
LOGPALETTE * pLP = (LOGPALETTE * ) new BYTE[nSize];
pLP- > palVersion = 0x300 ;
pLP- > palNumEntries = nColors;
for ( int i= 0 ; i < nColors; i+ + )
{
pLP- > palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed;
pLP- > palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
pLP- > palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue;
pLP- > palPalEntry[i].peFlags = 0 ;
}
pal.CreatePalette ( pLP );
delete [] pLP;
pOldPal = dc.SelectPalette ( & pal, FALSE );
dc.RealizePalette ();
}
hbm = CreateDIBitmap (dc.GetSafeHdc (),
(LPBITMAPINFOHEADER)lpbi,
(LONG)CBM_INIT,
lpDIBBits,
(LPBITMAPINFO)lpbi,
DIB_RGB_COLORS );
if (pal.GetSafeHandle ())
dc.SelectPalette (pOldPal,FALSE);
return hbm;
}
HGLOBAL WINAPI CopyHandle (HGLOBAL h)
{
if (h = = NULL ) return NULL ;
DWORD dwLen = :: GlobalSize ((HGLOBAL) h);
HGLOBAL hCopy = :: GlobalAlloc (GHND, dwLen);
if (hCopy ! = NULL )
{
void * lpCopy = :: GlobalLock ((HGLOBAL) hCopy);
void * lp = :: GlobalLock ((HGLOBAL) h);
memcpy (lpCopy, lp, dwLen);
:: GlobalUnlock (hCopy);
:: GlobalUnlock (h);
}
return hCopy;
}
void CTestSDIView:: OnInitialUpdate ()
{
CFormView:: OnInitialUpdate ();
GetParentFrame ()- > RecalcLayout ();
ResizeParentToFit ();
HANDLE hNewDIB = NULL ;
if (! :: IsClipboardFormatAvailable (CF_DIB)) return ;
if (! OpenClipboard ()) return ;
hNewDIB = CopyHandle (:: GetClipboardData (CF_DIB));
CloseClipboard ();
HGLOBAL h= :: GlobalLock ((HGLOBAL)hNewDIB);
CBitmap Bitmap;
Bitmap.Attach (DIBToDDB (h));
PrintBmp (& Bitmap);
:: GlobalUnlock ((HGLOBAL)hNewDIB);
OpenClipboard () ;
EmptyClipboard () ;
SetClipboardData (CF_DIB,hNewDIB);
CloseClipboard () ;
:: GlobalFree (hNewDIB);
}
|
|
| auteur : nico-pyright(c) | En utilisant les fonctions de l'API pour le presse-papiers .
Le principe est le suivant :
- allouer de la mémoire pour ce qu'on doit copier ;
- bloquer la zone mémoire pour permettre de la remplir avec la valeur à copier dans le presse-papiers ;
- libérer la zone mémoire ;
- ouvrir le presse-papiers ;
- ( vider le presse-papiers ) ;
- copier les données dans le presse-papiers ;
- fermer le presse-papiers.
L'exemple qui suit permet de copier dans le presse-papiers le nom de l'éxecutable en cours :
DWORD len;
HGLOBAL hgbl;
char temp[MAX_PATH];
char * pmem;
len = GetModuleFileName (NULL ,temp,MAX_PATH);
if (! len) return 0 ;
hgbl = GlobalAlloc (GHND, len + 1 );
if (! hgbl) return 0 ;
pmem = (char * )GlobalLock (hgbl);
strcpy (pmem,temp);
GlobalUnlock (hgbl);
OpenClipboard (NULL );
EmptyClipboard ();
SetClipboardData (CF_TEXT, hgbl);
CloseClipboard ();
|
Remarques :
- il faut connaitre la longueur à copier pour pouvoir allouer la mémoire avec GlobalAlloc (ici, GetModuleFileName renvoie la longueur de la chaîne)
- On utilise OpenClipboard avec un handle égal à NULL pour ouvrir le presse-papiers associé à la tâche courante. Si on veut récupérer le presse-papiers d'une autre fenêtre, il suffit de lui passer son handle en paramètre.
|
Consultez les autres F.A.Q.
|
|
Les sources présentées sur cette page sont libres de droits
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur.
Copyright © 2004 Developpez Developpez LLC.
Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne
peut être faite de ce site ni de l'ensemble de son contenu : textes, documents
et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez
selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.