Newsgroup: it.comp.programmare.win32
Titolo: Ridurre a icona una finestra

Scusate la banalita' (se per me lo fosse, non posterei!): il mio
applicativo MFC (SDI) e' costituito da una main frame che puo' essere
solo minimizzata o chiusa. Le specifiche del prodotto richiedono che
quando essa viene minimizzata, sia ridotta a icona nella barra di
WINDOWS (l'icona deve finire nella sezione comprendente il clock).
Sono quasi certo che si tratti di impostare lo stile della main frame,
ma potrei sbagliarmi. Potreste darmi un suggerimento veloce?
Grazie anticipatamente
--
Massimo Fauro

 wrote in message
news:8j9gpl$mbp$1...@bw107zhb.bluewin.ch...

No, la mainframe, di per se, non sa gestire il comportamento che
richiedi.  Devi invece gestire la "minimizzazione" *nascondendo*
(SW_HIDE) la mainframe, e ponendo l'icona nel tray con l'API
Shell_NotifyIcon con parametro NIM_ADD.  Nella struttura di tipo
NOTIFYICONDATA che passi all'API specifichi quale messaggio, e
diretto a quale finestra, vuoi ricevere quando c'e` attivita`
di mouse o keyboard verso l'icona del tray (da usare per il
"risveglio", SW_SHOW del mainframe ecc, quando richiesto).
Userai la DrawAnimatedRects per gli "effetti speciali" che
"mostrano" la tua mainframe che si "minimizza" e poi si
"ripristina", naturalmente.
Tocca a te decidere se l'icona nel tray debba "sparire" quando
la finestra si "de-minimizza" ovvero essere sempre presente
sinche` la tua finestra esiste (consiglierei questa seconda
possibilita` per coerenza con la gran parte delle applicazioni
che usano schemi di questo genere).  Tocca a te decidere come
l'utente chiedera` il "risveglio" (clic di LBUTTON sull'icona
del tray, e/o context menu al clic di RBUTTON idem, e/o...?).
Un esempio del codice che puoi inserire nella InitInstance
del tuo oggetto applicazione, subito prima di (supponendo
la tua applicazione MFC sia stata fatta dal Wizard...):
 // The one and only window has been initialized, so show and update it.
 m_pMainWnd->ShowWindow(SW_SHOW);
 m_pMainWnd->UpdateWindow();
per mostrare l'icona nel tray come detto...:
    // Insert the tray-icon
    NOTIFYICONDATA nid;
    ZeroMemory(&nid, sizeof(nid));
    nid.cbSize = sizeof(nid);
    nid.hWnd = m_pMainWnd->GetSafeHwnd();
    nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
    nid.hIcon = LoadIcon(IDR_MAINFRAME);
    strcpy(nid.szTip, "My Application!");
    nid.uCallbackMessage = WM_APP+1;
    Shell_NotifyIcon(NIM_ADD, &nid);
Ora devi gestire WM_APP+1 nel tuo mainframe, e occuparti anche
della cancellazione dell'icona.
Per la cancellazione ad esempio potresti avere:
void CMainFrame::OnClose()
{
    // Delete the tray-icon
    NOTIFYICONDATA nid;
    ZeroMemory(&nid, sizeof(nid));
    nid.cbSize = sizeof(nid);
    nid.hWnd = GetSafeHwnd();
    Shell_NotifyIcon(NIM_DELETE, &nid);
 CFrameWnd::OnClose();
}
Per la gestione aggiungerai alla definizione della classe
CMainFrame, ad es,
    afx_msg LRESULT OnIcon(WPARAM, LPARAM);
e alla sua message-map:
    ON_MESSAGE(WM_APP+1, OnIcon)
ad esempio per usare il clic del bottone sinistro del
mouse per minimizzare/deminimizzare potresti avere:
LRESULT CMainFrame::OnIcon(WPARAM w, LPARAM l)
{
    if(l==WM_LBUTTONDOWN) {
        if(IsIconic()) {
            ShowWindow(SW_RESTORE);
        } else {
            ShowWindow(SW_SHOWMINNOACTIVE);
        }
    }
    return 0;
}
e per garantire che la mainframe, se minimizzata, non
appaia anche come normale icona/bottone su taskbar,
gestirai anche WM_SIZE:
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
 CFrameWnd::OnSize(nType, cx, cy);
    if(nType==SIZE_MINIMIZED) ShowWindow(SW_HIDE);
}
Restano parecchi 'ciappini' da completare, come la
DrawAnimatedRects opportuna, il context menu al clic
del bottone destro sull'icona, ecc, ecc, ma il grosso
e` questo.
Alex


....
Non ho parole... mai pensato di scrivere un bel librone per la
programmazione sotto WINDOWS? O l'hai gia' scritto?
Mitico! Grazie infinite!
Massimo Fauro

 Mitico! Grazie infinite!
Prego!
Alex

Mitico! Grazie infinite!
Scarica il suo tutorial !!! 
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
--------------------------------------------------------------
"Partire e' un po' morire e morire e' partire un po' troppo !"
--------------------------------------------------------------