Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Reprise d'1 fonction utilisant USER32 et GDI32 à partir d'Access, pour mettre dans VB .NET

7 réponses
Avatar
Stéphane L.
Le but de cette fonction est de connaître la longueur en pixel d'1 texte.

Voici le Code qui fonctionne normalement sous Access :

'Déclaration pour la fonction LargeurTexte

Public Type Size
cx As Long
cy As Long
End Type

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Public Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Public Declare Function CreateFontA Lib "gdi32" _
(ByVal H As Long, ByVal W As Long, ByVal E As Long, _
ByVal O As Long, ByVal W As Long, ByVal i As Long, _
ByVal u As Long, ByVal S As Long, ByVal C As Long, _
ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long

Public Declare Function SelectObject Lib "gdi32" _
(ByVal hDC As Long, ByVal hObject As Long) As Long

Public Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Public Declare Function GetTextExtentPoint32A Lib "gdi32" _
(ByVal hDC As Long, ByVal lpsz As String, _
ByVal cbString As Long, lpSize As Size) As Long

Public Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

Public Function LargeurTexte(Texte As String, Police As String, _
Taille As Double, Optional Gras As Boolean, Optional Italique As Boolean)

Dim hFont As Long
Dim hDC As Long
Dim TSize As Size
Dim PixpInch As Double

hDC = GetDC(0)
PixpInch = GetDeviceCaps(hDC, 90) / 72
hFont = CreateFontA(-Taille * PixpInch, 0, 0, 0, _
400 + 300 * Gras, Italique, 0, 0, 1, 0, 0, 0, 0, Police)
If hFont = 0 Then LargeurTexte = 0: Exit Function
SelectObject hDC, hFont
GetTextExtentPoint32A hDC, Texte, Len(Texte), TSize
DeleteObject hFont
ReleaseDC 0, hDC
LargeurTexte = TSize.cx

End Function


Par simple copier / coller dans VB .Net, j'ai juste à remplacer le bloc Type
/ End Type par ce bloc :

Public Structure Size
Public cx As Long

Public cy As Long

End Structure

et à corriger le titre de la fonction ainsi :
Public Function LargeurTexte(ByVal Texte As String, _

Optional ByVal Police As String = "Arial", _

Optional ByVal Taille As Double = 10, _

Optional ByVal Gras As Boolean = False, _

Optional ByVal Italique As Boolean = False)



Hélas, 1 erreur se produit sur la ligne :

GetTextExtentPoint32A(hDC, Texte, Len(Texte), TSize)

Pourtant les lignes précédentes fonctionnent normalement.



Je continue de chercher de mon côté.

Si 1 personne comprend où se situe le pb, merci de me faire part de sa
solution :)



Stéphane

7 réponses

Avatar
Stéphane L.
Apparement, c'est directement la méthode Graphics.MeasureStringqui
répondrait à mon besoin.

Mais je n'arrive pas à l'utiliser car dans ma procédure je n'ai pas de
variable e As PaintEventArgs.

Avez-vous 1 idée SVP ?

Merci d'avance

Stéphane

"Stéphane L." a écrit dans le
message de news:
Le but de cette fonction est de connaître la longueur en pixel d'1 texte.

Voici le Code qui fonctionne normalement sous Access :

'Déclaration pour la fonction LargeurTexte

