IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ VC++ et MFCConsultez toutes les FAQ

Nombre d'auteurs : 20, nombre de questions : 545, dernière mise à jour : 5 avril 2013  Ajouter une question

 

Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++

Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.

Sur ce, je vous souhaite une bonne lecture. Farscape

SommaireGDIPress-Papiers (3)
précédent sommaire suivant
 

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
  
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);
Les autres fonctions sont issues de la faq: Comment imprimer une boite de dialogue ?

Mis à jour le 5 avril 2013 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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  
// Zafir Anjum : http://www.codeguru.com/Cpp/G-M/bitmap/article.php/c1757/ 
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); 
  
    // Create and select a logical palette if needed 
    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; 
  
        // Select and realize the palette 
        pOldPal = dc.SelectPalette( &pal, FALSE ); 
        dc.RealizePalette(); 
    } 
  
  
    hbm = CreateDIBitmap(dc.GetSafeHdc(),// handle to device context 
        (LPBITMAPINFOHEADER)lpbi,// pointer to bitmap info header  
        (LONG)CBM_INIT,// initialization flag 
        lpDIBBits,// pointer to initialization data  
        (LPBITMAPINFO)lpbi,// pointer to bitmap info 
        DIB_RGB_COLORS );// color-data usage  
  
    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; 
} 
// le test est fait dans une CFormView 
void CTestSDIView::OnInitialUpdate() 
{ 
    CFormView::OnInitialUpdate(); 
    GetParentFrame()->RecalcLayout(); 
    ResizeParentToFit(); 
  
    HANDLE hNewDIB = NULL; 
  
    // une image est disponible ? 
    if(!::IsClipboardFormatAvailable(CF_DIB)) return; 
  
    // ouverture du presse papier 
    if (!OpenClipboard()) return; 
  
    // copie l'image du presse papier. 
    hNewDIB = CopyHandle(::GetClipboardData(CF_DIB)); 
  
    // fermeture presse papier 
    CloseClipboard();         
  
    // lock l'espace memoire alloué au dib. 
    HGLOBAL h=::GlobalLock((HGLOBAL)hNewDIB); 
  
    CBitmap Bitmap; 
    // fabrique un bitmap DDB 
    Bitmap.Attach(DIBToDDB(h)); 
  
    // edition du bitmap. 
    PrintBmp(&Bitmap); 
  
    // unlock  
    ::GlobalUnlock((HGLOBAL)hNewDIB); 
  
    // remet l'image dans le presse papier 
    OpenClipboard() ; 
    EmptyClipboard() ; // vide au préalable 
    SetClipboardData(CF_DIB,hNewDIB); 
    CloseClipboard () ;   
  
    // liberation du handle hNewDIB 
    ::GlobalFree(hNewDIB);         
}

Mis à jour le 5 avril 2013 farscape

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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  
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.

Mis à jour le 5 avril 2013 nico-pyright(c)

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2022 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.