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...
Déclarations de l'API Windows:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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&) 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![]()
Partager