Newsgroup: it.comp.lang.c++
Titolo: ToolTips su edit nelle Dialog

Ciao utilizzo da poco tempo il Visual C++e vorrei sapere se e' possibile e
in che modo, visualizzare le ToolTips in una dialog mi spiego meglio:
ho realizzato una dialog con tre edit che funzionano perfettamente ma vorrei
che qundo il cursore sosta su una di esse, possa comparire la classica
finestrella con dentro il testo. (vorrei utilizzare tale prestazione come
help dinamico)
Se qualcuno e' in grado di aiutarmi lo ringrazio antipacitamente.



Ciao, la cosa che devi fare è molto semplice (... tra virgolette...):
1) Aggiungere nel costruttore della tua dialog una chiamata del tipo:
	 CMiaDlg::CMiaDlg (CWnd* pParent /*=NULL*/)
	: CDialog(CMiaDlg::IDD, pParent)
	 {
		EnableToolTips( TRUE);		//Abilita i tooltip
	}
2) Aggiungere ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify ) nella
notifica dei messaggi
3) Aggiungere questa funzione alla tua dialog:
BOOL CMiaDlg::OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT *
pResult )
{    
	TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;    
	UINT nID =pNMHDR->idFrom;
    if (pTTT->uFlags & TTF_IDISHWND)    
	{
        // idFrom is actually the HWND of the tool
        nID = ::GetDlgCtrlID((HWND)nID);        
        if(nID)        
        {
            pTTT->lpszText = MAKEINTRESOURCE(nID);
            pTTT->hinst = AfxGetResourceHandle();            
			return(TRUE);
        }    
    }    
    return(FALSE);
}
4) N.B. Nella dichiarazione della tua classe aggiungi ovviamente il
membro:
BOOL OnToolTipNotify(UINT, NMHDR *, LRESULT *);
A questo punto basta che nella StringTable aggiungi in corrispondenza
degli ID dei tuoi campi di edit (es. IDC_EDIT1, IDC_EDIT2 e IDC_EDIT3)
le stringhe con i testi che vuoi visualizzare e il gioco è fatto.
P.S. Questo ti funziona se usi MFC 5.0 o superiore...
Buon Lavoro.

help dinamico)
Ci sono vari schemi, comunque, supponendo che tu stia usando
le MFC (non ce lo dici...!), uno dei piu` flessibili/potenti e`:
-- chiama la EnableToolTips(TRUE) sul CDialog in questione,
    ad esempio nella sua OnInitDialog dovrebbe andar bene;
-- gestisci la notifica "need-text" del tooltip, aggiungendo, e.g.:
    ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnNeedText)
alla mappa dei messaggi del tuo dialogo, e
BOOL CTuoDialog::OnNeedText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult );
fra le sue funzioni-membro;
-- implementa la OnNeedText nella CTuoDialog.cpp:
BOOL CTuoDialog::OnNeedText( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
{    
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;    
    UINT nID =pNMHDR->idFrom;    // id del controllo "tooltippato"
    if (pTTT->uFlags & TTF_IDISHWND)    
    {
        // oops, idFrom e` la HWND e non l'ID, rimediamo:
        nID = ::GetDlgCtrlID((HWND)nID);        
    }
    // scegli il testo da mostrare a seconda dell'ID, ad es:
    char* chedico = 0;
    switch(nId) {
         case IDC_PIPPO: chedico = "Pippo!"; break;
        // ecc, ecc
    }
    // se non abbiamo niente da dire...:
    if(!chedico) return FALSE;
    // se abbiamo qualcosa da dire...:
    pTTT->lpszText = chedico;
    return TRUE;
}
Hai 3 modi a tua scelta per specificare il testo da mostrare,
sempre intervenendo sulla TOOLTIPTEXT il cui indirizzo ti
e` passato nel parametro pNMHDR: se entro gli 80 caratteri
puoi copiarlo nel suo buffer interno szText (attento che e`
WCHAR -- se tu internamente non lavori in Unicode, ma in
char di 8 bit, dovrai usare la funzione C standard mbctowcs
o un qualche equivalente, NON la semplice strcpy!), se vuoi
gestirtelo tu metti il puntatore in lpszText, infine se e` una
risorsa (tipicamente dalla string table) metti il ptr al nome della
risorsa (o MAKEINTRESOURCE relativo, ovviamente!) in
lpszText e in hinst la HINSTANCE da cui prenderla.
Come dicevo, ci sono altri schemi, ma io trovo che questo,
generalmente, copre bene le mie esigenze.
Alex

Ti ringrazio moltissimo...ora funziona perfettamente.
Ciao e ancora grazie.

Grazie per avermi risposto.
Ora funziona tutto perfettamente.....
Ciao e ancora grazie.