Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

Vous n'avez pas encore de compte Developpez.com ? L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Developpez.com

C++

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Interface > Composants > Les images et le graphisme
        Comment dessiner des lignes sur la fiche ?
        Comment faire une capture d'écran ?
        Comment charger une image à partir du presse-papiers ?
        Comment obtenir les composantes RGB d'une couleur TColor ?
        Comment obtenir rapidement le code hexadécimal d'une couleur ?
8.4.6.1. TChart (12)
                Qu'est ce qu'un TChart ?
                Comment ajouter une série à un TChart ?
                Comment ajouter un point à une série ?
                Comment créer un graphe en camembert?
                Comment ajouter une donnée à un diagramme de Gantt ?
                Comment représenter un graphique en fonction du temps ?
                Comment sauvegarder un TChart ?
                Comment changer le trait d'une série ?
                Comment changer la couleur d'une série ?
                Comment autoriser/inhiber le déplacement ?
                Comment autoriser/inhiber le zoom ?
                Comment mettre une échelle logarithmique sur le TChart ?



Comment dessiner des lignes sur la fiche ?
Créé le 01/09/2004[haut]
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 méthodes 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 ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Il faut récupérer le DC (Device Context) de l'écran grâce à la fonction GetWindowsDC. 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 suivant :

HDC ScreenSrc = GetWindowDC(0);
La méthode BitBlt va copier le contenu de ce DC vers le Canvas de notre composant TBitmap (DC de notre image) :

BitBlt(bitmap->Canvas->Handle, // Destination
      0, // Coin haut-gauche : abscisse
      0, // Coin haut-gauche : 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, // Haut-gauche de la source : ordonnée
      SRCCOPY);       // Méthode de copie
Enfin, pour libérer le DC de l'écran (bureau), utilisez la méthode ReleaseDC :

ReleaseDC(GetDesktopWindow(), ScreenSrc);
Si vous souhaitez directement enregistrer votre capture d'écran, voici un exemple de 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 ici directement un Bitmap et on lui affecte la copie d'écran, puis on utilise la méthode SaveToFile du Bitmap pour sauvegarder l'image dans le répertoire courant.


Comment charger une image à partir du presse-papiers ?
Créé le 01/09/2004[haut]
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 TImage sur une fiche ainsi qu'un bouton. Voici le gestionnaire d'évènements 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
    }
  }
  else
  {
    // Le contenu du presse-papier n'est pas une image;
  }
}
Tout d'abord, on initialise un pointeur sur un objet Clipboard grâce à la méthode 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 méthode Clipboard gère cela en créant un nouvel objet 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, nous essayons de charger l'image dans Image1 grâce à la méthode LoadFromClipboardFormat. Les données du presse-papier sont récupérées par la méthode GetAsHandle.


Comment obtenir les composantes RGB d'une couleur TColor ?
Mise à jour le 06/12/2006[haut]
auteurs : Geronimo, Greybird, Ricky81
Il existe trois macros nommées GetRValue, GetBValue et GetGValue qui donnent respectivement les composantes rouges, bleues et vertes d'une couleur au format RGB, et donc en particulier pour 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 TLabel. Placez donc sur votre fiche un composant TImage, TLabel, TButton et TOpenPictureDialog. 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(ColorToRGB(Image1->Canvas->Pixels[X][Y]));
  BYTE nBlue  = GetBValue(ColorToRGB(Image1->Canvas->Pixels[X][Y]));
  BYTE nGreen = GetGValue(ColorToRGB(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 écrivons la composition RGB de notre couleur dans Label1.

Remarque : On peut se passer de ColorToRGB mais uniquement pour les constantes correspondant à des couleurs fixes (et non des couleurs système) qui sont au format 0x00bbggrr.


Comment obtenir rapidement le code hexadécimal d'une couleur ?
Créé le 01/09/2004[haut]
auteur : Alacazam
Lorsque vous souhaitez modifier un attribut couleur, à la création d'un composant, vous avez le choix entre une valeur prédéfinie (clBlue, clRed, clBtnFace ...) ou une valeur de cette forme 0x00RRGGBB (valeur hexadécimale de 4 octets).
Pour choisir "visuellement" une couleur, et en obtenir le code hexadécimal :
  • dans l'Inspecteur d'Objets, double-cliquez sur un attribut Color (de votre Form par exemple)
  • faites ensuite "Définir les couleurs personnalisées"
  • après avoir choisi votre couleur, cliquez "Ajouter aux couleurs personnalisées" et validez.

Vous obtenez finalement quelque chose de ce type 0x00BBGGRR (valeurs Blue, Green, Red, remarquez l'inversion).



Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

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 © 2009 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.

Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web