Comment obtenir une barre de format

[Résolu]
Signaler
Messages postés
181
Date d'inscription
dimanche 3 décembre 2006
Statut
Membre
Dernière intervention
28 octobre 2010
-
Messages postés
181
Date d'inscription
dimanche 3 décembre 2006
Statut
Membre
Dernière intervention
28 octobre 2010
-
Hello,

Comment intégrer dans ma form une barre de format (comprenant par exemple, la couleur, la police, la taille, le caractere gras, italique ou souligné) ?

Merci d'avance pour vos réponses.

Nono.

11 réponses

Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
T'es prêt ?

Celà va prendre beaucoup de place à cause des commantaires (je me suis montré vraiment très généreux, tu vas voir...)

Un projet, donc, composé d'une Form et d'un module

1) sur une form :
un bouton de commande CHOIXPOLICE

- code pour la Form :

Private Sub CHOIXPOLICE_Click()
  MsgBox ShowFont(Me)
End Sub

2) dans le module :

Const FW_NORMAL = 400
Const DEFAULT_CHARSET = 1
Const OUT_DEFAULT_PRECIS = 0
Const CLIP_DEFAULT_PRECIS = 0
Const DEFAULT_QUALITY = 0
Const DEFAULT_PITCH = 0
Const FF_ROMAN = 16
Const CF_PRINTERFONTS = &H2
Const CF_SCREENFONTS = &H1
Const CF_BOTH = (CF_SCREENFONTS Or CF_PRINTERFONTS)
Const CF_EFFECTS = &H100&
Const CF_FORCEFONTEXIST = &H10000
Const CF_INITTOLOGFONTSTRUCT = &H40&
Const CF_LIMITSIZE = &H2000&
Const REGULAR_FONTTYPE = &H400
Const LF_FACESIZE = 32
Const CCHDEVICENAME = 32
Const CCHFORMNAME = 32
Const GMEM_MOVEABLE = &H2
Const GMEM_ZEROINIT = &H40
Const DM_DUPLEX = &H1000&
Const DM_ORIENTATION = &H1&
Const PD_PRINTSETUP = &H40
Const PD_DISABLEPRINTTOFILE = &H80000




Private Type LOGFONT          'STRUCTURE LOGFONT
    lfHeight As Long                 '|hauteur
    lfWidth As Long                  '|largeur
    lfEscapement As Long             '|échappement
    lfOrientation As Long            '|orientation
    lfWeight As Long                 '|poids
    lfItalic As Byte                 '|style itallique
    lfUnderline As Byte              '|style souligné
    lfStrikeOut As Byte              '|style barré
    lfCharSet As Byte                '|jeu de caractères
    lfOutPrecision As Byte           '|
    lfClipPrecision As Byte          '|
    lfQuality As Byte                '|qualité
    lfPitchAndFamily As Byte         '|
    lfFaceName As String * 31        '|
End Type




'-------------------------------------
Private Type CHOOSEFONT
  lStructSize As Long
  hwndOwner As Long
  hdc As Long
  lpLogFont As Long
  iPointSize As Long
  Flags As Long
  rgbColors As Long
  lCustData As Long
  lpfnHook As Long
  lpTemplateName As String
  hInstance As Long
  lpszStyle As String
  nFontType As Integer
  MISSING_ALIGNMENT As Integer
  nSizeMin As Long
  nSizeMax As Long
