Newsgroup: it.comp.lang.c++
Titolo: Porre l'icona nella SystemTray con VC++ e funzioni callback

Qualcuno puň dirmi come si fa a posizionare l'icona nella system tray e
soprattutto gestirla con una funzione callback ?
Sono riuscito a porre l'icona nel system tray perň come il mouse ci passa
sopra essa sparisce! Forse ho sbagliato qualcosa oppure non ho gestito la
funzione callback. Cosa č esattamente una funzione callback?
Ho visto alcuni esempi funzionanti sia sulla documentazione del VC++ che sul
sito CodeGuru 
http://www.codeguru.com
 e ho potuto constatare che alcuni
usano il messaggio WM_MOUSEMOVE per gestire la system tray, altri piů
correttamente si creano un proprio messaggio (se ho capito bene) in modo da
non "impegnare" il WM_MOUSEMOVE.
Non vorrei copiare brutalmente il codice senza capirlo, quindi se per favore
mi date una mano a comprendere i quesiti riguardante il callback e il
passaggio dei messaggi per gestire la systray.

>funzione callback. Cosa è esattamente una funzione callback?
Quando carichi la struttura NOTIFYICONDATA gli devi dire l'HWND della tua finestra in modo che ti chiami la tua funzione di callback che hai gia' per la tua finestra ed un messaggi ed un codice scelto da te (uCallBackMessage) in modo che tu possa riconoscere il messaggio che ti invia l'icona.
Nella funzione di callback della tua finestra controlla il codice del messaggio: se e' uguale al codice dato per l'icona allora e' un messaggio che arriva dall'icona e lParam contiene il codice del messaggio (evento) inviato dall'icona (WM_MOUSEMOVE, etc.).
Ciao
Antonio Donatiello

Come si definisce esattamente il mio messaggio WM_MYMESSAGE? E' un ID o che
cosa?


Ho provato a porre un'icona nel system tray con VC++ 6 e però quando il
mouse ci va sopra l'icona sparisce.
Ti dico quello che ho fatto esattamente:
- Ho creato un'applicazione vuota document/view con class wizard
- Nella classe frame ho inserito il seguente metodo:
void CMainFrame::AggiungiIconTray() {
    NOTIFYICONDATA tic;
    tic.cbsize=sizeof(NOTIFYICONDATA);
    tic.hWnd=HWND(this); <--------- E' CORRETTO O SBAGLIATO ???
    tic.uID=NULL;
    tic.uFlags=NIF_MESSAGE | NIF_ICON | NIF_TIP;
    tic.uCallBackMessage=WM_MYNOTIFYICON;
    strcpy(tic.szTip, "Nome Applicazione");
    Shell_NotifyIcon(NIM_ADD, &tic);
}
Il mio problema è come aggiungere il messaggio WM_MYNOTIFYICON in modo che
venga riconosciuto e la funzione callback associata al messaggio
WM_MYNOTIFYICON.
Cioè il messaggio è un identificatore qualunque cioè lo posso mettere
assieme a normali identificatori? Inoltre penso lo devo inserire nella mappa
dei messaggi, e se si come?
Inoltre come fa a sapere la mia applicazione che quando viene posta l'icona
nel systemtray e il mouse ci passa sopra, essa deve richiamare la mia
funzione callback? C'è qualche evento da usare in Class Wizard ?
Ad esempio per intercettare la pressione di un pulsante utilizzo class
wizard e al messaggio COMMAND associo un gestore degli eventi, ma per
gestire il movimento del mouse della mia icona nella system tray?

>funzione callback? C'è qualche evento da usare in Class Wizard ?
Lo sa perche' hai passato il tuo HWND nella riga che hai chiesto se fosse giusta.
Per intercettare il messaggio usando il class wizard dovresti fare il mapping del messaggio ma non so come si faccia (non uso MFC). Se non riesci a fare il mapping forse puoi intercettarlo nel metodo OnMessage() o analogo.
In programmazione senza MFC devi rispondere al messaggio con codice WM_NOTIFYICON nella funzione di callback.
Antonio Donatiello

Per intercettare il 
messaggio usando il class wizard dovresti fare il mapping del messaggio ma non 
so
