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
- 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
Sub
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 :
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 :
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 :
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
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
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
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.
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 :
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.
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
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 :
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.