TN024: mensagens e recursos definidos pelo MFC

Observação

A nota técnica a seguir não foi atualizada desde que foi incluída pela primeira vez na documentação online. Como resultado, alguns procedimentos e tópicos podem estar desatualizados ou incorretos. Para obter as informações mais recentes, é recomendável que você pesquise o tópico de interesse no índice de documentação online.

Esta nota descreve as mensagens internas do Windows e os formatos de recurso usados pelo MFC. Essas informações explicam a implementação da estrutura e ajudarão a depurar o aplicativo. Para os aventureiros, embora todas essas informações não tenha suporte oficial, você pode usar algumas dessas informações para implementações avançadas.

Essa observação contém detalhes da implementação privada do MFC. Todo o conteúdo está sujeito a alterações no futuro. As mensagens privadas do Windows no MFC têm significado apenas no escopo de um aplicativo, mas serão alteradas no futuro para conter mensagens em todo o sistema.

O intervalo de mensagens privadas do Windows e os tipos de recursos do MFC estão no intervalo de "sistema" reservado pelo Microsoft Windows. No momento, nem todos os números nos intervalos são usados e, no futuro, novos números no intervalo podem ser usados. Os números usados atualmente podem ser alterados.

As mensagens privadas do Windows no MFC estão no intervalo 0x360-0x37F>.

Os tipos de recursos privados do MFC estão no intervalo 0xF0-0xFF>.

Mensagens privadas do Windows no MFC

Essas mensagens do Windows são usadas no lugar das funções virtuais C++, em que o acoplamento relativamente solto é necessário entre objetos de janela e onde uma função virtual C++ não seria apropriada.

Essas mensagens privadas do Windows e estruturas de parâmetro associadas são declaradas no cabeçalho privado do MFC 'AFXPRIV. H'. Lembre-se de que qualquer um dos códigos que inclua esse cabeçalho pode estar dependendo de um comportamento não documentado e provavelmente será interrompido nas versões futuras do MFC.

No caso raro de necessidade de lidar com uma dessas mensagens, você deve usar a macro de mapa de mensagens ON_MESSAGE e tratar a mensagem no formato genérico LRESULT/WPARAM/LPARAM.

WM_QUERYAFXWNDPROC

Esta mensagem é enviada para uma janela que está sendo criada. Ela é enviada muito antecipadamente no processo de criação como método para determinar se o WndProc é AfxWndProc. AfxWndProc retorna 1.

Parâmetros e valores retornados Descrição
wParam Não usado
lParam Não usado
returns 1, se processado por AfxWndProc

WM_SIZEPARENT

Esta mensagem é enviada por uma janela com moldura para os filhos imediatos durante o redimensionamento (CFrameWnd::OnSize chama CFrameWnd::RecalcLayout que chama CWnd::RepositionBars), para reposicionar as barras de controle ao redor da lateral do quadro. A estrutura AFX_SIZEPARENTPARAMS contém o retângulo do cliente disponível atual do pai e um HDWP (que pode ser NULL) com o qual DeferWindowPos de ser chamado para minimizar novas pinturas.

Parâmetros e valores retornados Descrição
wParam Não usado
lParam Endereço de uma estrutura AFX_SIZEPARENTPARAMS
returns Não usado (0)

Ignorar a mensagem indica que a janela não faz parte do layout.

WM_SETMESSAGESTRING

Esta mensagem é enviada para uma janela com moldura, para solicitar que atualize a linha de mensagem na barra de status. Uma ID de cadeia de caracteres ou um LPCSTR pode ser especificado (mas não ambos).

Parâmetros e valores retornados Descrição
wParam ID da cadeia de caracteres (ou zero)
lParam LPCSTR para a cadeia de caracteres (ou NULL)
returns Não usado (0)

WM_IDLEUPDATECMDUI