End Type
'La fonction ChooseFont affiche une boîte de dialogue permettant de choisir une police de caractères et ses
'attributs (nom, style, taille, effets, couleur, etc...)
'Si l'utiliosateur clique sur OK, la valeur retournée est différente de 0. Les membres de la structure
'CHOOSEFONT (voir ci-dessus) contiennent les choix de l'utilisateur.
'Si l'utilisateur annule ou ferme la boîte de dialogue, une erreur survient - la valeur retournée est 0 - l'appel
'de CommDlgExtendedError permet alors d'en connaître les raisons, qui peuvent être l'une des suivantes :
   'CDERR_FINDRESFAILURE , CDERR_NOHINSTANCE, CDERR_INITIALIZATION, CDERR_NOHOOK, CDERR_LOCKRESFAILURE,
   'CDERR_NOTEMPLATE, CDERR_LOADRESFAILURE, CDERR_STRUCTSIZE, CDERR_LOADSTRFAILURE, CFERR_MAXLESSTHANMIN,
   'CDERR_MEMALLOCFAILURE, CFERR_NOFONTS, CDERR_MEMLOCKFAILURE
'pChoosefont : pointeur vers la structure CHOOSEFONT contenant les informations utilisées pour ouvrir la
'        boîte de dialogue. Au retour, cette structure contient des informations sur les choix de l'utilisateur.
Public Declare Function CHOOSEFONT Lib "comdlg32.dll" Alias "ChooseFontA" (pChoosefont As CHOOSEFONT) As Long
'-------------------------------------
'La fonction CopyMemory copie un bloc de mémoire d'un endroit vers l'autre.
'Cette fonction ne retourne aucune valeur.
'hpvDest : pointeur vers l'adresse de destination du bloc à copier.
'hpvSource : pointeur vers l'adresse du bloc à copier.
'cbCopy : spécifie la taille (en octets) du bloc de mémoire à copier.
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
'-------------------------------------
'La fonction GlobalLock verrouille un objet "mémoire globale" et retourne un pointeur vert le 1er octet
'du bloc de mémoire de cet objet. Le bloc de mémoire associé à un objet mémoire verrouillé ne peut être ni
'déplacé ni effacé.
'En cas de succès : la valeur retournée est un pointeur vers le 1er octet du bloc de mémoire
'En cas d'échec : la valeur retournée est 0 (l'appel de GetLastError permet alors d'en connaître les raisons).
'hMem : identifie l'objet "mémoire globale". Ce handle est retourné soit par la fonction GlobalAlloc, soit
'       par la fonction GlobalReAlloc.
Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
'-------------------------------------
'La fonction GlobalUnlock diminue d'une unité le compteur de verrouillage associé à l'objet mémoire alloué
'le drapeau ("flag") GMEM_MOVEABLE. Si cet objet demeure verrouillé après ce compte à rebours, la valeur
'retournée est différente de 0.
'En cas d'échec : la valeur retournée est 0( l'appel de GetLastError permet alors d'en connaître les raisons.
'Si GetLastError retourne NO_ERROR, l'objet mémoire est déverrouillé).
'hMem : identifie l'objet "mémoire globale". Ce handle est retourné soit par la fonction GlobalAlloc, soit
'       par la fonction GlobalReAlloc.
Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
'-------------------------------------
'La fonction The GlobalAlloc alloue en mémoire le nombre spécifié d'octets. Dans l'environnement linéaire
'Win32 API, il n'y a pas de différence entre le lot-mémoire local et le lot-mémoire global.
'En cas de succès : la valeur retournée est différente de 0.
'En cas d'échec : la valeur retournée est 0 (l'appel de GetLastError permet alors d'en connaître les raisons)
'uFlags : drapeaux ("flags") spécifiant le mode d'allocation de mémoire. Si ce drapeau est 0, le mode appliqué
'         par défaut est GMEM_FIXED. Sauf en cas d'incompatibilité (voir plus bas), il est possible
'         d'utliser toutes les combinaisons de drapeaux ci-après. Pour exprimer que la fonction alloue une
'         mémoire fixe ou déplaçable, on utilise un des 4 drapeaux suivants :
'         GMEM_FIXED : (mémoire fixe). Ce drapeau n'est pas combinable avec GMEM_MOVEABLE ou GMEM_DISCARDABLE
'                      la valeur retournée est un pointeur vers le bloc de mémoire. Pour accéder à la
'                      mémoire, le processus appelant transmet la valeur retournée à un pointeur.
'         GMEM_MOVEABLE : (mémoire déplaçable). Ce drapeau n'est pas combinale avec GMEM_FIXED. La valeur
'                       retournée est le handle de l'objet mémoire. Le handle est une quantité 32-bit
'                       associée au seul processus appelant. Pour traduire le handle en pointeur, il faut
'                       appeler la fonction GlobalLock.
'         GPTR : combine les drapeaux GMEM_FIXED et GMEM_ZEROINIT
'         GHND : combine les drapeaux GMEM_MOVEABLE et GMEM_ZEROINIT
'   GMEM_DDESHARE: alloue une mémoire à utiliser en échange DDE ou en conversation DDE. Cette mémoire n'est
'                pas partagée globalement. Ce drapeau est toutefois disponible pour des raisons de
'                compatibilité et peut être utilisé pour certaines applications afin d'améliorer la
'                performance des opérations DDE. Il doit donc être spécifié si la mémoire doit être
'                utilisée par des opérations DDE. Seuls les processus utilisant DDE ou le presse-papier en
'                vue de communication entre processus doivent spécifier ce drapeau.
'   GMEM_DISCARDABLE : (mémoire "jetable"). Ce drapeau ne peut être combiné avec GMEM_FIXED flag.
'   GMEM_LOWER : à ignorer : ce drapeau n'est présent que pour des raisons de compatibilité avec Win 3.x
'   GMEM_NOCOMPACT : (pas de compactage ni n'effaçage de la mémoire à la demande)
'   GMEM_NODISCARD ; (pas d'effaçage de la mémoire à la demande)
'   GMEM_NOT_BANKED : à ignorer : ce drapeau n'est présent que pour des raisons de compatibilité avec Win 3.x
'   GMEM_NOTIFY :  à ignorer : ce drapeau n'est présent que pour des raisons de compatibilité avec Win 3.x
'   GMEM_SHARE : idem que pour le drapeau GMEM_DDESHARE
'   GMEM_ZEROINIT : pour initialiser à 0 le contenu de la mémoire.
'dwBytes : spécifie le nombre d'octets à allouer. Si ce paramètre est 0 et que l'on a spécifié le drapeau
'         GMEM_MOVEABLE, la fonction retourne un handle vert un objet mémoire marqué comme abandonné.
Public Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
'-------------------------------------
'La fonction GlobalFree libère l'objet "mémoire globale" spécifié et en supprime le handle.
'En cas de succès : la valeur retournée est 0.
'En cas d'échec : la valeur retournée est égale au handle de l'objet "mémoire globale" (l'appel de
'                 GetLastError permet alors d'en connaître les raisons).
'hMem : identifie l'objet "mémoire globale". Ce handle est retourné soit par la fonction GlobalAlloc, soit
'       par la fonction GlobalReAlloc.
Public Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
'-------------------------------------


