Newsgroup: it.comp.lang.visual-basic
Titolo: Ricostruzione della cache delle icone


Scusa?

Cioe'?

Ciao a tutti e specialmente al Sig. Zanna che mi pare molto esperto nel
trattamento delle icone....
Volevo fare una cosa apparentemente cretina....ovvero trascinare le
icone dal desktop o da gestione risorse su un mio programma e allo
stesso tempo estrarre ed evidenziarne l'icona; come fa per esempio 
la barra degli strumenti di office.
Sono due settimane che ci provo ma non succede niente o quasi.
ovvero trasporto l'icona nella mia picturebox ma se tento di spostarla
in un'altra con picture2.picture = picture1.picture e' come se nella
picture1 non ci fossa nulla.
Riporto in allegato io pezzaccio di codice che funziona solo in parte 
ovvero senza darmi modo, poi di trattare l'immagine come se fosse 
stata caricata dal loadpicture .......quale e' la differenza ?!?!?
Grazie a tutti in anticipo
Stefano Piersigilli
   Picture1.Picture = LoadPicture()
   a = ExtractAssociatedIcon&(0, Data.Files(1), 0)
   s = DrawIcon(Picture1.hdc, 2, 2, a)
   c = CreateCompatibleDC(Picture2.hdc)
   d = BitBlt(Picture2.hdc, 0, 0, Picture2.ScaleWidth,            
Picture2.ScaleHeight, Picture1.hdc, 0, 0, SRCCOPY)
   d = StretchBlt&(c, 0, 0, Picture2.ScaleWidth,
Picture2.ScaleHeight,        Picture1.hdc, 0, 0, Picture1.ScaleWidth,
Picture1.ScaleHeight, SRCCOPY)
   Picture1.Refresh
   Picture2.Refresh
-- 
Contact     : Stefano Piersigilli
Company     : StephenSoftware(R)
Address     : Via Ettore Paladini, 45-47-49
Zip         : 00149
City        : ROME
State       : ITALY
Tel.        : 0039-065571648
Fax         : 0039-065560638
Internet    : 
http://www.stephensoftware.it
Fingerprint : 08 C6 63 BC 79 93 C1 98  46 20 45 11 30 77 5F C9

...
Intanto, grazie per la fiducia, ma se mi chiami ancora "Sig." non ti
rispondo più.
Il codice da te incriminato sembra in realtà funzionare perfettamente se non
fosse per un particolare.
Picture1.Refresh in realtà andrebbe usato solo così (teoricamente):
If Picture1.Autoredraw Then Picture1.Refresh
Assicurati che la proprietà Autoredraw delle picturebox sia settata a True.
Se non è così windows non si preoccupa del suo ridisegno e quando richiami
il Refresh o ci sposti sopra un'altra finestra il contenuto della PictureBox
viene cancellato.
Quindi se Autoredraw = False dovresti mettere il tuo codice di ridisegno
nell'evento _Paint.
ATTENZIONE: in questo caso un'eventuale chiamata a Refresh ti darebbe un
errore di stack in quanto Refresh richiama a sua volte _Paint.
Questo sistema non mi sembra comunque molto efficente, meglio sacrificare un
po' di memoria e lasciare che sia Win a fare tutto il lavoro, mettendo
appunto Autoredraw = True.
Altra considerazione:
non capisco perchè utilizzi una BitBlt() anzichè riusare la DrawIcon, e
perchè poi rieseguivi una StretchBlt(), ma credo sia solo un codice di
debug.
Non ho capito nemmeno l'uso del CreateCompatibleDc(), ma _RICORDA_ che alla
fine, appena il DC creato non ti serve più lo devi rilasciare liberando la
memoria allocata con DeleteDC()!
Mentre se usi una GetDC() poi devi usare una ReleaseDC().
Questo è il codice che io trovo funzionante:
   Picture1.Picture = LoadPicture()
   a = ExtractAssociatedIcon&(0&, Data.Files(1), 0&)
   Call DrawIcon(Picture1.hdc, 2, 2, a)
   'c = CreateCompatibleDC(Picture2.hdc)
   d = BitBlt(Picture2.hdc, 0&, 0&, Picture2.ScaleWidth,
Picture2.ScaleHeight, Picture1.hdc, 0&, 0&, SRCCOPY)
   'd = StretchBlt&(c, 0&, 0&, Picture2.ScaleWidth, Picture2.ScaleHeight,
Picture1.hdc, 0&, 0&, Picture1.ScaleWidth, Picture1.ScaleHeight, SRCCOPY)
   'Picture1.Refresh
   'Picture2.Refresh
Nota che dove tu usavi 0 come parametro, io passo 0&.
In questo modo forzo VB a passare un long, e non un'intero.
Spesso non cambia niente, ma se trovi un'API un po' schizzinosa ti manda in
crash il sistema.
Sempre meglio essere precisi, meglio non rischiare per una stupidaggine del
genere, che tra l'altro è parecchio difficile da debuggare (chi va a
immaginare che l'errore è nel tipo di dati che VB decide a sua discrezine di
passare?).
Questo dovrebbe risolvere un po' dei tuoi problemi, se ce ne sono altri
posta pure ancora sul NG.
Ciao.

 Ciao.
Provo e ti faccio sapere.........
Ti rigrazio molto ......e non temere che ho altre 6/7 mila cose da 
chiedere sul NG e percio' mi vedrai ancora scritto
CIAO
Stephen
