c++ - ventajas - ¿Cómo se muestran las sugerencias de herramientas personalizadas en un CTreeCtrl?
nubes de palabras tagxedo (5)
Creo que todavía tiene que habilitar la información sobre herramientas, aunque esté reemplazando la información incorporada.
EnableToolTips(TRUE);
Bueno, como eso no funcionó para usted y dado que ningún otro experto le ha ofrecido ayuda, aquí algunas otras sugerencias mías. Aunque son cojos, pueden hacer que te muevas de nuevo:
- Asegúrese de que su rotación OnCreate () realmente se está ejecutando.
- Active la información sobre herramientas ANTES de reemplazarla.
El código que uso para hacer esto se ve así. (Confieso que no entiendo todos los detalles, lo copié de un código de muestra, funcionó y nunca volví a verlo).
// Habilitar la información sobre herramientas estándar
EnableToolTips (TRUE);
// Deshabilitar la información sobre herramientas incorporada
CToolTipCtrl * pToolTipCtrl = (CToolTipCtrl *) CWnd :: FromHandle ((HWND) :: SendMessage (m_hWnd, LVM_GETTOOLTIPS, 0, 0L));
Tengo una clase derivada de CTreeCtrl
. En OnCreate()
reemplazo el objeto predeterminado CToolTipCtrl
por uno personalizado:
int CMyTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
// Replace tool tip with our own which will
// ask us for the text to display with a TTN_NEEDTEXT message
CTooltipManager::CreateToolTip(m_pToolTip, this, AFX_TOOLTIP_TYPE_DEFAULT);
m_pToolTip->AddTool(this, LPSTR_TEXTCALLBACK);
SetToolTips(m_pToolTip);
// Update: Added these two lines, which don''t help either
m_pToolTip->Activate(TRUE);
EnableToolTips(TRUE);
return 0;
}
Mi controlador de mensajes se ve así:
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CMyTreeCtrl::OnTtnNeedText)
Sin embargo, nunca recibo un mensaje TTN_NEEDTEXT
. Eché un vistazo con Spy ++ y también parece que este mensaje nunca se envía.
Cual podría ser el problema aquí?
Actualizar
No estoy seguro de si esto es relevante: la ventana principal de CDockablePane
es del tipo CDockablePane
. ¿Podría haber algún trabajo adicional para que esto funcione?
Trate de manejar específicamente todas las identificaciones de información sobre herramientas:
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, &CMyTreeCtrl::OnNeedTipText)
Si eso no funciona, es posible que deba llamar manualmente a RelayEvent () desde PreTranslateMessage ().
No lo he intentado en una CTreeCtrl, pero creo que debes llamar a RelayEvent para que la información sobre herramientas ctrl sepa cuándo se debe mostrar la información sobre herramientas. Prueba esto:
MyTreeCtrl.h:
virtual BOOL PreTranslateMessage(MSG* pMsg);
MyTreeCtrl.cpp:
BOOL CMyTreeCtrl::PreTranslateMessage(MSG* pMsg)
{
m_pToolTip.Activate(TRUE);
m_pToolTip.RelayEvent(pMsg);
return CTreeCtrl::PreTranslateMessage(pMsg);
}
Espero esta ayuda.
¿No tiene que anular OnToolHitTest ()?
(viejo) Recurso 1
(antiguo) Recurso 2:
Además de devolver el código de hit (nHit), también debe completar la estructura TOOLINFO. Así es como VIRGIL lo hace en CMainFrame :: OnToolHitTest:
int nHit = MAKELONG(pt.x, pt.y);
pTI->hwnd = m _ hWnd;
pTI->uId = nHit;
pTI->rect = CRect(CPoint(pt.x-1,pt.y-1),CSize(2,2));
pTI->uFlags |= TTF _ NOTBUTTON;
pTI->lpszText = LPSTR _ TEXTCALLBACK;
La mayoría de esto es obvio, como establecer hwnd y uId, pero parte de él es menor. Establecí el miembro rect en un rectángulo de 2 píxeles de ancho y 2 píxeles de altura centrado en la ubicación del mouse. El control de información sobre herramientas utiliza este rectángulo como el rectángulo delimitador de la "herramienta", que quiero que sea pequeño, por lo que mover el mouse a cualquier lugar constituirá moverse fuera de la herramienta. Configuro TTF _ NOTBUTTON en uFlags porque la información sobre herramientas no está asociada con un botón. Esta es una bandera especial de MFC definida en afxwin.h; MFC lo usa para ayudar con la información sobre herramientas. Hay otro indicador ampliado de MFC para información sobre herramientas, TTF _ ALWAYSTIP. Puede usarlo si desea que MFC muestre la sugerencia incluso cuando su ventana no está activa. Es posible que haya notado que hasta ahora no le he dicho a MFC ni a la información sobre herramientas ni a TOOLINFO cuál es el texto real de la sugerencia. Para eso es LPSTR _ TEXTCALLBACK. Este valor especial le dice al control de información sobre herramientas (el interno, thread-global que usa MFC) que llame mi ventana hacia atrás para obtener el texto. Hace esto enviando a mi ventana un mensaje WM _ NOTIFY con el código de notificación TTN _ NEEDTEXT.
¡Finalmente! Yo (parcialmente) lo resolví:
Parece que la ventana principal de CDockablePane de hecho causó este problema ...
Primero quité todo el código específico de información sobre herramientas de la clase CTreeCtrl-derived. Todo se hace en la ventana del panel principal.
Luego OnCreate()
método OnCreate()
la ventana principal:
int CMyPane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
const DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
TVS_CHECKBOXES | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT |
TVS_INFOTIP | TVS_NOHSCROLL | TVS_SHOWSELALWAYS;
// TREECTRL_ID is a custom member constant, set to 1
if(!m_tree.Create(dwStyle, m_treeRect, this, TREECTRL_ID ) )
{
TRACE0("Failed to create trace tree list control./n");
return -1;
}
// m_pToolTip is a protected member of CDockablePane
m_pToolTip->AddTool(&m_tree, LPSTR_TEXTCALLBACK, &m_treeRect, TREECTRL_ID);
m_tree.SetToolTips(m_pToolTip);
return 0;
}
Desafortunadamente no podemos simplemente llamar a AddTool()
con menos parámetros porque la clase base se quejará en la forma de un ASSERT
sobre un miembro de uFlag
si no hay una ID de herramienta establecida. Y dado que necesitamos establecer la ID, también debemos establecer un rectángulo. CRect
un miembro de CRect
y lo configuré en (0, 0, 10000, 10000)
en CTor. Todavía no he encontrado una manera efectiva de cambiar el tamaño rect de la herramienta, así que esta es mi solución más fea. Esta es también la razón por la que llamo a esta solución parcial. Actualización: hice una pregunta con respecto a esto.
Finalmente está el controlador para obtener la información de información sobre herramientas:
// Message map entry
ON_NOTIFY(TVN_GETINFOTIP, TREECTRL_ID, &CMobileCatalogPane::OnTvnGetInfoTip)
// Handler
void CMyPane::OnTvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);
// This is a CString member
m_toolTipText.ReleaseBuffer();
m_toolTipText.Empty();
// Set your text here...
pGetInfoTip->pszText = m_toolTipText.GetBuffer();
*pResult = 0;
}