FAQ C++ BuilderConsultez toutes les FAQ

Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010  Ajouter une question

 

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe C++ Builder de Developpez.

Commentez cette FAQ : Commentez


SommaireInterface bisComposantsLes images et le graphisme (17)
précédent sommaire suivant
 

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.

Code c++ : Sélectionner tout
1
2
Canvas->MoveTo(0, 0); 
Canvas->LineTo(ClientWidth, ClientHeight);
Ce code dessinera une ligne en diagonale de la fiche.

Mis à jour le 1er septembre 2004 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 :

Code c++ : Sélectionner tout
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) :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
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 :

Code c++ : Sélectionner tout
ReleaseDC(GetDesktopWindow(), ScreenSrc);
Si vous souhaitez directement enregistrer votre capture d'écran, voici un exemple de code :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
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.

Mis à jour le 1er septembre 2004 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 :

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

Mis à jour le 1er septembre 2004 Geronimo

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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
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.

Mis à jour le 1er septembre 2004 Geronimo Greybird Ricky81

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).

Mis à jour le 1er septembre 2004 Alacazam

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