Esta anotação técnica fornece informações básicas sobre a novo WM_NOTIFY mensagem e descreve a maneira recomendada (e mais comum) de manipulação WM_NOTIFY mensagens seu aplicativo do MFC.
Mensagens de notificação no Windows 3. x
No Windows 3. x, controles notificar seus pais de eventos, como cliques de mouse, alterações no conteúdo e seleção e pintura de segundo plano do controle enviando uma mensagem para o pai. Notificações simples são enviadas como mensagens WM_COMMAND especiais, com o código de notificação (tais como BN_CLICKED) e controlam ID embalada em wParam e o identificador do Controlarar em lParam. Observe que como wParam e lParam são completos, não há nenhuma maneira para passar dados adicionais — essas mensagens podem ser apenas notificação simples. Por exemplo, na notificação BN_CLICKED , não há nenhuma maneira para enviar informações sobre a localização do cursor do mouse quando o botão foi clicado.
Quando precisam de controles do Windows 3. x enviar uma mensagem de notificação que inclui dados adicionais, eles usam uma variedade de mensagens especiais, incluindo WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEMe assim por diante. Essas mensagens podem ser refletidas volta para o controle que os enviaram. Para obter mais informações, consulte TN062: reflexo de mensagem para controles de Windows.
Mensagens de notificação no Win32
Para controles que existiram no Windows 3.1, a API do Win32 usa a maioria das mensagens de notificação que foram usadas no Windows 3. x. No entanto, esses controles Win32 também adiciona um número de controles sofisticados e complexos para aqueles com suporte no Windows 3. x. com freqüência, precisam enviar dados adicionais com suas mensagens de notificação. Em vez de adicionar um novo WM _ message para cada novo notificação de que precisa de dados adicionais , os designers da API do Win32 optar por adicionar apenas uma mensagem, WM_NOTIFY, que pode passar qualquer quantidade de dados adicionais de uma forma padronizada.
Mensagens de WM_NOTIFY contenham a identificação do Controlarar enviar a mensagem em wParam e um ponteiro para uma estrutura no lParam. Essa estrutura é uma estrutura de NMHDR ou alguns estrutura maior que tem uma estrutura de NMHDR como o primeiro membro. Observe que, uma vez que o membro NMHDR é primeiro, um ponteiro para essa estrutura pode ser usado como um ponteiro para uma NMHDR ou como um ponteiro para a estrutura maior dependendo de como você lançá-lo.
Na maioria dos casos, o ponteiro apontará para uma estrutura maior e você precisará lançá-lo quando você usá-lo. Em apenas algumas notificações, tais como as notificações comuns (cujos nomes começam com NM_) e o Controlarar de dica de ferramenta TTN_SHOW e notificações de TTN_POP , é uma estrutura de NMHDR realmente utilizada.
A estrutura de NMHDR ou membro inicial contém o identificador e a identificação do Controlarar enviar a mensagem e o código de notificação (tais como TTN_SHOW). O formato da estrutura NMHDR é mostrado abaixo:
typedef struct tag&NMHDR {
nbsp; HWND hwndFrom;
UINT idFrom;
Código UINT;
} NMHDR
Para uma mensagem TTN_SHOW , o membro de código seria definido como TTN_SHOW.
A maioria das notificações passar um ponteiro para uma estrutura maior que contém um NMHDR estrutura como seu primeiro membro. Por exemplo, considere a estrutura usada pelo LVN_KEYDOWN notificação de mensagem do Exibir de lista Controlarar, que é enviada quando uma tecla é pressionada em um Controlarar de Exibir de lista. O ponteiro aponta para uma estrutura LV_KEYDOWN , que é definida como mostrado abaixo:
typedef struct tagLV_KEYDOW&N {
nbsp; Hdr NMHDR;
PALAVRA wVKey;
UINT sinalizadores;
} LV_KEYDOWN
Observe que, uma vez que o membro de NMHDR é primeiro nessa estrutura, o ponteiro que você está passado na mensagem de notificação pode ser convertido em um ponteiro para uma NMHDR ou um ponteiro para uma LV_KEYDOWN.
Notificações comum a todos os novos controles do Windows
Algumas notificações são comuns a todos os novos controles de Windows. Essas notificações passam um ponteiro para uma estrutura de NMHDR.
| Código de notificação | Enviada porque |
| NM_CLICK | Usuário clicou a Esquerda botão do mouse no Controlarar |
| NM_DBLCLK | Usuário clicado Duplo Esquerda botão do mouse no Controlarar |
| NM_RCLICK | Usuário clicou o botão direito do mouse no Controlarar |
| NM_RDBLCLK | Usuário clicado duas vezes botão direito no controle |
| NM_RETURN | Usuário pressionou a tecla ENTER enquanto o Controlarar tem entrada foco |
| NM_SETFOCUS | Controle deu a foco de entrada |
| NM_KILLFOCUS | Controlarar perdeu o foco de entrada |
| NM_OUTOFMEMORY | Controlarar não foi possível concluir uma operação porque não havia memória suficiente disponível |
ON_NOTIFY: Manipulação WM_NOTIFY mensagens em aplicativos do MFC
A função CWnd::OnNotify manipula mensagens de notificação. Sua implementação padrão verifica o mapa da mensagem para manipuladores de notificação para chamar. Em geral, você não substituirão OnNotify. Em vez disso, você fornece uma função de manipulador e adicionar uma entrada de mapa de mensagem para esse manipulador ao mapa da mensagem da classe da janela de proprietário.
ClassWizard, através da folha de propriedades ClassWizard ou WizardBar, pode criar a entrada de mapa de Mensagemens ON_NOTIFY e fornecer-lhe com uma função de manipulador de esqueleto. Para obter mais informações sobre como usar ClassWizard para facilitar isso, consulte Mapeamento mensagens para funções no Guia do programador do Visual C++.
A macro de mapa de Mensagemens ON_NOTIFY tem a seguinte sintaxe:
ON_NOTIFY ( wNotifyCode, id, memberFxn void )
onde os parâmetros em itálico são substituídos por:
wNotifyCode
O código para a mensagem de notificação a ser tratado, como LVN_KEYDOWN.
identificação
O identificador de filho do Controlarar para o qual a notificação é enviada.
memberFxn
A função de membro para ser chamado quando esta notificação é enviada.
A função de membro deve ser declarada com o seguinte protótipo:
afx_msg privatevoid memberFxn( NMHDR * pNotifyStruct, LRESULT * resultado );
onde os parâmetros em itálico são:
pNotifyStruct
Um ponteiro para a estrutura de notificação, conforme descrito na seção acima.
resultado
Um ponteiro para o código resultante que você vai definir antes de retornar.
Exemplo
Para especificar que você deseja que a função de membro OnKeydownList1 para lidar com mensagens LVN_KEYDOWN a CListCtrl cuja ID é IDC_LIST1 , você usaria ClassWizard para adicionar o seguinte ao seu mapa da mensagem:
ON_NOTIFY (LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)
No exemplo acima, a função fornecida pelo ClassWizard é:
void CMessageReflectionDlg::OnKeydownList1 (&NMHDR * pNMHDR, LRESULT * pResult)
{
LV_KEYDOWN * pLVKeyDow = (LV_KEYDOWN *) pNMHDR;
/ / TODO: adicionar seu manipulador de notificação de Controlarar
/ / nbsp; código aqui
* pResult = 0;
}
Anotação que ClassWizard oferece um ponteiro do tipo apropriado automaticamente. Você pode acessar a estrutura de notificação através de um pNMHDR oupLVKeyDow.
Se você precisar Processoar a mensagem WM_NOTIFY mesma para um conjunto de controles, você pode usar ON_NOTIFY_RANGE em vez de ON_NOTIFY. Por exemplo, você pode ter um conjunto de botões para o qual você deseja executar a mesma ação para uma determinada mensagem de notificação.
Quando você usar ON_NOTIFY_RANGE, você especifica um intervalo contíguo de identificadores de filho para o qual manipular a mensagem de notificação, especificando o início e terminando identificadores de filho do intervalo.
ClassWizard não identificador ON_NOTIFY_RANGE; para usá-lo, você precisará editar seu mapa da mensagem você mesmo.
A entrada de mapa de Mensagemens e o protótipo de função para ON_NOTIFY_RANGE são os seguintes:
ON_NOTIFY_RANGE ( wNotifyCode, id, idLast, memberFxn void )
onde os parâmetros em itálico são substituídos por:
wNotifyCode
O código para a mensagem de notificação a ser tratado, como LVN_KEYDOWN.
identificação
O primeiro identificador no intervalo contíguo de identificadores de.
idLast
O último identificador no intervalo contíguo de identificadores de.
memberFxn
A função de membro para ser chamado quando esta notificação é enviada.
A função de membro deve ser declarada com o seguinte protótipo:
afx_msgprivatevoidmemberFxn(UINT idNMHDR*pNotifyStruct,LRESULT*resultado);
onde os parâmetros em itálico são:
identificação
O identificador de filho do Controlarar que enviou a notificação.
pNotifyStruct
Um ponteiro para a estrutura de notificação, conforme descrito acima.
resultado
Um ponteiro para o código resultante que você vai definir antes de retornar.
ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE
Se você quiser mais de um objeto na notificação roteamento para manipular uma mensagem, você pode usar ON_NOTIFY_EX (ou ON_NOTIFY_EX_RANGE) em vez de ON_NOTIFY (ou ON_NOTIFY_RANGE). A única diferença entre a versão EX e o normal é que a função de membro chamada para a versão EX retorna um BOOL que indica se ou não mensagens processamento deve continuar. Retornando FALSE esta função permite que você Processoar a mesma mensagem em mais de um objeto.
ClassWizard não trata ON_NOTIFY_EX ou ON_NOTIFY_EX_RANGE; Se você quiser usar qualquer um deles, você precisará editar seu mapa da mensagem você mesmo.
A entrada de mapa de Mensagemens e o protótipo de função para ON_NOTIFY_EX e ON_NOTIFY_EX_RANGE são da seguinte maneira. O significado dos parâmetros é os mesmos que para os não-EX versões.
ON_NOTIFY_EX ( nCode, id, memberFxn void )
ON_NOTIFY_EX_RANGE ( wNotifyCode, id, idLast,memberFxn void )
O protótipo para ambos o que precede é o mesmo:
afx_msgBOOLmemberFxn(UINT idNMHDR*pNotifyStruct,LRESULT*resultado);
Em ambos os casos, id contém o identificador de filho do Controlarar que enviou a notificação.
Sua função deve retornar TRUE se a mensagem de notificação tem sido tratada completamente ou FALSE se outros objetos no roteamento de comando deve ter a oportunidade de manipular a mensagem.
Técnico anotações por número |nbsp; &Notas técnicas por categoria