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



Comment dessiner des lignes sur la fiche ?
auteur : Geronimo
Pour dessiner des lignes sur la fiche, il suffit de faire appel aux méthodes de l'objet canvas MoveTo et LineTo . Il faut savoir que vous ne dessinez pas directement sur la fiche mais sur le Canvas de la fiche. C'est une surface spécialement destinée au dessin qui contient toutes les fonctions et propriétés nécessaires au dessin.
Canvas->MoveTo(0, 0);
Canvas->LineTo(ClientWidth, ClientHeight);
Ce code dessinera une ligne en diagonale de la fiche.

Comment faire une capture d'écran ?
auteur : Geronimo
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.

Comment charger une image à partir du presse-papiers ?
auteur : Geronimo
Il peut être parfois utile de charger une image à partir du presse-papiers. Pour ce faire, il convient d'utiliser un objet Clipboard . Le code suivant montre comment faire. Pour cela, placez un composant Image sur la fiche ainsi qu'un Button. Voici le gestionnaire d'événement OnClick de ce bouton :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TClipboard *PressePapiers = Clipboard();
    if (PressePapiers->HasFormat(CF_BITMAP))
    {
        try
        {
            Image1->Picture->Bitmap->LoadFromClipboardFormat(CF_BITMAP, PressePapiers->GetAsHandle(CF_BITMAP), 0);

        }
        catch (...)
        {
            // Le contenu du presse-papier n'est pas un image valide
        }
    }
    // Le contenu du presse-papier n'est pas une image;
}
Tout d'abord, on initialise un pointeur sur un objet Clipboard grâce à la fonction Clipboard() ( TClipboard *PressePapiers = Clipboard() ). Attention, il ne faut pas créer d'objet Clipboard avec l'opérateur new car une seule instance du presse-papiers est autorisée. La fonction Clipboard gère cela en créant un nouvel objet Clipboard si il n'en existe pas. Sinon, elle renvoie un pointeur sur le Clipboard déjà existant. La condition de la ligne suivante permet de vérifier que le contenu du presse-papiers est bien une image Bitmap. Ensuite, dans un bloc try...catch , nous chargeons l'image dans le composant Image présent sur la fiche grâce à la fonction LoadFromClipboardFormat. Cette fonction charge les données passées en second argument ; ces données sont récupérées par la méthode GetAsHandle du presse-papiers. Si le chargement échoue, une exception est déclenchée qui est rattrapée par catch(...) .

Comment obtenir les composantes RGB d'une couleur TColor ?
auteur : Geronimo
Il existe trois macros nommées GetRValue, GetBValue et GetGValue pour cela qui donnent respectivement les composantes rouges, bleues et vertes d'un objet TColor. Voici un exemple concret d'utilisation : nous passons la souris sur une image que l'utilisateur peut changer et les valeurs des différentes composantes de la couleur située sous le pointeur est affichée dans un Label. Placez donc sur votre fiche un composant Image, Label, Button et OpenPictureDialog. Dans l'événement OnClick du bouton, placez le code suivant :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if (OpenPictureDialog1->Execute())
        Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
	  	
Ensuite, dans l'événement OnMouseMove de l'image, placez le code suivant :
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    BYTE nRed   = GetRValue(Image1->Canvas->Pixels[X][Y]);
    BYTE nBlue  = GetBValue(Image1->Canvas->Pixels[X][Y]);
    BYTE nGreen = GetGValue(Image1->Canvas->Pixels[X][Y]);

    Label1->Caption = "Rouge : " + IntToStr(nRed) + " Vert :" + IntToStr(nGreen) + " Bleu :" + IntToStr(nBlue);
}
Nous déclarons trois variables de type BYTE (unsigned char) qui contiendront les composantes de la couleur. La couleur est celle du pixel situé sous la souris à la position (X, Y) d'où le code Image1->Canvas->Pixels[X][Y], Pixels étant un tableau de TColor. Enfin, nous attribuons au Caption de Label1 la composition RGB de notre couleur.