Esta mensagem é enviada em tempo ocioso para implementar a atualização de tempo ocioso dos manipuladores de interface do usuário de comando de atualização. Se a janela (geralmente uma barra de controle) tratar a mensagem, criará um objeto CCmdUI (ou um objeto de uma classe derivada) e chamará CCmdUI::DoUpdate para cada um dos "itens" na janela. Isso, por sua vez, verificará se há um manipulador ON_UPDATE_COMMAND_UI para os objetos na cadeia de manipuladores de comandos.

Parâmetros e valores retornados Descrição
wParam BOOL bDisableIfNoHandler
lParam Não usado (0)
returns Não usado (0)

bDisableIfNoHandler é um valor diferente de zero para desabilitar o objeto de interface do usuário, se não houver um manipulador ON_UPDATE_COMMAND_UI nem um ON_COMMAND.

WM_EXITHELPMODE

Esta mensagem é postada em um CFrameWnd para sair do modo de ajuda confidencial do contexto. O recebimento dessa mensagem termina o loop modal iniciado por CFrameWnd::OnContextHelp.

Parâmetro e valor de retorno Descrição
wParam Não usado (0)
lParam Não usado (0)
returns Não usado

WM_INITIALUPDATE

Esta mensagem é enviada pelo modelo de documento para todos os descendentes de uma janela com moldura, quando é seguro realizar a atualização inicial. Ela é mapeada para uma chamada para CView::OnInitialUpdate, mas pode ser usada em outras classes derivadas de CWnd para outra atualização única.

Parâmetros e valores retornados Descrição
wParam Não usado (0)
lParam Não usado (0)
returns Não usado (0)

WM_RECALCPARENT

Esta mensagem é enviada por um modo de exibição para a janela pai (obtida por meio de GetParent), para forçar o novo cálculo de layout (geralmente, o pai chamará RecalcLayout). Ela é usada em aplicativos de servidor OLE em que é necessário aumentar o tamanho do quadro, à medida que o tamanho total do modo de exibição aumenta.

Se a janela pai processar essa mensagem, ela deverá retornar TRUE e preencher o RECT passado em lParam com o novo tamanho da área do cliente. Isso é usado em CScrollView para tratar corretamente as barras de rolagem (coloque-as na parte externa da janela, quando forem adicionadas), quando um objeto de servidor é ativado no local.

Parâmetros e valores retornados Descrição
wParam Não usado (0)
lParam LPRECT rectClient, pode ser NULL
returns TRUE, se o novo retângulo do cliente for retornado. Caso contrário, FALSE

WM_SIZECHILD

Esta mensagem é enviada por COleResizeBar para a janela do proprietário (por meio do GetOwner), quando o usuário redimensiona a barra de redimensionamento com os identificadores de redimensionamento. COleIPFrameWnd responde a essa mensagem tentando reposicionar a janela com moldura como o usuário solicitou.

O novo retângulo, fornecido nas coordenadas do cliente em relação à janela com moldura que contém a barra de redimensionamento, é apontado por lParam.

Parâmetros e valores retornados Descrição
wParam Não usado (0)
lParam LPRECT rectNew
returns Não usado (0)

WM_DISABLEMODAL

Esta mensagem é enviada para todas as janelas pop-up pertencentes a uma janela com moldura que está sendo desativada. A janela com moldura usa o resultado para determinar se a janela pop-up deve ser desabilitada.

Você pode usar isso para executar o processamento especial na janela pop-up, quando o quadro entrar em um estado modal ou para impedir que determinadas janelas pop-up sejam desabilitadas. As dicas de ferramenta usam essa mensagem para se destruir, quando a janela com moldura entra em um estado modal, por exemplo.

Parâmetros e valores retornados Descrição
wParam Não usado (0)
lParam Não usado (0)
returns Um valor diferente de zero para NÃO desabilitar a janela. 0 indica que a janela será desabilitada

WM_FLOATSTATUS