'Dim customcolors() As Byte


Public Function ShowFont(forma As Form) As String
  Dim cf As CHOOSEFONT, lfont As LOGFONT, hMem As Long, pMem As Long
  Dim FontName As String, retVal As Long
  lfont.lfHeight = 0  ' fixe la hauteur par défaut
  lfont.lfWidth = 0  ' fixe la largeur par défaut
  lfont.lfEscapement = 0  ' angle formé par la ligne de base et le vecteur d'échappement
  lfont.lfOrientation = 0  ' angle formé par la ligne de base et le vecteur d'orientation
  lfont.lfWeight = FW_NORMAL  ' style normal (non gras)
  lfont.lfCharSet = DEFAULT_CHARSET  ' jeu de caractères par défaut
  lfont.lfOutPrecision = OUT_DEFAULT_PRECIS  ' précision par défaut ("mapping")
  lfont.lfClipPrecision = CLIP_DEFAULT_PRECIS  ' précision par défaut ("clipping")
  lfont.lfQuality = DEFAULT_QUALITY  ' qualité par défaut
  lfont.lfPitchAndFamily = DEFAULT_PITCH Or FF_ROMAN  ' pitch par défaut, proportionne, avec serif
  lfont.lfFaceName = "Times New Roman" & vbNullChar  ' cette chaine doit se terminer par un caractère nul
  ' on crée le bloc de mémoire qui servira de tampon pour l structure de LOGFONT
  hMem = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(lfont))
  pMem = GlobalLock(hMem)  ' verrouillage du pointer
  CopyMemory ByVal pMem, lfont, Len(lfont)  ' copie les membres de la structure dans le bloc
  ' initialise la boite de dialogue: polices d'écran et d'imprimante -, taille de caractères entre 10 et 72.
  cf.lStructSize = Len(cf)  ' taille de la structure
  cf.hwndOwner = forma.hWnd  ' C'est la fenêtre de la feuille ouverte qui appelle cette la boite de dialogue
  cf.hdc = Printer.hdc  ' contexte de l'imprimante par défaut (utilisation du mécanisme de VB)
  cf.lpLogFont = pMem   ' pointeur vers le tampon/mémoire LOGFONT
  cf.iPointSize = 120  ' 12 tailles de caractère (unités de 1/10 de point)
  cf.Flags = CF_BOTH Or CF_EFFECTS Or CF_FORCEFONTEXIST Or CF_INITTOLOGFONTSTRUCT Or CF_LIMITSIZE
  cf.rgbColors = RGB(0, 0, 0)  ' noir
  cf.nFontType = REGULAR_FONTTYPE  ' style normal ( ni gras ni etc...)
  cf.nSizeMin = 10  ' taille de caractères minimum
  cf.nSizeMax = 72  ' taille de caractères maximum
  ' on appelle maintenant la fonction. Si elle réussit, on renvoie vers la structure les éléments de LOGFONT.
  ' On affiche ensuite les attributs choisis par l'utilisateur
  retVal = CHOOSEFONT(cf)  ' ouverture de la boite de dialogue
  If retVal <> 0 Then  ' réussite
    CopyMemory lfont, ByVal pMem, Len(lfont)  ' on renvoie ce qui est dans la mémoire
    ' On transforme en chainage "normal"
    '---------------------------------------------------------------------------------------------
     '*********** ATTENTION ! ACHTUNG ! CUIDADO ! WARNING !
    'Ici je me suis contenté, à titre d'exemple, de retourner la nom de la police choisie
    'en renvoyant la valeur de lfFaceName....
    'A toi de voir (je te fais confiance, ami nono78220 ) comment, en lieu et place, retourner tout ce qui
    ' a été choisi ...
    'un indice : soit tu es déjà à l'aise et tu retournes un tableau de valeurs,
    'soit tu es moins à l'aise et du retournes une chaîne composée des différents
    'élements à récupérer, séparés par un séparateur, @ par exemple, de ton choix
    ' et tu utilises Split pour les extraire un à un .... fastoche !
    '****************************************************************************
    '---------- ICI FIN DE ACHTUNG --------------------------------------------------------------
   
    ShowFont = Left(lfont.lfFaceName, InStr(lfont.lfFaceName, vbNullChar) - 1)
    Debug.Print
  End If
  ' On libère le tampon mémoire créé antérieurement, que la fonction ait ou non réussi
  retVal = GlobalUnlock(hMem)  ' on détruit le pointeur et on dévérrouille le bloc
  retVal = GlobalFree(hMem)  'on libère la mémoire allouée