Public Type Size
cx As Long
cy As Long
End Type

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Public Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Public Declare Function CreateFontA Lib "gdi32" _
(ByVal H As Long, ByVal W As Long, ByVal E As Long, _
ByVal O As Long, ByVal W As Long, ByVal i As Long, _
ByVal u As Long, ByVal S As Long, ByVal C As Long, _
ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long

Public Declare Function SelectObject Lib "gdi32" _
(ByVal hDC As Long, ByVal hObject As Long) As Long

Public Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Public Declare Function GetTextExtentPoint32A Lib "gdi32" _
(ByVal hDC As Long, ByVal lpsz As String, _
ByVal cbString As Long, lpSize As Size) As Long

Public Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

Public Function LargeurTexte(Texte As String, Police As String, _
Taille As Double, Optional Gras As Boolean, Optional Italique As Boolean)

Dim hFont As Long
Dim hDC As Long
Dim TSize As Size
Dim PixpInch As Double

hDC = GetDC(0)
PixpInch = GetDeviceCaps(hDC, 90) / 72
hFont = CreateFontA(-Taille * PixpInch, 0, 0, 0, _
400 + 300 * Gras, Italique, 0, 0, 1, 0, 0, 0, 0, Police)
If hFont = 0 Then LargeurTexte = 0: Exit Function
SelectObject hDC, hFont
GetTextExtentPoint32A hDC, Texte, Len(Texte), TSize
DeleteObject hFont
ReleaseDC 0, hDC
LargeurTexte = TSize.cx

End Function


Par simple copier / coller dans VB .Net, j'ai juste à remplacer le bloc
Type / End Type par ce bloc :

Public Structure Size
Public cx As Long

Public cy As Long

End Structure

et à corriger le titre de la fonction ainsi :
Public Function LargeurTexte(ByVal Texte As String, _

Optional ByVal Police As String = "Arial", _

Optional ByVal Taille As Double = 10, _

Optional ByVal Gras As Boolean = False, _

Optional ByVal Italique As Boolean = False)



Hélas, 1 erreur se produit sur la ligne :

GetTextExtentPoint32A(hDC, Texte, Len(Texte), TSize)

Pourtant les lignes précédentes fonctionnent normalement.



Je continue de chercher de mon côté.

Si 1 personne comprend où se situe le pb, merci de me faire part de sa
solution :)



Stéphane




Avatar
Zoury
Salut Stéphane !

Voici le Code qui fonctionne normalement sous Access :




N'oublie pas qu'une des différences primordiales entre VBA et VB.NET c'est
qu'un Long devient un Int32 (Integer). Tu devras donc modifier tes
déclarations.

Voici un document intéressant sur le sujet :
http://msdn.microsoft.com/msdnmag/issues/03/07/NET/


--
Cordialement
Yanick
MVP pour Visual Basic
'Déclaration pour la fonction LargeurTexte

Public Type Size
cx As Long
cy As Long
End Type

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Public Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Public Declare Function CreateFontA Lib "gdi32" _
(ByVal H As Long, ByVal W As Long, ByVal E As Long, _
ByVal O As Long, ByVal W As Long, ByVal i As Long, _
ByVal u As Long, ByVal S As Long, ByVal C As Long, _
ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long

Public Declare Function SelectObject Lib "gdi32" _
(ByVal hDC As Long, ByVal hObject As Long) As Long

Public Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Public Declare Function GetTextExtentPoint32A Lib "gdi32" _
(ByVal hDC As Long, ByVal lpsz As String, _
ByVal cbString As Long, lpSize As Size) As Long

Public Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

Public Function LargeurTexte(Texte As String, Police As String, _
Taille As Double, Optional Gras As Boolean, Optional Italique As


Boolean)

Dim hFont As Long
Dim hDC As Long
Dim TSize As Size
Dim PixpInch As Double

hDC = GetDC(0)
PixpInch = GetDeviceCaps(hDC, 90) / 72
hFont = CreateFontA(-Taille * PixpInch, 0, 0, 0, _
400 + 300 * Gras, Italique, 0, 0, 1, 0, 0, 0, 0, Police)
If hFont = 0 Then LargeurTexte = 0: Exit Function
SelectObject hDC, hFont
GetTextExtentPoint32A hDC, Texte, Len(Texte), TSize
DeleteObject hFont
ReleaseDC 0, hDC
LargeurTexte = TSize.cx

End Function


Par simple copier / coller dans VB .Net, j'ai juste à remplacer le bloc


Type
/ End Type par ce bloc :

Public Structure Size
Public cx As Long

Public cy As Long

End Structure

et à corriger le titre de la fonction ainsi :
Public Function LargeurTexte(ByVal Texte As String, _

Optional ByVal Police As String = "Arial", _

Optional ByVal Taille As Double = 10, _

Optional ByVal Gras As Boolean = False, _

Optional ByVal Italique As Boolean = False)



Hélas, 1 erreur se produit sur la ligne :

GetTextExtentPoint32A(hDC, Texte, Len(Texte), TSize)

Pourtant les lignes précédentes fonctionnent normalement.



Je continue de chercher de mon côté.

Si 1 personne comprend où se situe le pb, merci de me faire part de sa
solution :)



