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

Positionner une commandbar dans un formulaire

11 réponses
Avatar
J-Pierre
Bonjour tout le monde,

Tout est dans le titre........Mon problème: J'utilise le contrôle ActiveX RTF2 que Pierre m'a trouvé pour faire du Rich Text
Format. Ca marche super bien...

Mais je l'utilise dans différents formulaires, et j'aimerais que la barre d'outils soit placée juste au dessus du contrôle
pour une meilleure visibilité. J'ai donc mis le code suivant sur l'évènement "sur chargement" des formulaires :

Dim cbar, pry

For Each cbar In CommandBars
If cbar.Name = "RTF2" Then
cbar.Position = msoBarFloating 'mis en commentaire, marche pas non plus
cbar.Left = Me.RTFcontrol.Left
cbar.Top = Me.RTFcontrol.Top - cbar.Height - 10
Exit For
End If
Next

Et la sale bête me place systématiquement la barre d'outils en bas à droite de l'écran. J'ai bien cherché de partout, sur
Google, le site de Raymond, celui de Pierre, je suppose que ça inclut le site transmuté d'Anor, rien de rien, et je galère
depuis hier matin et je commence à péter les plombs :-(

Alors, si vous savez :-))))))))

Passez tous un excellent Noël et à bientôt
J-Pierre

10 réponses

1 2
Avatar
J-Pierre
Encore moi !!!!

Pendant que j'y suis.... J'essaie aussi désespérement de lister les propriétés et leurs valeurs d'une CommandBar pour voir ce
que RTF2 a dans le ventre. Mais il n'y a pas de collection Properties pour cet objet, alors mon code ne marche pas:

For Each pry In CommandBars("RTF2")
Wmess = Wmess & pry.Name & " " & pry.Value & vbCrLf
Next pry

Si vous savez....

Merci d'avance
J-Pierre
Avatar
J-Pierre
Mouais.... je fais des progrès......

Si je positionne la barre manuellement au dessus de mon contrôle et qu'ensuite, j'affiche les propriétés, j'obtiens:

Me.RTFcontrol.Left = 284
Me.RTFcontrol.Top = 1134
cbar.Left = 20
cbar.Top = 105
cbar.Height = 46

Les unités ne sont sans doute pas les mêmes, des twips pour le contrôle et des pixels pour la CommabdBar. Ou le contraire. Je
pars à la recherche d'une formule de conversion....

J-Pierre
Avatar
J-Pierre
Dernier post pour aujourd'hui, ras le bol.......

Sur le site de Raymond, je trouve un lien vers un article de la KB Microsoft,
http://support.microsoft.com/default.aspx?scid=kb;fr;463203
et là, une belle formule.

Je recopie ça:
cbar.Left = Me.RTFcontrol.Left / Screen.TwipsPerPixelX

Erreur de compil, "Membre de méthode ou de données introuvable", il me manque sans doute une référence, mais laquelle ??????


Bon Noël

J-Pierre
Avatar
Gloops
Salut, ce que tu as trouvé là est valable sous VB6, où on obtient ceci :
? Screen.TwipsPerPixelX
15
? Screen.TwipsPerPixelY
15

Avec un peu de chance, en mettant 15 à la place ça marche ...
________________________________________
J-Pierre a écrit, le 24/12/2005 15:22 :

Dernier post pour aujourd'hui, ras le bol.......

Sur le site de Raymond, je trouve un lien vers un article de la KB Microsoft,
http://support.microsoft.com/default.aspx?scid=kb;fr;463203
et là, une belle formule.

Je recopie ça:
cbar.Left = Me.RTFcontrol.Left / Screen.TwipsPerPixelX

Erreur de compil, "Membre de méthode ou de données introuvable", il me manque sans doute une référence, mais laquelle ??????


Bon Noël

J-Pierre




Avatar
J-Pierre
Salut Gloops,

J'ai effectivement découvert que Screen.TwipsPerPixelX et Screen.TwipsPerPixelXY n'était pas supporté en VBA mais seulement en
VB. Mais j'ai aussi trouvé sur Internet le code qui émule cette fonction. Car on ne peut pas simplement remplacer par 15, si
tu changes la résolution de ton écran de par exemple 1024*768 à 800*600, les pixels deviennent plus gros et il y a plus de
twips par pixel.

Si j'ai bien compris......

Mais ce n'est pas la fin du problème. En effet la propriété TOP d'un contrôle de formulaire est exprimée par rapport au haut
du formulaire qui se trouve lui-même sous la barre bleue de la fenêtre et sous les CommandBar visibles car je fais un
DoCmd.Maximize. Comment déterminer la position absolue du haut du formulaire ? Là, j'y suis allé de manière empirique, prenons
un exemple, ce sera plus simple pour moi à expliquer:

J'ai la barre de menu, la barre d'outils standard et la barre RTF visibles, 3 barres en tout, dont la barre RTF qui se balade,
donc au dessus du formulaire, j'ai 2 barres + la barre bleue de la fenêtre = 3 barres en tout...... En faisant des essais,
j'ai constaté qu'une barre fait 390 de hauteur sous WIN XP et 350 sous WIN 2000. J'ai donc inclus dans ma formule de calcul (n
* 390), et ça tombe pile poil au-dessus de mon contrôle.

Mais ce serait quand même vachement mieux si quelqu'un avait du "vrai" code......

Enfin, je rends la barre RTF2 visible ou invisible sur les évènements "Sur activé" et "Sur désactivé" du formulaire.

J'insiste, du vrai code pour calculer la position absolue du haut du formulaire........

J-Pierre


Voilà le code dans le formulaire:

Private Sub Form_Activate()