Esta mensagem é enviada para todas as janelas pop-up pertencentes a uma janela com moldura, quando o quadro é ativado ou desativado por outra janela com moldura de nível superior. Ela é usada pela implementação do MFS_SYNCACTIVE no CMiniFrameWnd, para manter a ativação dessas janelas pop-up em sincronia com a ativação da janela com moldura de nível superior.

Parâmetros Descrição
wParam É um dos seguintes valores:

FS_SHOW

FS_HIDE

FS_ACTIVATE

FS_DEACTIVATE

FS_ENABLEFS_DISABLE

FS_SYNCACTIVE
lParam Não usado (0)

O valor retornado deverá ser diferente de zero, se FS_SYNCACTIVE estiver definido e a janela sincronizar a ativação com o quadro pai. CMiniFrameWnd retorna um valor diferente de zero, quando o estilo é definido como MFS_SYNCACTIVE.

Para obter mais informações, confira a implementação do CMiniFrameWnd.

WM_ACTIVATETOPLEVEL

Esta mensagem é enviada para uma janela de nível superior, quando uma janela no "grupo de nível superior" é ativada ou desativada. Uma janela faz parte de um grupo de nível superior, se for uma janela de nível superior (sem pai nem proprietário) ou pertencer a essa janela. O uso dessa mensagem é semelhante a WM_ACTIVATEAPP, mas ela funciona em situações em que janelas pertencentes a processos diferentes são misturadas em uma única hierarquia de janela (comum em aplicativos OLE).

WM_COMMANDHELP, WM_HELPHITTEST, WM_EXITHELPMODE

Estas mensagens são usadas na implementação da Ajuda sensível ao contexto. Veja a Observação Técnica 28, para obter mais informações.

Formatos de Recursos Privados do MFC

No momento, o MFC define dois formatos de recursos privados: RT_TOOLBAR e RT_DLGINIT.

Formato de Recurso RT_TOOLBAR

A barra de ferramentas padrão fornecida pelo AppWizard baseia-se em um recurso personalizado RT_TOOLBAR, que foi introduzido no MFC 4.0. Você pode editar esse recurso usando o editor de barra de ferramentas.

Formato de Recurso RT_DLGINIT

Um formato de recurso privado do MFC é usado para armazenar informações adicionais de inicialização da caixa de diálogo. Isso inclui as cadeias de caracteres iniciais armazenadas em uma caixa de combinação. O formato desse recurso não foi criado para ser editado manualmente, mas é tratado pelo Visual C++.

O Visual C++ e esse recurso RT_DLGINIT não são necessários para usar os recursos relacionados do MFC, pois há uma alternativa de API para usar as informações no recurso. O uso do Visual C++ facilita muito a gravação, manutenção e tradução do aplicativo no longo prazo.

A estrutura básica de um recurso RT_DLGINIT é a seguinte:

+---------------+    \
| Control ID    |   UINT             |
+---------------+    |
| Message #     |   UINT             |
+---------------+    |
|length of data |   DWORD            |
+---------------+    |   Repeated
|   Data        |   Variable Length  |   for each control
|   ...         |   and Format       |   and message
+---------------+    /
|     0         |   BYTE
+---------------+

Uma seção repetida contém a ID de controle para enviar a mensagem, o nº da Mensagem a ser enviada (uma mensagem normal do Windows) e um tamanho variável dos dados. A mensagem do Windows é enviada em um formulário:

SendDlgItemMessage(<Control ID>, <Message #>, 0, &<Data>);

Este é um formato muito geral, que permite qualquer conteúdo de dados e mensagens do Windows. O editor de recursos do Visual C++ e o MFC dão suporte apenas a um subconjunto limitado de mensagens do Windows: CB_ADDSTRING para as opções de lista iniciais para caixas de combinação (os dados são uma cadeia de caracteres de texto).

Confira também

Observações técnicas por número
Observações técnicas por categoria