nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 octobre 2010
-
17 janv. 2007 à 18:32
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 octobre 2010
-
19 janv. 2007 à 08:53
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é) ?
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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 18 janv. 2007 à 08:06
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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 janv. 2007 à 19:07
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)
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 octobre 2010 17 janv. 2007 à 19:28
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 ?
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 octobre 2010 18 janv. 2007 à 09:03
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.)
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 octobre 2010 19 janv. 2007 à 08:53
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.