[Windows API GDI] Dessiner un rectangle dans un userform
Bonjour,
Je souhaite dessiner un rectangle sans remplissage dans un userform pour entourer des contrôles. Jadis, je m'en serais sorti avec plusieurs MSForms.Frame de faible hauteur.
Ci-desous un exemple basique sensé juste dessiner trait oblique, sauf que ça n'affiche rien...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| Option Explicit
'
Private Sub UserForm_Initialize()
Left = 0
Top = 0
Dim hwnd As LongPtr: hwnd = API.GetActiveWindow
Dim hdc As LongPtr: hdc = API.GetDC(hwnd:=hwnd)
Dim lppt(1 To 2) As API.POINTAPI 'dans cet exemple, je ne prend que 2 points (MoveToEx et LineTo seraient probablement plus adaptés)
lppt(1).x = Left 'à vrai dire, j'ignore s'il faille effectuer la translation de l'origine, peut-être utilisé MoveToEx ?
lppt(1).y = Top
lppt(2).x = Left + Width
lppt(2).y = Top + Height
'converti les coordonnées logiques en pixels
Dim ind As Integer: For ind = LBound(lppt) To UBound(lppt)
'conversion en coordonnées pixel
lppt(ind).x = API.GetDeviceCaps(hdc:=hdc, nIndex:=API.LOGPIXELSX) * lppt(ind).x / API.POINTSPERINCH
lppt(ind).y = API.GetDeviceCaps(hdc:=hdc, nIndex:=API.LOGPIXELSY) * lppt(ind).y / API.POINTSPERINCH
Next ind
API.PolylineTo hdc:=hdc, lppt:=lppt(1), cCount:=UBound(lppt) - LBound(lppt) + 1
'j'imagine qu'il n'y a pas de brush à spécifier, vu que je ne souhaite pas de remplissage
'mais qu'en est-il de l'epaisseur du trait, du moins s'il y en a un ?
API.ReleaseDC hwnd:=hwnd, hdc:=hdc
End Sub |
Déclarations de l'API Windows:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Option Explicit
Public Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Public Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Public Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hwnd As LongPtr, ByVal hdc As LongPtr) As Long
Public Declare PtrSafe Function LineTo Lib "gdi32" (ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long) As Long
Public Declare PtrSafe Function MoveToEx Lib "gdi32" (ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
Public Declare PtrSafe Function PolylineTo Lib "gdi32" (ByVal hdc As LongPtr, lppt As POINTAPI, ByVal cCount As Long) As Long
Public Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As LongPtr, ByVal nIndex As Long) As Long
Public Type POINTAPI
x As Long
y As Long
End Type
Public Const LOGPIXELSX As Long = &H58&
Public Const LOGPIXELSY As Long = &H5A&
Public Const POINTSPERINCH As Long = &H48& |
A ce sujet, je suis entrain de lire le livre Programming Windows de Charles Petzold (1998) sur l'API Windows. J'ai rencontré de nombreux exemples où ça implique des coordonées logiques de ce que je me rappelle (bon autant dire, j'ai fait les exercices sans vraiment comprendre... :aie: ) De plus, je n'ai entrevu des exemple que ce servent des object Excel.Shape, mais celà ne me convient pas, car le formulaire est en réalité implémenté sous CATIA (même si je fais des appels vers Excel).
Pouvez-vous s'il vous plaît m'aider à ce sujet ?
Merci ;)