End Function


Allez ! analyse ! Faut pas avoir peur !




 
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Bonjour... Bien dormi ?

Si tu as fait des cauchemars à cause de celà et que tu as encore peur, rien ne t'empêche, bien évidemment, de mettre en oeuvre ce que je t'ai également dit plus haut : insertion et utilisation d'un contrôle commondialog ...

Sur une form :
- un commondialog cd1 et un nouton de commande command1

code :

Const FW_NORMAL = 400
Const DEFAULT_QUALITY = 0
Const CF_PRINTERFONTS = &H2
Const CF_SCREENFONTS = &H1
Const CF_BOTH = (CF_SCREENFONTS Or CF_PRINTERFONTS)
Const CF_EFFECTS = &H100&
Const CF_FORCEFONTEXIST = &H10000
Const CF_INITTOLOGFONTSTRUCT = &H40&
Const CF_LIMITSIZE = &H2000&
Const REGULAR_FONTTYPE = &H400
Const LF_FACESIZE = 32
Const CCHDEVICENAME = 32
Const CCHFORMNAME = 32


Private Sub Command1_Click()
  cd1.Flags = CF_BOTH Or CF_EFFECTS Or CF_FORCEFONTEXIST Or CF_INITTOLOGFONTSTRUCT 'Or CF_LIMITSIZE
  cd1.ShowFont
  MsgBox "police : " & cd1.FontName & vbCrLf & "couleur " & cd1.Color & vbCrLf & _
  "taille : " & cd1.FontSize & vbCrLf & "italique ? " & cd1.FontItalic & vbCrLf & _
  "gras ? " & cd1.FontBold
  '
  ' bon.... je te laisse continuer, là , hein ?.....
