Dans mon projet j'utilise le code de Nico sur les statusbar en couleur (corrigé pour PB d'aujourd'hui)
http://www.purebasic.fr/french/viewtopic.php?f=6&t=2107
C'est quasi son code mise à part le SetWindowCallback() car j'ai une callback type.
Le code de Nico a toujours bien fonctionné.
Ma statusbar a 2 champs et j'en avais masqué un que j'ai voulu réafficher mais ça ne marchait pas bien.
J'ai tenté plein de choses mais en vain, il n'y avait que le redrawwindow qui marchait et encore pas toujours et en plus ça scintillait.
Un debug sur le champs 1 (2ème champ) de la callback montrait que je n'y passait pas alors que pour le champs 0 (1ere champs) c'était ok.
Je travaille toujours avec le debugger intégré et le purificateur à fond, cela ne ralentit pas beaucoup et ça permet de déceler des erreurs en particulier dans les callback ou à l'initialisation.
Comme on est en mode ownerdrawn, je redessine comme Nico le fait dans son code, mais le 2ème champs n'apparaissait pas et ne changeait pas, il fallait un redrawwindow.
J'ai fini par compiler mes 2 cibles en 32 et 64 bits et j'ai exécuté.
Et la tout est Ok. Je relance avec le debugger et ça ne marche plus.
Tout est dit, un problème avec le debugger.
PB 5.31 x64 et x86 la même chose.
un peu de code extrait de mon projet
Code : Tout sélectionner
Procedure.i PIM_CallBack_StatusBar(Window, Message, wParam, lParam)
Protected L_OriginProc_StatusBar = GetProp_(Window, "Pure"+Hex(Window))
Protected *pointeur.Status_Draw_champs0, *pointeur1.Status_Draw_champs1
Protected lpSize.size
Protected hFontOld, Local_Font
Protected lptm.TEXTMETRIC
Protected texte$
;// variable permettant de dessiner les éléments
Protected *DrawItem.DRAWITEMSTRUCT = lParam
If lParam
Select Message
Case #WM_DRAWITEM
If *DrawItem\CtlType = #ODT_BUTTON
;// c'est un bouton, on quitte la callback, les boutons sont traités ailleurs
Else
If wParam = GetDlgCtrlID_(GLB_hMainStatusBar)
*DrawItem = lParam
*pointeur = *DrawItem\itemdata
If *DrawItem\itemID = 1
;// le champ des erreurs
*DrawItem.DRAWITEMSTRUCT = lParam
*pointeur1=*DrawItem\itemdata
If GetTextMetrics_(*DrawItem\hDC, lptm)
texte$ = Space((33*2)+2)
GetTextFace_(*DrawItem\hDC, 33*2, texte$)
Local_Font = PIM_Create_SystemFont(lptm, 0, #PB_Font_Italic| #PB_Font_Bold, texte$)
;// pas de test sur la valeur Longueur_Car_Style
If Local_Font
hFontOld = SelectObject_(*DrawItem\hDC, Local_Font)
EndIf
EndIf
SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
;// charge l'icône warning
SetTextColor_(*DrawItem\hDC, *pointeur1\couleur)
*DrawItem\rcItem\left +28+5 : *DrawItem\rcItem\top -2
DrawText_(*DrawItem\hDC, *pointeur1\Texte, -1, *DrawItem\rcItem , #DT_VCENTER| #DT_LEFT| #DT_SINGLELINE)
;// on détruit la font
If Local_Font
SelectObject_(*DrawItem\hDC, hFontOld)
DeleteObject_(Local_Font)
EndIf
Else
With *pointeur
SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
SetTextColor_(*DrawItem\hDC, *pointeur\couleur_zone_Style1)
Local_Font = PIM_Create_Font(GLB_StatusBar_Defaut_Font, \Style_zone_Style1)
If Local_Font
hFontOld = SelectObject_(*DrawItem\hDC, Local_Font)
EndIf
texte$ = PeekS(@*pointeur\Texte, \Longueur_Car_Style1)
;// le mot fichier en bleu
SetTextColor_(*DrawItem\hDC, \couleur_zone_Style1)
;// on retrouve la position de la chaine avec la police dce caractère associée au hdc
If GetTextExtentPoint32_(*DrawItem\hDC, texte$, \Longueur_Car_Style1, @lpSize) = 0
;// on détruit la font
;// on remet la font initiale pour ensuite écrire normalement
SelectObject_(*DrawItem\hDC, hFontOld)
If Local_Font
DeleteObject_(Local_Font)
EndIf
ProcedureReturn #True
EndIf
*DrawItem\rcItem\left + 21+12
;// on dessine le texte en gras correspondant à la longueur voulue
DrawText_(*DrawItem\hDC, texte$, -1, *DrawItem\rcItem , #DT_VCENTER| #DT_LEFT| #DT_SINGLELINE)
;// le reste du texte dans la couleur passée par la variable
SetTextColor_(*DrawItem\hDC, *pointeur\couleur_zone_Style2)
*DrawItem\rcItem\left = lpSize\cx + 27+12
;// on retrouve le texte manquant
texte$ = Mid(*pointeur\Texte, \Longueur_Car_Style1 + 1)
;// on remet la font initiale pour ensuite écrire normalement
If Local_Font
SelectObject_(*DrawItem\hDC, hFontOld)
;// on détruit la font
DeleteObject_(Local_Font)
EndIf
DrawText_(*DrawItem\hDC, texte$, -1, *DrawItem\rcItem, #DT_VCENTER| #DT_LEFT| #DT_SINGLELINE)
EndWith
EndIf
ProcedureReturn #True
EndIf
EndIf
Case #WM_NCDESTROY
;// Remettre la procédure d'origine
SetWindowLongPtr_(Window, #GWL_WNDPROC, L_OriginProc_StatusBar)
;// Supprimer la donnée associée à la fenêtre.
RemoveProp_(Window,"Pure"+Hex(Window))
EndSelect
EndIf
;On renvoie tous les autres évènements à la procédure d'origine.
ProcedureReturn CallWindowProc_(L_OriginProc_StatusBar, Window, Message, wParam, lParam)
EndProcedure
;// la fonction pour redessiner les champs
Procedure PIM_SetStatusBarString()
CompilerIf #Nom_Procedure = #True
Debug #PB_Compiler_Procedure
CompilerEndIf
;///////////////////////////////////////////////////////////////////////////////////////////////////
;//
;// FONCTION: PIM_SetStatusBarString()
;//
;// BUT: Créer la chaine affichée dans la StatusBar
;//
;// PARAMS: Aucun. utilises les var globales GLB_Champs_0\Texte, GLB_Msg\StatusBar_Champs0[i] etc.
;//
;// RETOURNE: rien
;//
;///////////////////////////////////////////////////////////////////////////////////////////////////
;// Le champs 1, nom de fichier et infos complémentaires si existe
;// le Style_zone_Style1 sert à différencier le mot 'Fichier' pour l'afficher en bleu du reste de la chaine
; couleur_zone_Style1.i ;// la couleur définie pour la zone de caractères de longeur Longueur_Car_Style1
; Font_zone_Style1.i ;// la fonte définie pour la zone de caractères de longeur Longueur_Car_Style1
; Style_zone_Style1.i ;// le style défini pour la zone de caractères de longeur Longueur_Car_Style1
; ;// Style_zone_Style1 = -1 on utilise la font \Font_zone_Style1
; ;// #PB_Font_Bold ; La police de caractère sera en gras
; ;// #PB_Font_Italic ; La police de caractère sera en italique
; ;// #PB_Font_Underline ; La police de caractère sera soulignée
; ;// #PB_Font_StrikeOut ; La police de caractère sera barrée
; Longueur_Car_Style1.i ;// nombre de caractères utilisant le style \Style_zone_Style1
; Format_text_zone_Style1.i ;// le format du texte à afficher, correspond au paramètre uFormt de DrawText_()
;// ********** la zone restante à afficher ***********************
; couleur_zone_Style2.i ;// la couleur définie pour la zone de caractères de longeur Longueur_Car_Style2
; Font_zone_Style2.i ;// la fonte définie pour la zone de caractères de longeur Longueur_Car_Style2
; Style_zone_Style2.i ;// le style défini pour la zone de caractères de longeur Longueur_Car_Style2
; ;// Style_zone_Style1 = -1 on utilise la font \Font_zone_Style1
; ;// #PB_Font_Bold ; La police de caractère sera en gras
; ;// #PB_Font_Italic ; La police de caractère sera en italique
; ;// #PB_Font_Underline ; La police de caractère sera soulignée
; ;// #PB_Font_StrikeOut ; La police de caractère sera barrée
; Longueur_Car_Style2.i ;// nombre de caractères utilisant le style \Style_zone_Style2
; Format_text_zone_Style2.i ;// le format du reste du texte à afficher, correspond au paramètre uFormt de DrawText_()
;// Le champs 2, les erreurs et sous erreurs si existent
;// compteur de boucle
Protected i
;// variable permettant de lire la langue en datasection
Protected Langue
Restore INIT_LANGID
;// on retrouve la chaine correspondant à la langue
For i = #First_Language To #Last_Language
Read Langue
If Langue = GLB_Langue_id
GLB_Champs_0\Texte = GLB_Msg\StatusBar_Champs0[i]
GLB_Champs_1\Texte = GLB_Msg\StatusBar_Champs1[i]
Break
EndIf
Next
;// la couleur du mot fichier
GLB_Champs_0\couleur_zone_Style1 = $BA5E12
GLB_Champs_0\Style_zone_Style1 = #PB_Font_Bold
;// nombre de caractères utilisant le 1er style
GLB_Champs_0\Longueur_Car_Style1 = FindString(GLB_Champs_0\Texte, ":", 1)
;// la couleur du reste de la chaine
GLB_Champs_0\couleur_zone_Style2 = #Black
GLB_Champs_0\Style_zone_Style2 = #PB_Font_Bold
;// la couleur du texte 2ème champs
GLB_Champs_1\couleur = #couleur_message_erreur
;// si texte vide 1er champs, alors on efface l'icône de ce champs, sinon on ajoute
If Len(GLB_Champs_0\Texte)
i = ImageID(#IcoNomFichier)
Else
;// on supprime l'icône
i = 0
EndIf
SendMessage_(GLB_hMainStatusBar, #SB_SETICON, 0, i)
;// si texte vide 2ème champs, alors on efface l'icône de ce 2ème champs, sinon on ajoute
If Len(GLB_Champs_1\Texte)
i = ImageID(#IcoMessageErreur)
Else
;// on supprime l'icône
i = 0
EndIf
SendMessage_(GLB_hMainStatusBar, #SB_SETICON, 1, i)
SendMessage_(GLB_hMainStatusBar, #SB_SETTEXTW, 0 | #SBT_OWNERDRAW, *GLB_pointeur_champs0)
SendMessage_(GLB_hMainStatusBar, #SB_SETTEXTW, 1 | #SBT_OWNERDRAW, *GLB_pointeur_champs1)
EndProcedure