Classificação de mensagens na tecnologia Microsoft MFC

 Sou Liyuan Breeze, veterano no setor de TI há 25 anos, hoje falarei sobre a classificação de mensagens na tecnologia MFC .

Embora existam muitas mensagens no Microsoft Windows, os tipos não são complicados. Geralmente existem três tipos: mensagens de janela, mensagens de comando e mensagens de notificação de controle.

mensagem da janela

As mensagens de janela são as mensagens mais comuns no sistema e referem-se às mensagens utilizadas pelo sistema operacional e para controlar outras janelas. Por exemplo, CreateWindow, DestroyWindow e MoveWindow. O código a seguir usa o programa de documento único MFC Message como exemplo.

Um exemplo de criação de uma barra de ferramentas e uma barra de status em uma classe de quadro: MainFrm.cpp é o seguinte:

int CMainFrame::OnCreate (LPCREATESTRUCT lpCreatestruct)
{
  if (CFrameWnd::OnCreate(lpCreateStruct)==-1)
      return -1;

   //创建工具栏
  if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))     
  {
  TRACE0("Failed to create toolbar\n");
  return -1;  //创建失败
    }
   
   //创建状态栏
  if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators (indicators,sizeof (indicators)/sizeof (UINT)))
   {
  TRACEO ("Failed to create status bar\n");
  return -1;    //创建失败
    }  
  return 0;
}
 

m_wndToolBar.CreateEx() na linha 5 é usado para criar uma janela da barra de ferramentas e m_wndStatusBar.Create() na linha 14 é usado para criar uma janela da barra de status.

mensagem de comando

Uma mensagem de comando é uma mensagem de janela especial, geralmente relacionada ao processamento de solicitações do usuário.Quando o usuário clica em um item de menu ou barra de ferramentas, uma mensagem de comando é gerada e enviada ao objeto de classe que pode tratar a solicitação. As mensagens de comando são diferentes das mensagens de janela (exceto WM_COMMAND, mensagens prefixadas com WM_), as mensagens de janela estão intimamente relacionadas a uma determinada janela e devem ser processadas pela janela que recebe a mensagem; enquanto as mensagens de comando não têm nada a ver com a janela específica , apenas para o propósito de um programa concluir uma operação funcional.

A seguir, adicione a mensagem de comando MouseMove() à classe de visualização como exemplo.

(1) Clique CMessageView na visualização da classe e você verá a mensagem adicionando tecla de função no canto superior direito da janela do projeto. Se você adicionar uma mensagem de comando a uma classe de visualização, deverá clicar na visualização e, se adicionar um quadro à classe de quadro, deverá clicar em CMainFrame. VS2005 e versões posteriores são diferentes do VC++6.0. Clique com o botão direito em VC++6.0 e a opção "Adicionar identificador de mensagem do Windows..." aparecerá.

(2) Clique no quinto botão da tecla de função de adição de mensagem e você verá várias mensagens de comando abaixo.

(3) Após clicar na opção "<Add>OnMouseMove" em diversas interfaces de mensagens de comando, o código será gerado automaticamente em MessageView.cpp, conforme mostrado no código a seguir. Até agora, a adição da mensagem de controle do botão foi concluída.

Exemplo de mensagem de comando em uma classe de visualização: MessageView.cpp
 

void CMessageView::OnMouseMove (UINT nFlags, CPoint point)
{
  //可以在这里添加你自己的代码

  CView::OnMouseMove(nFlags, point);
}
  

O código pode implementar mensagens de comando associadas ao movimento do cursor na janela de visualização. Você pode adicionar sua própria geração na linha 3 para realizar diferentes funções. Quando o cursor se move, uma mensagem de comando é enviada para a viewport. A mensagem de comando é expressa no mapa de mensagens da classe de visualização conforme segue na linha 6 do código:

BEGIN_MESSAGE_MAP(CMessageView, CView)
  // Standard printing commands
  ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
  ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
  ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFileprintpreview)
    ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

Mensagem de notificação de controle

A mensagem de notificação de controle é usada para notificar a janela pai quando algo acontece com o controle filho em uma janela. As mensagens de notificação são aplicáveis ​​apenas a controles de janela padrão (como botões, caixas de edição, botões de opção) e controles comuns do Windows (como visualização em árvore, visualização em lista, etc.).

Por exemplo, clicar ou clicar duas vezes em um controle, manipular a barra de rolagem de um controle ou selecionar texto em um controle geram mensagens de notificação. Quando o usuário interage com a janela de controle, as mensagens de notificação de controle são enviadas da janela de controle para sua janela principal. Mas esse tipo de mensagem não serve para processar comandos do usuário, mas para permitir que a janela principal altere o estado do controle em tempo real, como carregar recursos e exibir dados. Por exemplo, ao deslizar uma barra de rolagem, a mensagem que ela envia para a janela pai pode ser considerada uma mensagem de notificação de controle.

Mensagens de janela e mensagens de notificação de controle são tratadas principalmente pela classe de janela. Em comparação com essas duas mensagens, a gama de objetos de processamento da mensagem de comando é muito mais ampla e pode ser processada não apenas pela classe de janela, mas também pela classe de documento, classe de modelo de documento e classe de aplicativo.

Para mensagens de notificação de controle, este artigo lista apenas as mensagens de notificação comuns dos seguintes controles comuns:

controle de botão

