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.
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.
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:
Utilize o Assistente de controlo ActiveX MFC para gerar um controlo ActiveX MFC.
Crie um recurso barra de ferramentas num projecto do controlo.
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.
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);
}
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;
}
Desinstalar a função de hook mensagem na resposta à mensagem WM_DESTROY:
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
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/
)
Exclusã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.
Qual foi o esforço que despendeu pessoalmente para utilizar este artigo?
Muito baixo
Baixo
Moderado
Elevado
Muito elevado
Diga-nos porquê e o que podemos fazer para melhorar estas informações
Obrigado! Os seus comentários são utilizados para ajudar-nos a melhorar o conteúdo do nosso suporte. Para obter mais opções de assistência, visite a Home Page de Ajuda e Suporte.