Stéphane




Avatar
Zoury
> Apparement, c'est directement la méthode Graphics.MeasureStringqui
répondrait à mon besoin.



J'ai lu quelque part que Graphics.MeasureString() ne renvoyait pas la taille
du texte de manière précise, mais plutôt un Type SizeF qui correspondrait à
la taille minimum exigé pour permettre l'affichage complet de ce texte.

Que cherche tu à faire exactement ?

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Stéphane L.
Tout à fait Yanick, c'est exactement çà que je cherche :
la taille minimum exigée pour permettre l'affichage complet d'un texte.


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Apparement, c'est directement la méthode Graphics.MeasureStringqui
répondrait à mon besoin.



J'ai lu quelque part que Graphics.MeasureString() ne renvoyait pas la
taille
du texte de manière précise, mais plutôt un Type SizeF qui correspondrait
à
la taille minimum exigé pour permettre l'affichage complet de ce texte.

Que cherche tu à faire exactement ?

--
Cordialement
Yanick
MVP pour Visual Basic




Avatar
Zoury
ah! bien dans ce cas... :O)

Voici un exemple qui redimensionne un Label en fonction de la longueur du
texte qu'il contient. Démarre toi une nouvelle Windows Application et
colle ce code dans le Form1 :
'***
Option Explicit On

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Code généré par le Concepteur Windows Form "

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel
InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
Friend WithEvents Label1 As System.Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.TextBox1 = New System.Windows.Forms.TextBox
Me.Label1 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(8, 8)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(608, 20)
Me.TextBox1.TabIndex = 0
Me.TextBox1.Text = "TextBox1"
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(8, 32)
Me.Label1.Name = "Label1"
Me.Label1.TabIndex = 1
Me.Label1.Text = "Label1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(624, 266)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.TextBox1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
TextBox1.Text = String.Empty
Label1.BackColor = Color.Azure
End Sub

Private Sub Label1_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Label1.TextChanged
Label1.Size = Label1.CreateGraphics.MeasureString(Label1.Text,
Label1.Font).ToSize()
End Sub

Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles TextBox1.TextChanged
Label1.Text = TextBox1.Text
End Sub

End Class
'***

--
Cordialement
Yanick
MVP pour Visual Basic

"Stéphane L." a écrit dans le
message de news:%
Tout à fait Yanick, c'est exactement çà que je cherche :
la taille minimum exigée pour permettre l'affichage complet d'un texte.


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
>> Apparement, c'est directement la méthode Graphics.MeasureStringqui
>> répondrait à mon besoin.
>
> J'ai lu quelque part que Graphics.MeasureString() ne renvoyait pas la
> taille
> du texte de manière précise, mais plutôt un Type SizeF qui


correspondrait
> à
> la taille minimum exigé pour permettre l'affichage complet de ce texte.
>
> Que cherche tu à faire exactement ?
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
>
>




Avatar
Stéphane L.
Merci Yanick,

Désolé de te redéranger, j'ai du mal à adapter le code en fonction de mon
besoin.

Le texte que je veux mesurer n'est affiché nul part. Il est juste en mémoire
dans 1 variable pour être imprimé.

