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