Newsgroup: it.comp.lang.c++
Titolo: [VC5] Come si "lancia" un'icona in VC5sp1?

Ciao a tutti. Scusate se la domanda non e' proprio relativa a c++ ma
non ho trovato un gruppo migliore di questo per chiedere. Spero di
riuscire a farmi capire perche' ho ben chiaro quello che vorrei fare
ma non mi e' immediato spiegarlo.
Vorrei scrivere un'applicazioncina che mi permette di lanciare in
sequenza un certo numero di applicazioni, e fino qui tutto ok: ne
avete gia' parlato milioni di volte.
Anziche' specificare un elenco di eseguibili da lanciare in sequenza
con il relativo percorso --cosa pallosa--, pero', io vorrei trascinare
le icone degli eseguibili sulla finestra della mia applicazione.
L'idea sarebbe di salvarsi delle liste di applicazioni da lanciare
utilizzando come input le icone che le identificano nelle rispettive
cartelle in "program files" oppure nel menu' Start/Programs/...
anziche' il loro unita'/percorso/nome.
Spero di essere stato sufficientemente chiaro.
Saluti a tutti.
----------------------------
Gianni "BugBarbeq" Rondinini
Kawasaki ZZ-R 1100
Calibrezio 4x4 16v Turbo ECC
"Io il gas glielo do' di brutto"

Il primo passo è creare la finestra in cui vuoi trascinare i file (non è
una questione di icone) con lo stile esteso WS_EX_ACCEPTFILES (e magari
anche WS_EX_TOPMOST, così non ti scompare quando clicchi in Gestione
risorse).
A questo punto, quando trascinerai un file (o una selezione di più files)
sopra la finestra, noterai che il cursore cambierà aspetto; ora, quando
rilascerai il tasto del mouse la finestra riceverà un messaggio
WM_DROPFILES che dovrai elaborare.
In risposta a WM_DROPFILES devi chiamare la funzione DragQueryFile, una
volta per sapere il numero di files trascinati e poi tante volte quanti
sono i files; esempio:
.
.
.
case WM_DROPFILES:
 UINT      uiNumFiles,ui;
 TCHAR   tszBuffer[_MAX_PATH];
 uiNumFiles = DragQueryFile((HDROP)wParam,
                                           (UINT)0xFFFFFFFF,
                                           NULL,
                                           0);
 for(ui = 0; ui < uiNumFiles; ui++)
 {
  DragQueryFile((HDROP)wParam,
                        ui,
                        (LPTSTR)tszBuffer,
                        _MAX_PATH);
  // Salva il nome del file (contenuto in tszBuffer) in una lista
 }
 DragFinish((HDROP)wParam);
return 0;
.
.
.
All'interno del ciclo 'for' potresti effettuare anche operazioni
aggiuntive, come ad esempio controllare che il file sia di tipo eseguibile
e ignorarlo (non inserendolo nella lista) nel caso non lo fosse; potresti
addirittura ottenere le icone degli eseguibili utilizzando la funzione
'ExtractIcon' per poi inserirle in una ImageList e presentare il tutto
(icone e nomi) in una ListView.
Utilizzo di ExtractIcon:
HICON hIcon;
hIcon = ExtractIcon(hInstance,
                             (LPCTSTR)tszBuffer,
                             0);
Il parametro hInstance è l'handle dell'applicazione (il primo parametro di
WinMain); tszBuffer è il nome del file con percorso completo (restituito da
DragQueryFile) e l'ultimo parametro è l'indice dell'icona.
Stefano.

DragQueryFile) e l'ultimo parametro č l'indice dell'icona.
Ottimo, ti ringrazio molto. Venerdi' mi metto a provare di scrivere
qualcosa --domattina ho l'orale di Elettronica II...-- e ti faccio
sapere.
Ti ringrazio ancora.
Cordialmente.
