Newsgroup: it.comp.programmare.win32
Titolo: Cambiare icona (ancora...)

Salve a tutti.
Sono ancora alla ricerca di aiuti o suggerimenti per risolvere un
problema con la creazione/sostituzione di una icona sulla TaskBar di
Windows.
Il programma al quale lavoro, genera un'icona al suo avvio.
Vorrei fare in modo che, in seguito ad un evento, si modifichino il
suggerimento associato all'icona (tip) e l'immagine stessa che appare
sulla taskbar.
Attualmente, per mostrare l'icona uso:
draw_the_original_icon(hIn, hPreIn);
mentre per modificarla:
Shell_NotifyIcon(NIM_DELETE, &structNID); 
redraw_the_icon(hIn, hPreIn);
Il mio quesito è il seguente:
Anzichè distruggere l'icona presente e creare quella nuova,
posso modificare l'icona usando il comando?
Shell_NotifyIcon(NIM_MODIFY, &structNID); 
Se è possibile, come tutto ciò è realizzabile?
Grazie per l'aiuto!
/*##########################################################
// METODO DI CREAZIONE / RIPRISTINO DELL'ICONA SULLA TASKBAR
###########################################################*/
void draw_the_original_icon(HINSTANCE hInstance, HINSTANCE
hPrevInstance)
{
/*HINSTANCE*/	
if(!hPreIn)
{	
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(hInstance,(LPCTSTR)MAKEINTRESOURCE(IDI_TRAYICON));
	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = "IconTest";
	RegisterClass(&wc);
}
/*HWND*/
hWnd = CreateWindow("IconTest",
	      "Title",
	      WS_OVERLAPPEDWINDOW,
	      CW_USEDEFAULT,
	      CW_USEDEFAULT,
	      CW_USEDEFAULT,
	      CW_USEDEFAULT,
	      NULL,
	      NULL,
	      hInstance,
	      NULL);
/*ICON*/
hMainIcon = LoadIcon(hInstance,(LPCTSTR)MAKEINTRESOURCE(IDI_TRAYICON));
/*NOTIFYICONDATA*/
structNID.cbSize = sizeof(NOTIFYICONDATA);  
structNID.hWnd = (HWND) hWnd; 
structNID.uID = IDI_TRAYICON; 
structNID.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
strcpy(structNID.szTip,"Testo originale"); 
structNID.hIcon = hMainIcon; 
structNID.uCallbackMessage = WM_USER_SHELLICON; 
// CREA L'ICONA E LA PIAZZA SULLA TASKBAR
Shell_NotifyIcon(NIM_ADD, &structNID); 
return;
}
/*##########################################################
// METODO DI MODIFICA DELL'ICONA SULLA TASKBAR
###########################################################*/
void redraw_the_icon(HINSTANCE hInstance, HINSTANCE hPrevInstance)
{
/*HINSTANCE*/	
if(!hPreIn)
{
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(hInstance,(LPCTSTR)MAKEINTRESOURCE(IDI_TRAYICONb));
	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = "IconTest";
	RegisterClass(&wc);
}
/*HWND*/
hWnd = CreateWindow("IconTest",
	      "Title",
	      WS_OVERLAPPEDWINDOW,
	      CW_USEDEFAULT,
	      CW_USEDEFAULT,
	      CW_USEDEFAULT,
	      CW_USEDEFAULT,
	      NULL,
	      NULL,
	      hInstance,
	      NULL);
/*ICON*/
hSecondIcon=LoadIcon(hInstance,(LPCTSTR)MAKEINTRESOURCE(IDI_TRAYICONb));
/*NOTIFYICONDATA*/
structNID.cbSize = sizeof(NOTIFYICONDATA); 
structNID.hWnd = (HWND) hWnd; 
structNID.uID = IDI_TRAYICONb; 
structNID.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
strcpy(structNID.szTip,"Testo modificato"); 
structNID.hIcon = hSecondIcon; 
structNID.uCallbackMessage = WM_USER_SHELLICON; 
// CREA L'ICONA MODIFICATA E LA PIAZZA SULLA TASKBAR
Shell_NotifyIcon(NIM_ADD, &structNID); 
return;
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Ciao, Pietro!
Il giorno 21/07/2004 alle ore 18:46 hai scritto:
 P> Anzichč distruggere l'icona presente e creare quella nuova,
 P> posso modificare l'icona usando il comando?
 P> Shell_NotifyIcon(NIM_MODIFY, &structNID);
 P>
 P> Se č possibile, come tutto ciň č realizzabile?
Mi sembrava di averti gia' risposto:
http://groups.google.it/groups?hl=it&lr=lang_en|lang_it|lang_de&ie=UTF-8&frame=right&th=65534fbcd079823b&seekm=cd91k1%2463u%241%40news.newsland.it#link2
Bye
-- 
There is no passion; There is serenity.
http://www.maccasoft.com

 
Il fatto č che non ho capito bene chi o cosa modificare.
Potresti essere cosě gentile da farmi un esempio pratico?
Pietro.


Ciao, Pietro!
Il giorno 21/07/2004 alle ore 19:54 hai scritto:
 PB> Il fatto č che non ho capito bene chi o cosa modificare.
 PB> Potresti essere cosě gentile da farmi un esempio pratico?
Senti, non ho molta voglia di interpretare e riscrivere un sorgente. Tra
l'altro lo hai gia' fatto per cambiare il testo, non vedo quale problema ci
sia a fare la stessa cosa per l'icona.
Ti ripeto ancora che puoi modificare l'icona semplicemente cambiando
l'hicon. Tu usi due identificativi diversi per le due icon (uID) e cio' e'
sbagliato perche' devi usare sempre lo stesso e cambiare solo l'hIcon.
Bye
-- 
Fear is the path to the Dark Side.
http://www.maccasoft.com

 Bye
Quindi mi stai dicendo che: 
structNID.uID = IDI_TRAYICON   // SEMPRE. Sia per l'icona originale 
                               // sia per quella modificata
// ciò che cambia è:
hSecondIcon=LoadIcon(hInstance,(LPCTSTR)MAKEINTRESOURCE(IDI_TRAYICONb));
structNID.hIcon = hSecondIcon;    // modifica l'icona
strcpy(structNID.szTip,"Icona modificata!");  // modifica il testo
Shell_NotifyIcon(NIM_MODIFY,&struct_NID);  // applica i cambiamenti
In pratica: le 2 icone sono dotate di 2 ID ma
WINDCLASS e HWND rimangono invariati così come structNID.uID ???
Pietro 
