Newsgroup: it.comp.programmare.win32
Titolo: Tray Icon

Salve,
sono nuovo della programmazione i win32 e da poco uso BCB4.
vorrei sapere come si può creare un programma che cliccando su un bottone
mi manda la finestra in tray. sulla barra delle applicazioni in basso a
destra.

 ha scritto nel messaggio
news:ZV4YLnb8$GA....@news-02.uni.net...

Il form è nominato "frmMain" ma puoi sempre cambiarlo.
Questo è il codice per la gestione di una tray icon
void TfrmMain::AddTrayIcon()
{
  // This function adds an icon to the tray.
  // Initialize the structure for Sell_NotifyIcon
  NOTIFYICONDATA icondata;
  memset (&icondata, 0, sizeof (icondata)) ;
  icondata.cbSize = sizeof (icondata) ;
  icondata.hWnd = Handle ;  // Handle of the window to receive notification
  // Set up the Tip displayed when the mouse of over the icon.
  strncpy (icondata.szTip, "Un tuo messaggio Tooltip", sizeof
(icondata.szTip));
  // Use the application's icon for the tray.
 icondata.hIcon = Application->Icon->Handle; // in questo caso si usa
l'icona dell applicazione ma puoi sempre cng
  // Tell the shell the value to use for the notification message.
  icondata.uCallbackMessage = iconmessage;
  // Tell what we are modifying (everything in this case).
  icondata.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  // Add the icon.
  Shell_NotifyIcon(NIM_ADD, &icondata);
}
void TfrmMain::RemoveTrayIcon()
{
  // This function removes the icon from the tray.
  NOTIFYICONDATA icondata;
  memset(&icondata, 0, sizeof(icondata));
  icondata.cbSize = sizeof(icondata);
  icondata.hWnd = Handle;
  Shell_NotifyIcon(NIM_DELETE, &icondata);
}
void __fastcall TfrmMain::WndProc(Messages::TMessage &Message)
{
  // If the window receives a notification message from the shell then
  // pass it to the ProcessIconMessage function. Otherwise let the default
  // processing for the message take place.
  if (Message.Msg == iconmessage)
  {
    if (Message.LParam == WM_RBUTTONDBLCLK) {
     // qui va il codice da usare in caso di doppio click di destro
sull'icona
   }
    else if (Message.LParam == WM_LBUTTONUP) {
// qui va il codice da usare in caso di click di sinistro
    nel tuo caso frmMain->Show();
}
    else if(Message.LParam == WM_RBUTTONUP) {
    // qui va il codice da usare in caso di click di destro
    }
  }
  TForm::WndProc(Message);
}
Agiungi il seguente codice (attento a creare gli eventi con la gui):
void __fastcall TfrmMain::FormDestroy(TObject *Sender) {
        RemoveTrayIcon(); // alla fine va sempre rimossa
}
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
    frmMain->Hide();
    Action = caNone;
}
Credo sia tutto... se non ho sbagliato... perchè come sempre, sono di fretta
:o)
Bye
        ^DunE^

destra.
Le icone nella Tray sono visualizzate usando la API ShellNotifyIcon,
pertanto ti basta fare si' che il tuo programma renda invisibile la
propria finestra e visualizzi l'icona richiamando la API.
Vedi documentazione sulla ShellNotifyIcon per ulteriori dettagli.
Davide


Il bottone dovrà limitarsi a nascondere la finestra.
Per inserire una icona nella tray devi utilizzare Shell_NotifyIcon (puoi 
inserire l'icona quando il programma è minimizzato e rimuoverla quando 
viene riattivato ma, AFAIK, non c'è modo di controllare dove verrà inserita 
la tua icona, quindi rischi di avere un'icona che si sposta continuamente).
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

destra.
Su Delphi Super Page c'è un componente VCl, chiamato dcMinTray che,
quando si preme il pulsante normale per minimizzare, passa
direttamente al Tray.
Sto tentando di crearne una versione che funziona solo cliccando su un
Button, ma comunque anche questa può essere utile.
-- 
Ciao
DGP85
http://daps.cjb.net/

 sono nuovo della programmazione i win32 e da poco uso BCB4.