BN_CLICKED: O usuário clicou no botão.
BN_DOUBLECLICKED: o usuário clicou no botão.
BN_KILLFOCUS: O botão perdeu o foco de entrada.
BN_SETFOCUS: O botão obtém o foco de entrada.
BCN_HOTITEMCHANGE: O item destacado foi alterado
NM_THEMECHANGED: O tema foi alterado.

controle de caixa de edição

PT_CHANGE: O texto na caixa de edição foi atualizado.
EN_ERRSPACE: A caixa de edição não tem memória suficiente.
PT_HSCROLL: O usuário clicou na barra de rolagem horizontal.
PT_KILLFOCUS: A caixa de edição está perdendo o foco de entrada.
EN_MAXITEXT: O conteúdo inserido está quebrado.
EN_SETFOCUS: A caixa de edição obtém o foco de entrada.
PT_UPDATE: O texto na caixa de edição está prestes a ser atualizado.
EN_VSCROLL: O usuário clicou no significado da mensagem da barra de rolagem vertical.
EN_ALIGN_LTR_EC: O usuário alterou a orientação da caixa de edição da esquerda para a direita.
EN_ALIGN_RTL_EC: O usuário alterou a orientação da caixa de edição da direita para a esquerda.

controle de caixa de combinação

CBN_SELCHANGE: Um item é selecionado na caixa de combinação.
CBN_EDITCHANGE: O usuário modificou o texto na caixa de edição.
CBN_CLOSEUP: A caixa de listagem da caixa de combinação é fechada.
CBN_DBLCLK: o usuário clicou duas vezes em uma sequência de caracteres.
CBN_DROPDOWN: A caixa de listagem da caixa de combinação é retirada.
CBN_EDITUPDATE: O texto na caixa de edição está prestes a ser atualizado.
CBN_ERRSPACE: Memória insuficiente para a caixa de combinação.
CBN_KILLFOCUS: A caixa de combinação empurra o foco de entrada.
CBN_SELENDCANCEL: A seleção do usuário deverá ser cancelada.
CBN_SELENDOK: A seleção do usuário é legal.
CBN_SETFOCUS: A caixa de combinação obtém o foco de entrada.

Primeiro crie um projeto MFC baseado em diálogo MFC_message e, em seguida, adicione um botão na caixa de diálogo chamado "OK". Para conseguir, clique neste botão para completar a função correspondente. Portanto, o tipo de mensagem de notificação de controle é BN_CLICKED. As etapas específicas de implementação são as seguintes:

(1) Clique com o botão direito no controle do botão "OK" na visualização de recursos e há um item no menu chamado Adicionar manipulador de eventos. Para adicionar um comando de mensagem ao botão, basta clicar duas vezes no botão. Mas este método tem uma desvantagem, ou seja, o nome da função de resposta da mensagem de controle só pode ser o padrão do sistema e não pode ser alterado à vontade.

(2) Após selecionar o comando "Adicionar manipulador de eventos.." no menu, uma nova tela aparece.

(3) Selecione a opção BN_CLICKED na caixa de listagem "Tipo de mensagem", e a opção "Lista de classes" é padronizada como CMFC_MessageDlg, que permanece inalterada aqui. Na caixa de listagem "Nome do manipulador de função", você pode nomear a função de resposta do evento de clique do botão, para que possa nomeá-la como quiser. Em seguida, clique no primeiro botão "Adicionar Edição" no canto inferior direito. Após a conclusão das 3 etapas acima, o sistema irá gerar automaticamente o seguinte código no arquivo:

O arquivo de cabeçalho MFC_MessageDlg.h

afx_msg void OnBnClickedOk();

 Fonte MFC_MessageDlg.cpp:

A expressão de mapeamento de mensagem de clique de controle de botão é a seguinte: 6 linhas de código:

BEGIN_MESSAGE_MAP (CMEC_MessageDlg, CDialog)
  ON_WM_SYSCOMMAND()
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  ON_BN_CLICKED(IDOK, &CMFC_MessageDlg::OnBnClickedOk)
END_MESSAGE_MAP()

O corpo específico da definição da função é o seguinte:

Exemplo de mensagem de comando em uma classe de exibição: MFC_MessageDlg.cpp

void CMFC_MessageDlg::OnBnClickedOk()
{
  //可以在此添加你自己的按钮控制消息

  OnOK();
}

Como pode ser visto na definição acima, ao clicar no botão “OK”, a caixa de diálogo será fechada. Se quiser alterar esta funcionalidade, você pode escrever um novo código a partir da linha 4.

Sobre o autor: Li Yuan Weifeng, nascido em 1981, engenheiro sênior, mestre em engenharia pela Universidade de Zhejiang, supervisor de projetos de engenharia de software, trabalhou como programador, designer de software, arquiteto de sistemas, antigo programador do Windows, usuário fiel do Visual Studio, C/ Usuário C++ O autor é um veterano que estudou, trabalhou duro e lutou na indústria de informática por 25 anos. Ele experimentou a era UNIX, a era WIN32 para desktop, a era dos aplicativos da Web, a era da computação em nuvem, o telefone móvel Android era, a era do big data, a era das TIC e a era do aprendizado profundo da IA, a era das máquinas inteligentes, não sei que era haverá no futuro, só lembro que essa jornada é cheia de dificuldades e ganhos, e estou disposto a continuar com você, cheio de esperança.

おすすめ

転載: blog.csdn.net/wang2015cn/article/details/131605536