Newsgroup: it.comp.lang.visual-basic
Titolo: visualizzare bitmap

Ho un componente di terze parti che mi fornisce un puntatori a dei
bitmap dib e relativi bitmapinfo e bitmapinfoheader.
Per vedere queste immagini ho provato con l'api setdibitstodevice e
dei picturebox, in effetti funziona per circa un minuto poi dopo
alcune migliaia di cicli (sono varie immagini che vengono rinfrescate
4 volte al secondo) l'applicazione crasha, usando l'exe gia alla prima
chiamata a setdibitstodevice l'applicazione crasha.
facendo debug remoto col fornitore del componente è risultato che Vb
(non si sa per quale motivo) va a scrivere in un area di memoria
riservata e crasha, quindi il crash non dipende dalla dll che mi
fornisce il bitmap.
Eliminando Setdibitstodevice l'applicazione gira regolarmente anche
ore e ore (ma non vedo niente ovviamente)
Vorrei provare a mostrare il bitmap usando un altro metodo, diverso
dalla api setdibitstodevice, come posso fare?
grazie

 dalla api setdibitstodevice, come posso fare?
copiare con bitblt nellHWND della picturebox ? 
cmq: io userei un'imagebox (piu' leggera) e metterei l'autoredraw su FALSE.

On 12 Mag, 16:34, "Franz_aRTiglio" <franz...@N0SPAMtin.it> wrote:

sto provando, ma non vedo niente e la funzione mi restituisce false
(quindi per qualche ragione fallisce) ora sto vedendo di capire con
getlasterror cosa la fa fallire

On 12 Mag, 16:34, "Franz_aRTiglio" <franz...@N0SPAMtin.it> wrote:

un altra cosa.... come fai ad usare un imagebox che non ha l'handle?


Nn mischiamo capre e motocarri...
Se usi la picturebox vai di bitblt
se opti per la imagebox devi creare una variabile bitmap
e legare la imagebox alla variabile, poi spari i dati nella
variabile e refreshi la imagebox, ma e' roba che ho fatto ANNI fa'
quindi potrei starmi confondendo...
la meglio cosa, comunque, e' agganciare l'area della memoria
video e sparare i dati li'... e' roba directX se nn ricordo male.

 dalla api setdibitstodevice, come posso fare?
Se il formato che hai č quello, che dire... la butto lě: se puoi
smanettare sui dati, una GetBitmapBits sulla bitmap restituita
dal componente esterno, seguita da una SetBitmapBits sulla
PictureBox, probabilmente funzionerebbe.
Ma io prima proverei a risolvere il problema originale.
Bye, G. 

 PictureBox, probabilmente funzionerebbe.
Hai qualche codice di esempio?

On 13 Mag, 02:02, "Franz aRTiglio" <franz...@N0SPAMtin.it> wrote:

hai qualche codice di esempio?

 End Sub
completo il codice per dare maggior chiarezza
questa è la dichiarazione di setdibitstodevice che uso
Public Declare Function SetDIBitsToDevice Lib "gdi32" ( _
ByVal hdc As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal DX As Long, _
ByVal DY As Long, _
ByVal SrcX As Long, _
ByVal SrcY As Long, _
ByVal Scan As Long, _
ByVal NumScans As Long, _
ByRef lpBits As Any, _
ByRef lpBI As BITMAPINFO, _
ByVal wUsage As Long) As Long

 hai qualche codice di esempio?
Purtroppo no... quel codice che avevo fatto e' rimasto 
nella mia EX ditta... roba di quasi 10 anni fa'... i miei primi
(e ultimi) pasticci con le directx.

 Public Declare Function SetDIBitsToDevice Lib "gdi32" ( _
Vedo qualche punti dubbio. Prima di tutto, verifica che le
dichiarazioni di Bitmapinfo e bitmapinfoheader siano corrette.
Qui ne trovi delle versioni, ben commentate, nel LeggePB.ZIP:
http://www.flanguasco.org/VisualBasic/VisualBasic.html
In secondo luogo nella chiamata della funzione quel numero
100000 mi pare un po' troppo preciso... sei sicuro che ti venga
passato esattamente quel numero di dati ?
Lě ci dovrebbe essere il numero di linee della DIB, se non
ricordo male.
In terzo luogo, ti consiglierei di usare una variabile in cui farti
restituire il risultato della chiamata, per verificare se c'č stato
un errore. Una cosa di questo tipo:
Dim lResult as Long
    lResult=SetDIBitsToDevice(FrameContainer(pUserData).hDc, [blablabla]
If lResult=0 then [c'č stato un errore...]
Bye, G. 

 If lResult=0 then [c'è stato un errore...]
mmm... lo farò....

 ho provato con 0,0,0,0 o 10,10,10,10 ma non cambia nulla
Quelli sono valori che vengono riempiti dal programma,
non roba che ci devi mettere tu :-)
Bye, G.


si, guardando piu attentamente me n'ero accorto anche io.
Grazie mille per tutto, sei stato gentilissimo.
Ciao

 Tu che ne pensi?
Due cose. La prima è che stai partendo col piede sbagliato.
Suppongo che tu non sia il solo ad usare quel componente,
e se avesse qualche problema del genere sarebbe venuto
fuori da un bel po'.
La seconda è che se continui a mantenere il segreto sul
codice che usi (e questo posso capire che ci siano dei motivi),
a non dire di che componente si tratta e a non seguire i
suggerimenti, aiutarti diventa sempre più difficile.
Bye, G.

 suggerimenti, aiutarti diventa sempre più difficile.
I suggerimenti li ho seguiti tutti, e vi ringrazio perche' mi sono stati 
molto utili per isolare il problema, purtroppo non a risolverlo perche' non 
dipende da me.
Come dicevo e hai giustamente immaginato lavoro per un azienda e faccio 
parte del team di sviluppo.
Cmq il codice l'ho postato, non c'e' altro a livello di codice.
Gia con quel codice e' possibile verificare il problema avendo la DLL in 
mano, la DLL che uso invece e' coperta da segretissimo riserbo :-)))))
Cmq seguiranno riunioni confronti e decisioni da chi spetta decidere, per il 
momento la cosa finisce qui.
Grazie mille per tutti gli aiuti.
Ciao 

 Cmq il codice l'ho postato, non c'e' altro a livello di codice.
Come direbbe Quelo, "il codice è dentro di te, epperò è sbajato".
Bye, G. 


Oddio, dalla mia parte il codice e' giusto, l'errore sta nella DLL, infatti 
ora dovranno vedere cos'e' che genera il casino, sempre se vogliono... 
quella DLL infatti non e' roba che mi compete, e' proprio un altro 
dipartimento dell'azienda.
GRAZIE MILLE
CIAO 

 > Come direbbe Quelo, "il codice è dentro di te, epperò è sbajato".
Bye, G.


Ripeto... e' giusto..
:-)
CIAO E GRAZIE DELL'AIUTO