Bonjour à tous.
Après de nombreuses recherches sur le réseau Codes-Sources, la msdn, google, etc... je viens vous exposer directement mon problème ici.
J'ai créé un contrôle calendrier (MONTHCAL_CLASS) et, mon but étant de pouvoir ajouter des événements, je lui ai rajouté le style MCS_DAYSTATE afin de pouvoir mettre certaines dates en gras.
Le soucis est qu'à l'ouverture de ma fenêtre, certaines dates se mettent en gras toutes seules. Or, d'une part je voudrais qu'aucune ne soit mise en gras, pour ensuite en mettre certaines dès l'ouverture de la fenêtre.
D'après la msdn, le seul moyen de mettre des dates en gras est d'intercepter le message WM_NOTIFY de la fonction callback, (avec le code MCN_GETDAYSTATE).
J'ai donc récupéré un code (toujours sur la msdn) qui permette de mettre en gras des dates (visible
ici ).
Il fonctionne bien, mais pas à l'initialisation du contrôle (il faut cchanger de mois au moins 1fois pour que ça fonctionne).
J'ai donc tenté de forcer l'envoi d'un message WM_NOTIFY juste après la création de mon contrôle... ça compile, mais le résultat n'y est pas.
Voici une de mes nombreuses tentatives pour enlever toute date en gras à l'initialisation :
// Dans mon WinMain();
mois1= CreateWindowEx(0 , MONTHCAL_CLASS
,NULL
,WS_CHILD|WS_VISIBLE|MCS_DAYSTATE
,0
,0
,0
,0
,hwnd
,(HMENU)NULL
,hinst
,NULL)
;
MONTHDAYSTATE rgMonths[12] ={0}
;
NMDAYSTATE state
;
state
.nmhdr
.code= MCN_GETDAYSTATE ;
state
.nmhdr
.hwndFrom =mois1
;// HWND de mon contrôle
state
.stStart
.wDay= 1 ; // Jour de départ (d'après la doc msdn)
state
.stStart
.wMonth =1
;// Mois de départ (d'après la doc msdn)
state
.stStart
.wYear= 1601 ; // Année de départ (d'après la doc msdn)
state
.cDayState =12
;// Nombre d'éléments dans le tableau affecté à 'prgDayState'
for(
int i= 0 ; i < state
.cDayState
;i++) { BOLDDAY(rgMonths[i]
,0)
; }// Initialise les dates à 0 (sans gras), j'ai aussi tenté sans cette boucle, ça ne change rien
state
.prgDayState =rgMonths
;// Structure 'MONTHDAYSTATE' contenant les états des dates
SendMessage(hwnd
,WM_NOTIFY
,0
,(LPARAM)&state)
;
Ensuite j'intercepte le message WM_NOTIFY et, pour tester, je mets le 15ème jour de chaque mois en gras.
//Dans ma MainWndProc();
[...]
case WM_NOTIFY
:
if((((LPNMHDR)lParam)->hwndFrom)= = mois1) {
if ((((LPNMHDR)lParam)->code) == MCN_GETDAYSTATE) {
MONTHDAYSTATE rgMonths[12]={0} ;
int cMonths =((NMDAYSTATE*)lParam)->cDayState
;
for(
int i= 0 ; i < cMonths
;i++) {
BOLDDAY(rgMonths[i]
,15)
;
}
((NMDAYSTATE*)lParam)->prgDayState =rgMonths
;
}
}
[...]
En bref, si quelqu'un pourrait m'expliquer comment le code MCN_GETDAYSTATE fonctionne exactement car j'avoue ne pas avoir compris du tout.
Par la même occasion, si on pouvait m'expliquer comment initialiser mon contrôle en virant toutes dates en gras, ça ne serait pas de refus ^^.
(ce dont je suis sûr, c'est que mon SendMessage(mois1
,WM_NOTIFY
,0
,(LPARAM)&state)
; appelle bien le message).
Merci d'avance.
Cordialement, uaip.