ID do artigo: 194294 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 2.2

Como adicionar barras de ferramentas e dicas de ferramenta para controles ActiveX

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sumário

Um controle ActiveX pode ter uma barra de ferramentas (uma classe CToolBar) como sua janela filho. Este artigo mostra uma maneira de criar uma barra de ferramentas e também como implementar dicas de ferramentas para botões na janela barra de ferramentas.

Mais Informações

O Visual C++ fornece dois métodos para criar uma barra de ferramentas. O artigo descreve como criar um recurso de barra de ferramentas usando o Editor de recursos. Se você já tiver um recurso de bitmap, consulte a documentação on-line "Convertendo Bitmaps barras de para ferramentas" para converter o recurso de bitmap em um recurso de barra de ferramentas.

As etapas são mostradas abaixo:

  1. Use o Assistente para controle de ActiveX MFC para gerar um controle MFC ActiveX.
  2. Crie um recurso de barra de ferramentas no projeto do controle.
  3. Adicione um recurso de seqüência de caracteres de dica de ferramenta para cada botão na barra de ferramentas. Esses recursos de seqüência de caracteres de dica de ferramenta serão carregados no manipulador de código de notificação de TTN_NEEDTEXT.
  4. Adicione uma função de retorno de chamada de gancho WH_GETMESSAGE à classe derivada do controle-ActiveX. O procedimento de gancho é responsável por chamar PreTranslateMessage() do aplicativo e isso resulta na chamada para FilterToolTipMessage(), que ativa dicas de ferramentas. Um procedimento de gancho é necessária porque o controle ActiveX é exatamente como um servidor inproc [ASCII 151] bomba nenhuma mensagem for encontrada:
          HHOOK hHook = NULL;
    
          // Hook procedure for WH_GETMESSAGE hook type.
          LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM
             lParam)
          {
            // Switch the module state for the correct handle to be used.
            AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
    
            // If this is a keystrokes message, translate it in controls'
            // PreTranslateMessage().
            LPMSG lpMsg = (LPMSG) lParam;
    
            if( (nCode >= 0) &&
              PM_REMOVE == wParam &&
              AfxGetApp()->PreTranslateMessage(lpMsg))
            {
               lpMsg->message = WM_NULL;
               lpMsg->lParam = 0L;
               lpMsg->wParam = 0;
            }
    
    
           // Passes the hook information to the next hook procedure in
           // the current hook chain.
           return ::CallNextHookEx(hHook, nCode, wParam, lParam);
          }
    					
  5. Crie a janela de barra de ferramentas (uma classe CToolBar), que é uma janela filho do controle ActiveX. Isso é feito em resposta à mensagem WM_CREATE. Além disso, manipulador de mensagens WM_CREATE também é um bom local para instalar o procedimento de gancho WH_GETMESSAGE.
          int CCToolBarCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
          {
             if (COleControl::OnCreate(lpCreateStruct) == -1)
                return -1;
    
             // Create a CToolBar window which is a child of ActiveX control.
             if (!m_ToolBar.Create(this,
                   WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS) ||
                  !m_ToolBar.LoadToolBar(IDR_TOOLBAR))
                {
                   TRACE0("Failed to create toolbar\n");
                   return -1;      // fail to create
                }
    
             // Toolbar has to have TBSTYLE_TOOLTIPS style. Otherwise,
             // notification handler for TTN_NEXTTEXT won't be called.
             m_ToolBar.ModifyStyle (0, TBSTYLE_TOOLTIPS);
    
             // Move the toolbar so it is VISIBLE on the screen.
             CRect rc;
             GetClientRect(&rc);
             rc.bottom = rc.top + 34;
             m_ToolBar.MoveWindow(&rc);
    
             // Because ActiveX control is an inproc server, it does not have a
             // message pump. So, messages to child windows created by the
             // ActiveX control are not going to be received by the control.
             // Thus, we set up a message hook to call PreTranslateMessage().
             // This results in the call to FilterToolTipMessage(), which
             // activates tooltips.
             hHook = ::SetWindowsHookEx(
                WH_GETMESSAGE,
                GetMessageProc,
                AfxGetInstanceHandle(),
                GetCurrentThreadId());
             ASSERT (hHook);
    
             return 0;
          }
    					
  6. Desinstalar a função de gancho de mensagem em resposta à mensagem WM_DESTROY:
          void CCToolBarCtrl::OnDestroy()
          {
             // Remove the message hook function.
             VERIFY (::UnhookWindowsHookEx (hHook));
    
             COleControl::OnDestroy();
          }
    					
  7. Adicione um TTN_NEEDTEXTW (para código de notificação de Unicode) ou o manipulador de notificação TTN_NEEDTEXTA (para código de notificação de ANSI) à classe derivada de controle ActiveX. Carregar a seqüência de caracteres dica de ferramenta a ser exibido nesse manipulador de código de notificação:
          BEGIN_MESSAGE_MAP(CCToolBarCtrl, COleControl)
             //{{AFX_MSG_MAP(CCToolBarCtrl)
             ON_WM_CREATE()
             ON_COMMAND(ID_BUTTON1, OnButton1) // first button on toolbar
             ON_COMMAND(ID_BUTTON2, OnButton2) // second button on toolbar
             ON_COMMAND(ID_BUTTON3, OnButton3) // third button on toolbar
             ON_WM_DESTROY()
             //}}AFX_MSG_MAP
             ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
    
             // ANSI notification code (for Windows 95)
             ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
    
             // Unicode notification code (for NT)
             ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
          END_MESSAGE_MAP()
    
          // Notification handler for tooltips - determine which tooltip
          // string resource to be displayed.
          BOOL CCToolBarCtrl::OnToolTipNotify(
             UINT id, NMHDR * pNMHDR, LRESULT * pResult)
          {
             TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*) pNMHDR;
             TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*) pNMHDR;
    
             int strid = 0;
             switch (pNMHDR->idFrom)
             {
             case ID_BUTTON1:
                strid = IDS_BUTTON1;
                break;
    
             case ID_BUTTON2:
                strid = IDS_BUTTON2;
                break;
    
             case ID_BUTTON3:
                strid = IDS_BUTTON3;
                break;
             }
    
      if (strid)
           {
              *pResult = 0;
      
              CString str;
              str.LoadString(strid);
      
              #define _countof(array) (sizeof(array)/sizeof(array[0]))
      
              #ifndef _UNICODE
              if (pNMHDR->code == TTN_NEEDTEXTA)
              lstrcpyn(pTTTA->szText, str, _countof(pTTTA->szText));
              else
              _mbstowcsz(pTTTW->szText, str, _countof(pTTTW->szText));
              #else
              if (pNMHDR->code == TTN_NEEDTEXTA)
              _wcstombsz(pTTTA->szText, str, _countof(pTTTA->szText));
              else
              lstrcpyn(pTTTW->szText, str, _countof(pTTTW->szText));
              #endif
      
               return TRUE;
            }
    
             return FALSE;
          }
     
    					
(c) Microsoft Corporation 1998, todos os direitos reservados. Contribuições de Yeong Kah TAM, Microsoft Corporation.

A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
Palavras-chave: 
kbmt kbhowto kbmfcctrlbar kbtoolbar KB194294 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 194294  (http://support.microsoft.com/kb/194294/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.