C'est possible aussi ?


Re merci d'avance :)

Stéphane



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news: Om9xPW%
ah! bien dans ce cas... :O)

Voici un exemple qui redimensionne un Label en fonction de la longueur du
texte qu'il contient. Démarre toi une nouvelle Windows Application et
colle ce code dans le Form1 :
'***
Option Explicit On

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Code généré par le Concepteur Windows Form "

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel
InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
Friend WithEvents Label1 As System.Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.TextBox1 = New System.Windows.Forms.TextBox
Me.Label1 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(8, 8)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(608, 20)
Me.TextBox1.TabIndex = 0
Me.TextBox1.Text = "TextBox1"
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(8, 32)
Me.Label1.Name = "Label1"
Me.Label1.TabIndex = 1
Me.Label1.Text = "Label1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(624, 266)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.TextBox1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
TextBox1.Text = String.Empty
Label1.BackColor = Color.Azure
End Sub

Private Sub Label1_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Label1.TextChanged
Label1.Size = Label1.CreateGraphics.MeasureString(Label1.Text,
Label1.Font).ToSize()
End Sub

Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles TextBox1.TextChanged
Label1.Text = TextBox1.Text
End Sub

End Class
'***

--
Cordialement
Yanick
MVP pour Visual Basic

"Stéphane L." a écrit dans
le
message de news:%
Tout à fait Yanick, c'est exactement çà que je cherche :
la taille minimum exigée pour permettre l'affichage complet d'un texte.


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
>> Apparement, c'est directement la méthode Graphics.MeasureStringqui
>> répondrait à mon besoin.
>
> J'ai lu quelque part que Graphics.MeasureString() ne renvoyait pas la
> taille
> du texte de manière précise, mais plutôt un Type SizeF qui


correspondrait
> à
> la taille minimum exigé pour permettre l'affichage complet de ce texte.
>
> Que cherche tu à faire exactement ?
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
>
>








Avatar
Stéphane L.
Ca marche !!!!

Merci Yanick !!! :)

Stéphane

"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news: Om9xPW%
ah! bien dans ce cas... :O)

Voici un exemple qui redimensionne un Label en fonction de la longueur du
texte qu'il contient. Démarre toi une nouvelle Windows Application et
colle ce code dans le Form1 :
'***
Option Explicit On

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Code généré par le Concepteur Windows Form "

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel
InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
Friend WithEvents Label1 As System.Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.TextBox1 = New System.Windows.Forms.TextBox
Me.Label1 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(8, 8)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(608, 20)
Me.TextBox1.TabIndex = 0
Me.TextBox1.Text = "TextBox1"
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(8, 32)
Me.Label1.Name = "Label1"
Me.Label1.TabIndex = 1
Me.Label1.Text = "Label1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(624, 266)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.TextBox1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
TextBox1.Text = String.Empty
Label1.BackColor = Color.Azure
End Sub

Private Sub Label1_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Label1.TextChanged
Label1.Size = Label1.CreateGraphics.MeasureString(Label1.Text,
Label1.Font).ToSize()
End Sub

Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles TextBox1.TextChanged
Label1.Text = TextBox1.Text
End Sub

End Class
'***

--
Cordialement
Yanick
MVP pour Visual Basic

"Stéphane L." a écrit dans
le
message de news:%
Tout à fait Yanick, c'est exactement çà que je cherche :
la taille minimum exigée pour permettre l'affichage complet d'un texte.


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
>> Apparement, c'est directement la méthode Graphics.MeasureStringqui
>> répondrait à mon besoin.
>
> J'ai lu quelque part que Graphics.MeasureString() ne renvoyait pas la
> taille
> du texte de manière précise, mais plutôt un Type SizeF qui


correspondrait
> à
> la taille minimum exigé pour permettre l'affichage complet de ce texte.
>
> Que cherche tu à faire exactement ?
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
>
>