Artigo: 194294 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 2.2

Como adicionar barras de ferramentas e as descrições para controlos 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 | Reduzir tudo

Sumário

Um controlo ActiveX pode ter uma barra de ferramentas (uma classe CToolBar) como a janela subordinada. Este artigo mostra como criar este tipo uma barra de ferramentas e também como implementar sugestões para botões na barra de ferramentas janela.

Mais Informação

Visual C++ fornece dois métodos para criar uma barra de ferramentas. O artigo desribes como criar um recurso de barra de ferramentas utilizando o Editor de recursos. Se já tiver um recurso de mapa de bits, consulte a documentação online "Converter os ficheiros de mapas de bits para Toolbars" para converter o recurso de mapa de bits para um recurso de barra de ferramentas.

Os passos são mostrados abaixo:

  1. Utilize o Assistente de controlo ActiveX MFC para gerar um controlo ActiveX MFC.
  2. Crie um recurso barra de ferramentas num projecto do controlo.
  3. Adiciona um recurso de cadeia de descrição para cada botão na barra de ferramentas. Estes recursos de cadeia de descrição serão carregados no processador de código de notificação de TTN_NEEDTEXT.
  4. Adicione uma função de chamada de retorno de rotina WH_GETMESSAGE à classe derivada de controlo-ActiveX. O procedimento da rotina é responsável de chamar PreTranslateMessage() a aplicação e isto resulta numa chamada para FilterToolTipMessage() activa descrições. Um procedimento de rotina é necessário porque o controlo ActiveX é tal como um servidor inproc [ASCII 151] não Bomba mensagem encontra-se:
          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 barra de ferramentas (uma classe CToolBar), que é uma janela subordinada do controlo ActiveX. Isto é feito na resposta à mensagem WM_CREATE. Além disso, processador de mensagens WM_CREATE também é um bom local para instalar o procedimento da rotina 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 hook mensagem na resposta à mensagem WM_DESTROY:
          void CCToolBarCtrl::OnDestroy()
          {
             // Remove the message hook function.
             VERIFY (::UnhookWindowsHookEx (hHook));
    
             COleControl::OnDestroy();
          }
    					
  7. Adicione um TTN_NEEDTEXTW (para o código de notificação de Unicode) ou processador de notificação TTN_NEEDTEXTA (para o código de notificação de ANSI) para a classe derivada de controlo de ActiveX. Carregar a cadeia de descrição ser apresentada neste processador 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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 ArticleExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.