Definindo o estado do dia de um controle de calendário mensal
Um dos atributos de um controle de calendário de mês é a capacidade de armazenar informações, conhecidas como o estado do dia do controle, para cada dia do mês. Essas informações são usadas para enfatizar determinadas datas do mês exibido no momento.
Observação
O objeto CMonthCalCtrl
deve ter o estilo MCS_DAYSTATE para exibir informações de estado do dia.
As informações de estado do dia são expressas como um tipo de dados de 32 bits, MONTHDAYSTATE. Cada bit em um campo de bit MONTHDAYSTATE (1 a 31) representa o estado de um dia em um mês. Se um bit estiver ativado, o dia correspondente será exibido em negrito; caso contrário, ele será exibido sem ênfase.
Há dois métodos para definir o estado do dia do controle de calendário do mês: explicitamente com uma chamada para CMonthCalCtrl::SetDayState, ou manipulando a mensagem de notificação MCN_GETDAYSTATE.
Manipulando a mensagem de notificação de MCN_GETDAYSTATE
A mensagem MCN_GETDAYSTATE é enviada pelo controle para determinar como os dias dentro dos meses visíveis devem ser exibidos.
Observação
Como o controle armazena em cache os meses anteriores e seguintes, em relação ao mês visível, você receberá essa notificação sempre que um novo mês for escolhido.
Para lidar corretamente com essa mensagem, você deve determinar para quantos meses as informações de estado de dia estão sendo solicitadas, inicializar uma matriz de estruturas MONTHDAYSTATE com os valores adequados e inicializar o membro da estrutura relacionada com as novas informações. O procedimento a seguir, detalhando as etapas necessárias, pressupõe que você tenha um objeto CMonthCalCtrl
chamado m_monthcal e uma matriz de objetos MONTHDAYSTATE, mdState.
Para manipular a mensagem de notificação de MCN_GETDAYSTATE
Usando o Assistente de Classe, adicione um manipulador de notificação para a mensagem MCN_GETDAYSTATE ao objeto m_monthcal (consulte Mensagens de Mapeamento para Funções).
No corpo do manipulador, adicione o seguinte código:
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 }
O exemplo converte o ponteiro pNMHDR para o tipo adequado e determina quantos meses de informações estão sendo solicitados (
pDayState->cDayState
). Para cada mês, o campo de bits atual (pDayState->prgDayState[i]
) é inicializado como zero e, em seguida, as datas necessárias são definidas (nesse caso, o 15º de cada mês).