Définir l'état du jour d'un contrôle month calendar
Un des attributs d'un contrôle calendrier mensuel est la possibilité de stocker des informations, connues sous le nom d'état jour du contrôle, pour chaque jour du mois. Ces informations sont utilisées pour mettre en évidence des dates du mois actuellement affiché.
Notes
L'objet CMonthCalCtrl doit avoir le style MCS_DAYSTATE pour afficher les informations d'état jour.
Les informations d'état jour sont exprimées en tant que type de données 32 bits, MONTHDAYSTATE. Chaque bit dans un champ MONTHDAYSTATE (1 à 31) représente l'état d'un jour du mois. Si un bit est activé, le jour correspondant s'affiche en gras ; sinon il s'affiche sans l'accentuation.
Il existe deux méthodes pour définir l'état jour du contrôle calendrier mensuel : explicitement par un appel à CMonthCalCtrl::SetDayState ou par la gestion du message de notification MCN_GETDAYSTATE.
Gérer le message de notification de MCN_GETDAYSTATE
Le message MCN_GETDAYSTATE est envoyé par le contrôle pour déterminer comment les jours dans les mois visibles doivent être affiché.
Notes
Le contrôle cache les mois précédents et suivants, et en ce qui concerne le mois visible, vous recevez cette notification chaque fois qu'un nouveau mois est choisi.
Pour traiter correctement ce message, vous devez déterminer les informations d'état jour pour le nombre de mois demandé, initialiser un tableau de structures MONTHDAYSTATE avec les valeurs appropriées, et initialiser le membre de structure associé avec les nouvelles informations. La procédure suivante, détaillant les étapes nécessaires, suppose que vous avez un objet CMonthCalCtrl appelé m_monthcal et un tableau d'objets MONTHDAYSTATE, mdState.
Gérer le message de notification de MCN_GETDAYSTATE
Dans la fenêtre Propriétés, ajoutez un gestionnaire de notification du message MCN_GETDAYSTATE à l'objet m_monthcal (voir Mapper des messages aux fonctions).
Dans le corps du gestionnaire, ajoutez le code suivant :
LPNMDAYSTATE pDayState = reinterpret_cast<LPNMDAYSTATE>(pNMHDR); int iMax = pDayState->cDayState; for(int i = 0; i < iMax; i++) { pDayState->prgDayState[i] = (MONTHDAYSTATE)0; // init to 0 pDayState->prgDayState[i] |= 0x01 << 14; // set 15th bit to 1 }
L'exemple suivant convertit le pointeur pNMHDR en type approprié, puis détermine le nombre de mois pour lequel les informations sont demandées (pDayState->cDayState). Pour chaque mois, le champ de bits actuel (pDayState->prgDayState[i]) est initialisé à zéro et les dates nécessaires sont assignées (dans ce cas, le 15 de chaque mois).