FAQ Visual Basic Consultez toutes les FAQ

Nombre d'auteurs : 50, nombre de questions : 300, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireGraphisme

Rappelons que le code d'une couleur se calcule par les composantes RGB à l'aide de la formule :
Red + Green * 256 + Blue * 256 * 256.
Il nous suffit donc d'écrire la fonction inverse.

vb
Sélectionnez

Public Sub ComposantesRGB(ByVal Couleur As Long, Red As Long, Green As Long, Blue As Long) 
 
Blue = Int(Couleur / 65536) 
Green = Int((Couleur - (65536 * Blue)) / 256) 
Red = Couleur - ((Blue * 65536) + (Green * 256)) 
 
End Sub 
 
Private Sub Command1_Click() 
Dim Rouge As Long, Vert As Long, Bleu As Long 
 
ComposantesRGB 9550940, Rouge, Vert, Bleu 
LblRed.Caption = "Red = " & Rouge 
LblGreen.Caption = "Green = " & Vert 
LblBlue.Caption = "Blue = " & Bleu 
 
End Sub


Une autre méthode en utilisant l'API Windows

vb
Sélectionnez

Private Declare Function TranslateColor Lib "olepro32.dll" Alias "OleTranslateColor" _
(ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long
 
Private Sub TranslateRGB(coulnorm, R, G, B)
Dim RealColor As Long
  TranslateColor coulnorm, 0, RealColor
  R = RealColor And &HFF&
  G = (RealColor And &HFF00&) / 2 ^ 8
  B = (RealColor And &HFF0000) / 2 ^ 16
End Sub
 
Private Sub Command1_Click()
  TranslateRGB Me.Label1.BackColor, R, G, B
  MsgBox "R = " & R & " G = " & G & " B = " & B
End Sub
 
Créé le 4 septembre 2003  par Jean-Marc Rabilloud, jmfmarques

Si vous cherchez simplement à connaître la couleur d'un point dans un PictureBox, utilisez sa méthode Point(). Sinon, voici une méthode pour récupérer la couleur de n'importe quel pixel à l'écran.

Placez ce code dans un module standard :

vb
Sélectionnez

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
 
Public Type Couleur
    red As Integer
    green As Integer
    blue As Integer
End Type
 
Public Function CouleurPixel (ByVal x As Long, ByVal y As Long) As Couleur
 
    Dim pixel As Couleur, RGBPx As Long
 
    RGBPx = GetPixel(GetDC(0&), x, y)
    pixel.red = &HFF& And RGBPx
    pixel.green = (&HFF00& And RGBPx) \ 256
    pixel.blue = (&HFF0000 And RGBPx) \ 65536
    CouleurPixel = pixel
 
End Function

La fonction CouleurPixel renvoie la couleur du pixel, dont les coordonnées lui ont été passées en paramètres, dans une structure Couleur. Si vous voulez connaître la position du pointeur de souris, ajoutez ces déclarations dans le module standard :

vb
Sélectionnez

Public Declare Function GetCursorPos Lib "user32" (lpPoint As PointAPI) As Long
 
Public Type PointAPI
    X As Long
    Y As Long
End Type

Voici maintenant un exemple où l'on utilise un timer pour mettre dans un PictureBox la couleur du pixel survolé par la souris :

vb
Sélectionnez

Private Sub Timer1_Timer()
 
    Dim pixel As Couleur, CursPos As PointAPI
 
    GetCursorPos CursPos
    pixel = CouleurPixel(CursPos.X, CursPos.Y)
    Picture1.BackColor = RGB(pixel.red, pixel.green, pixel.blue)
 
End Sub
Créé le 26 avril 2004  par Alexandre Lokchine, Romain Puyfoulhoux

Lors d'un changement dynamique de la couleur de fond d'un contrôle, il peut s'avérer utile pour une meilleure lisibilité de modifier la police de caractères, pour cela utiliser la fonction suivante qui vous permet d'avoir en retour la couleur inverse de celle passée en paramètre

 
Sélectionnez
Option Explicit
 
Type Col_Sep
    red As Integer
    green As Integer
    blue As Integer
End Type
 
Function GetInverseColor(ByVal vbCol As Long) As Long
 
Dim colDecompose As Col_Sep
colDecompose = SepareColor(vbCol)
GetInverseColor = RGB(255 - colDecompose.red, 255 - colDecompose.green, 255 - colDecompose.blue)
 
End Function
 
 
Function SepareColor(ByVal ColRGB As Long) As Col_Sep
 
With SepareColor
    .red = Int(ColRGB And &HFF)
    .green = Int((ColRGB And &H100FF00) / &H100)
    .blue = Int((ColRGB And &HFF0000) / &H10000)
End With
 
End Function
Mis à jour le 22 décembre 2008  par Cafeine

En utilisant la fonction GetTextExtentPoint32() de l'API Windows. Celle-ci reçoit en argument un contexte graphique, le texte dont vous voulez connaître la taille, le nombre de caractères, ainsi qu'une structure de type POINTAPI qui recevra la longueur et la hauteur du texte en pixels. En VB vous avez accès au contexte graphique d'une form ou d'un PictureBox grâce à la propriété hdc.

Copiez ce code dans un module standard. La fonction TailleDuTexte vous renvoie une structure de type POINTAPI contenant la largeur et la hauteur du texte passé en paramètre.

vb
Sélectionnez

Public Type POINTAPI
    X As Long
    Y As Long
End Type
Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias _
                         "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, _
                                                  ByVal cbString As Long, lpSize As POINTAPI) As Long
 
