FAQ Visual Basic

FAQ Visual Basic Consultez toutes les FAQ
Nombre d'auteurs : 50, nombre de questions : 300, dernière mise à jour : 15 juin 2021
Sommaire→Graphisme- Comment retrouver les composantes rouge, verte, bleue d'un code couleur de type Long ?
- Comment retrouver la couleur d'un pixel à l'écran ?
- Comment avoir la couleur inverse exacte ?
- Comment obtenir la taille graphique d'une chaîne de caractères ?
- Comment afficher un texte incliné par rapport à sa ligne de base ?
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.
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
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 SubSi 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 :
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 FunctionLa 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 :
Public Declare Function GetCursorPos Lib "user32" (lpPoint As PointAPI) As Long
Public Type PointAPI
X As Long
Y As Long
End TypeVoici maintenant un exemple où l'on utilise un timer pour mettre dans un PictureBox la couleur du pixel survolé par la souris :
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 SubLors 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
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 FunctionEn 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.
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 FunctionVoici par exemple comment afficher la largeur du texte contenu dans un label :
Dim taille As POINTAPI
MsgBox TailleDuTexte(Me.hdc, Label1.Caption).XLa 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.
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 :
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 SubLa 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 :
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 SubSeules les polices True-type peuvent être utilisées pour écrire un texte de façon inclinée.