End Sub
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
En utilisant le composant Commondialog, entre autres...
Ou en faisant comme moi : en te servant directement de la fonction CHOOSEFONT de la librairie "comdlg32.dll" de l'Api de Windows (je préfère, pour des raisons de rapidité et d'élégance)
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
elle n'existe pas en standard.

Tu integre une barre d'outils dans laquelle tu dois recreer l'ensemble des outils que tu veux

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Bé !

Moi je ne mettrais qu'un tout petit et discret bouton qui, cliqué, m'ouvrirait la boîte de diaolgue de ChooseFont ....
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Je reviendrai avec un code après diner (j'ai faim) si nécessaire...
Messages postés
181
Date d'inscription
dimanche 3 décembre 2006
Statut
Membre
Dernière intervention
28 octobre 2010

Je compte sur toi pour le code... il faut que tu m'en explqiues un peu plus pour la commande choosefont de librairie "cmddlg32.dll de windows. Comment l'obtenir ?
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Aïe  ! Ouille !  Il la veut !

Bon.....
dans 10 à 15  minutes alors.... (faut que je te prépare l'insertion de "quelques commentaires" ... pour que rien ne t'échappe...
A +
Messages postés
181
Date d'inscription
dimanche 3 décembre 2006
Statut
Membre
Dernière intervention
28 octobre 2010

Salut jmfmarques,

Je viens de découvrir ce que tu m'as envoyé. Oh Put...., je ne pensais pas que cela était si compliqué avec choosefont !!
Bien, je dois persévérer, je vais donc analyser ce que tu m'as envoyé. Je vais testé les 2 méthodes.
Je te tiens au courant, si j'ai le temps car j'ai bcp de travail ce jour.
A bientot

(et encore merci pour tes propositions et conseils.)
Messages postés
181
Date d'inscription
dimanche 3 décembre 2006
Statut
Membre
Dernière intervention
28 octobre 2010

testé s'écrit tester.
Messages postés
181
Date d'inscription
dimanche 3 décembre 2006
Statut
Membre
Dernière intervention
28 octobre 2010

Hello,

J'ai donc analysé ce que tu m'as proposé. J'ai opté pour la deuxième proposition qui est moins longue et moins difficile à comprendre !! Le code utilisant la fonction ChooseFont est intellectuellement intéressant mais oh bien compliqué pour un non professionnel de la programmation !!!!

Les deux codes fonctionnent cependant parfaitement bien, et je les ai enregistrés précieusement sur mon doisque dur.

J'ai une question supplémentaire concernant ma RichTextBox. Je la met sur le forum.

Encore Merci