Public Function TailleDuTexte(ByVal hdc As Long, ByVal texte As String) As POINTAPI
 
    Dim taille As POINTAPI
 
    GetTextExtentPoint32 hdc, texte, Len(texte), taille
    taille.X = taille.X * Screen.TwipsPerPixelX
    taille.Y = taille.Y * Screen.TwipsPerPixelY
    TailleDuTexte = taille
 
End Function

Voici par exemple comment afficher la largeur du texte contenu dans un label :

vb
Sélectionnez

Dim taille As POINTAPI
MsgBox TailleDuTexte(Me.hdc, Label1.Caption).X

La fonction GetTextExtentPoint32 calcule la taille du texte en utilisant comme police celle liée au contexte graphique passé en paramètre. Donc pour que le résultat soit exact, la police de la form doit être la même que celle du label.

Créé le 26 avril 2004  par ThierryAIM, Romain Puyfoulhoux

Voici comment écrire un texte incliné par rapport à la ligne de base. Le principe consiste à créer la police désirée avec la fonction CreateFontIndirect de l'api Win 32.

Copiez ce code dans un module standard :

vb
Sélectionnez

Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" _
                                            (lpLogFont As LOGFONT) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, _
                                                   ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
 
Private Const LF_FACESIZE = 32
Private Const FW_NORMAL = 400
Private Const FW_BOLD = 700
 
Private Type LOGFONT
    lfHeight As Long
    lfWidth As Long
    lfEscapement As Long
    lfOrientation As Long
    lfWeight As Long
    lfItalic As Byte
    lfUnderline As Byte
    lfStrikeOut As Byte
    lfCharSet As Byte
    lfOutPrecision As Byte
    lfClipPrecision As Byte
    lfQuality As Byte
    lfPitchAndFamily As Byte
    lfFaceName As String * LF_FACESIZE
End Type
 
Public Type Police
    taille As Integer
    angle As Integer
    gras As Boolean
    italique As Boolean
    souligne As Boolean
    nom As String
End Type
 
Public Sub TexteIncline(device As Object, ByVal texte As String, font As Police)
 
    Dim fnt As LOGFONT, prevFont As Long, hFont As Long, ret As Long
 
    fnt.lfEscapement = font.angle * 10 'lfEscapement est en dixième de degrés
    fnt.lfFaceName = font.nom & Chr$(0)  'lfFaceName doit se terminer par un caractère nul
    fnt.lfItalic = IIf(font.italique, 1, 0)
    fnt.lfUnderline = IIf(font.souligne, 1, 0)
    fnt.lfWeight = IIf(font.gras, FW_BOLD, FW_NORMAL)
 
    ' Windows attend la taille de caractères en pixels et en
    ' négatif si vous spécifiez la hauteur de caractères désirée
    fnt.lfHeight = (font.taille * -20) / Screen.TwipsPerPixelY
 
    hFont = CreateFontIndirect(fnt) 'création de la police
    prevFont = SelectObject(device.hdc, hFont) 'handle sur la police actuelle
    device.Print texte
 
    ret = SelectObject(device.hdc, prevFont) ' restauration de la police d'origine
    ret = DeleteObject(hFont) 'suppression de l'objet créé
 
End Sub

La procédure TexteIncline écrit un texte dans l'objet spécifié en paramètre. Cet objet doit avoir une méthode print, vous pouvez donc choisir une form, l'objet Printer ou un PictureBox. Le paramètre font est une variable de type Police, qui est un type utilisateur créé pour l'occasion, et qui est plus simple à paramétrer que le type LOGFONT des api Win32.

Pour tester ce code, posez un PictureBox et un bouton de commande sur une form et placez ce code dans le module de la form :

vb
Sélectionnez

Private Sub Command1_Click()
 
Dim font As Police
 
font.nom = "Arial"
font.taille = 14 'taille de 14 points
font.angle = 50 '50 degrés par rapport à l'horizontale
font.italique = True
font.gras = True
font.souligne = True
 
Picture1.CurrentX = Picture1.ScaleWidth / 2
Picture1.CurrentY = Picture1.ScaleHeight / 2
TexteIncline Picture1, "Texte incliné", font
 
End Sub

Seules les polices True-type peuvent être utilisées pour écrire un texte de façon inclinée.

Créé le 28 juin 2004  par Khany, Romain Puyfoulhoux
  

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