Pour faire une capture d'écran, nous faisons appel à la fonction BitBlt. Placez sur votre fiche une ScrollBox et une Image dedans (Onglet supplément de la palette de composants). Placez également un Button. Voici l'événement OnClick de ce bouton :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image1->Picture->Bitmap->Height = Screen->Height;
Image1->Picture->Bitmap->Width = Screen->Width;
Image1->Height = Screen->Height;
Image1->Width = Screen->Width;
HDC ScreenSrc = GetWindowDC(0);
BitBlt(Image1->Picture->Bitmap->Canvas->Handle, 0, 0, Screen->Width,
Screen->Height, ScreenSrc, 0, 0, SRCCOPY);
ReleaseDC(GetDesktopWindow(), ScreenSrc);
}
Les quatre premières lignes aggrandissent l'image pour qu'elle fasse la taille de l'écran. Ensuite, on récupère le DC (Device Context) de l'écran grâce à la fonction GetWindowDC. Cette fonction prend pour argument le Handle de la fenêtre dont on veut le DC. Ici, nous souhaitons celui de tout l'écran. Le Handle de l'écran (Bureau) est 0. D'où le code
HDC ScreenSrc = GetWindowDC(0)
. La fonction suivante, BitBlt va copier le contenu de ce DC vers le Canvas de notre image (DC de notre image) :
BitBlt(Image1->Picture->Bitmap->Canvas->Handle, // Destination
0, // Coin haut-gauche abscisse
0, // ordonnée
Screen->Width, // Largeur de la zone destination
Screen->Height, // Hauteur de la zone destination
ScreenSrc, // Source
0, // Haut-gauche de la source abscisse
0, // ordonnée
SRCCOPY); // Méthode de copie
Enfin, nous libérons le DC de l'écran (bureau) par le code
ReleaseDC(GetDesktopWindow(), ScreenSrc)
Si vous exécutez ce programme, lorsque vous cliquerez sur le bouton, une capture d'écran sera effectuée.
Vous souhaitez peut-être utiliser ce code dans un jeu ou autre. Dans ce cas, vous n'avez pas besoin que l'image s'affiche, mais vous souhaitez qu'elle soit sauvegardée dans le répertoire de l'application. Transformons donc notre code :
Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
Bitmap->Height = Screen->Height;
Bitmap->Width = Screen->Width;
HDC ScreenSrc = GetWindowDC(0);
BitBlt(Bitmap->Canvas->Handle, 0, 0, Screen->Width,
Screen->Height, ScreenSrc, 0, 0, SRCCOPY);
Bitmap->SaveToFile(ExtractFilePath(Application->ExeName)+"Bitmap.bmp");
ReleaseDC(GetDesktopWindow(), ScreenSrc);
delete Bitmap;
On crée maintenant directement le Bitmap, sans passer par l'intermédiaire du TImage. La suite du code se comprend aisémment. Enfin, on utilise la méthode SaveToFile du Bitmap pour sauvergarder l'image dans le répertoire courant.