On Error Resume Next
DoCmd.ShowToolbar "RTF2", acToolbarYes
On Error GoTo 0

Dim cbar
Dim addHaut As Long

For Each cbar In CommandBars
If cbar.Visible = True Then
addHaut = addHaut + 1
End If
Next cbar

For Each cbar In CommandBars
If cbar.Name = "RTF2" Then
cbar.Left = GetNombrePixelsX(Me.RTFcontrol.Left)
cbar.Top = GetNombrePixelsY(Me.RTFcontrol.Top) _
+ GetNombrePixelsY(addHaut * 390) - cbar.Height - 1
Exit For
End If
Next

End Sub

Private Sub Form_Deactivate()

On Error Resume Next
DoCmd.ShowToolbar "RTF2", acToolbarNo
On Error GoTo 0

End Sub

Voilà le code dans le module

Option Compare Database
Option Explicit

Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Declare Function CreateIC Lib "gdi32" Alias "CreateICA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal
lpOutput As String, lpInitData As Any) As Long
Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Private Const LOGPIXELSX = 88
Private Const LOGPIXELSY = 90

'
'Conversion Twips - pixels - pouces - cm
'
'Par définition: 1 pouce = 1440 twips = 2,54cm
'
'Il reste à déterminer le nombre de twips par pixel correspondant à la résolution de l'écran
'Remarques:
' -plus la résolution est faible et plus le nombre de twips par pixel est important car les pixels sont "plus gros"
' -le nombre de twips par pixel est a priori différent pour l'axe X et l'axe Y


Public Function GetTwipsPerPixelsX() As Long
Dim lngIC As Long

' Obtient le contexte périphérique pour trouver les informations sur l'affichage.
lngIC = CreateIC("DISPLAY", vbNullString, vbNullString, vbNullString)

' Si l'appel à CreateIC est réussi alors lngIC<>0
If lngIC <> 0 Then
GetTwipsPerPixelsX = 1440 / GetDeviceCaps(lngIC, LOGPIXELSX) ' GetDeviceCaps(lngIC, LOGPIXELSX) donne le nb de pixels
' par pouce selon l'axe X et 1 pouce = 1440 twips
' Libère le contexte périphérique.
DeleteDC lngIC
End If
End Function

Public Function GetTwipsPerPixelsY() As Long
Dim lngIC As Long

' Obtient le contexte périphérique pour trouver les informations sur l'affichage.
lngIC = CreateIC("DISPLAY", vbNullString, vbNullString, vbNullString)

' Si l'appel à CreateIC est réussi alors lngIC<>0
If lngIC <> 0 Then
GetTwipsPerPixelsY = 1440 / GetDeviceCaps(lngIC, LOGPIXELSY)
' Libère le contexte périphérique.
DeleteDC lngIC
End If

End Function

'
'exemple conversion twips -> pixels
'
Public Function GetNombrePixelsX(ByRef NbTwips As Long) As Long
GetNombrePixelsX = NbTwips / GetTwipsPerPixelsX
End Function

Public Function GetNombrePixelsY(ByRef NbTwips As Long) As Long
GetNombrePixelsY = NbTwips / GetTwipsPerPixelsY
End Function

'
'exemple conversion pixels -> twips
'
Public Function GetNombreTwipsX(ByRef NbPixels As Long) As Long
GetNombreTwipsX = NbPixels * GetTwipsPerPixelsX
End Function

Public Function GetNombreTwipsY(ByRef NbPixels As Long) As Long
GetNombreTwipsY = NbPixels * GetTwipsPerPixelsY
End Function
Avatar
Gloops
J-Pierre a écrit, le 26/12/2005 10:43 :

J'insiste, du vrai code pour calculer la position absolue du haut du formulaire........


Bon, alors le haut du formulaire c'est la propriété Top, ensuite pour
démarrer sous les barres d'outils, le vrai code va faire appel à la
propriété ClientArea, mais évidemment si elle n'existe pas, ça risque
d'être plus dur, et là il faudra bricoler ...

Peut-être en allant chercher dans les fenêtres enfant (avec les API) on
trouverait la zone client, mais je ne te promets rien quand à la
commodité de la distinguer des autres fenêtres enfants. Donc, si tu as
réussi ce que tu voulais faire, je pense qu'on peut considérer que tu es
déjà arrivé à un bon résultat.

Avatar
Gloops
Ah oui je n'ai répondu qu'à la moitié de la question.
Pour le GetTwipsPerPixelX, as-tu trouvé ?
Avatar
Gloops
J'y pense, une recherche dans Google sur
"GetTwipsPerPixel Access"
donne des pistes intéressantes.

En demandant les pages francophones on commence par une en Espagnol,
mais enfin ça c'est une anecdote ...
_____________________________________
Gloops a écrit, le 27/12/2005 12:25 :

Ah oui je n'ai répondu qu'à la moitié de la question.
Pour le GetTwipsPerPixelX, as-tu trouvé ?



Avatar
J-Pierre
Bonjour Gloops,

Oui, pour GetTwipsPerPixelX et GetTwipsPerPixelY, j'ai trouvé qu'ils n'étaient pas dispo avec Access. J'ai d'ailleurs publié
dans ce fil le code qui permet de les remplacer. Pour ClientArea, ce n'est pas dispo non plus, alors, je suis ton conseil,
j'ai réussi à faire ce que je voulais, j'en reste là.

Merci pour ton aide.

J-Pierre
Avatar
Gloops
Je me rends compte que j'ai répondu un peu vite, les API permettent d'en
savoir un peu plus. Le haut de la zone client je ne sais pas, mais sa
taille oui.

J'essaierai de trouver un moment pour ça.
1 2