Newsgroup: it.comp.programmare.win32
Titolo: sto per impazzire....

scusate se rompo ancora con questa storia delle bitmap.
Allora faccio un po' di chiarezza:
ho dei dati nella classe cDocument che devo visualizzare, le visualizzazioni
dei dati che posseggo sono 3 e ho 3 bottoni sulla toolbar che l'utente può
selezionare a seconda di quale visualizzazione vuole (il mio è un documento
SDI), per non stare ogni volta a ridisegnare il tutto con un setpixel (ci
mette una vita) vorrei che il programma si salvasse in memoria (runtime se
possibile) 3 bitmap che possono essere richiamate ogni volta con una bitblt.
Ora, ho fatto un sacco di prove, ma non ne ha funzionato una che sia una.
la struttura del mio programma è la seguente:
classe CMyDocument, funzione OnButton1(), richiamo il CDC della CMyView con:
POSITION pos=GetFirstViewPosition();
CDC* pViewCDC=GetNextView(pos)->GetDC();
creo un CDC compatibile e una bitmap compatibile con questo'ultimo, ci
disegno sopra, CDC e bitmap sono membri della CMyDocument:
m_CDC.CreateCompatibleDC(pViewCDC);
m_bmpBitMap.CreateCompatibleBitmap(&m_CDC,1000,1000);
m_CDC.SelectObject(&m_bmpBitMap);
int i,j;
for (i=0;i<1000;i++)
   for (j=0;j<1000;j++)
      m_CDC.SetPixel(i,j,arColor[6]);
UpdateAllViews(NULL);
in OnDraw poi faccio la BitBlt fra il pDC di OnDraw e il m_CDC ma ovviamente
non funziona.
Ipotizzando che quello che sto facendo è una cagata pazzesca, chi mi sa dire
come fare? Non voglio ogni volta fare la setpixel in ondraw perchè lo scroll
è lentissimo, voglio una bitblt cosicchè lo scroll sia veloce. ho la vaga
idea che delle bitmap e dei device context non ho capito un tubo.
Ciao
--
Roberto
FV
----------
rob...@messora.com
ICQ# 37732681
----------
Membro di SFI Italy
Simulazioni PBEM di Star Trek
 
http://gioco.net/startrek
(Crusader, Highlander, Unicorn)
----------
Resistance is futile

 wrote in message
93chmg$i7i$1...@lacerta.tiscalinet.it...

Mmmmmm... a prima vista sembra giusto, tra l'altro anch'io ho fatto cose del
genere più volte.
L'unica differenza è che non uso MAI la SetPixel, ossia, PRIMA di
selezionare m_bmpBitmap
dentro m_CDC (che a proposito non ho ben capito se è una variabile globale o
qlcs del genere...)
faccio qualcosa del tipo:
m_bmpBitmap.GetBitmapBits( DWORD(numero di byte) , (BYTE *)buffer );
poi ci disegni quello che ti pare in base al formato del bitmap (se è a 16
bit è un casino!!) dopodichè
m_bmp.Bitmap.SetBitmapBits(DWORD(numero di byte) , (BYTE *)buffer );
e POI selezioni il bitmap. Ossia l'unica differenza tra me e te è che io
modifico il bitmap e non direttamente
il CDC. Buono a sapersi!!
Se il DC della pViewDC è (malauguratamente) a 16 bit prova a cambiare il
formato dello schermo, lo metti
a 24 bit ed il gioco dovrebbe essere fatto... In realtà c'è il modo di
aggiustare ugualmente la situazione qualsiasi sia
il settaggio dello schermo, però è un pò complicato, leggiti "SAMPLE: DIBs
and Their Uses" e roba simile
sull'MSDN e vedrai che capisci che non sei tu che non hai capito i DC, ecc,
è che la situazione è veramente
fatta coi piedi!! (W le QT :-) , mi hanno detto che ci sono anche per
Windows, se sono semplici
e potenti come molti dicono mando in culo le MFC, queste ultime per gestire
roba Dialog Based o simili
sono spettacolo ma provate a farci applicazioni grafiche e sono davvero
dolori... :-( ).
Ciao, Max

alla fine ce l'ho fatta: ho fatto un errore assurdo che solo ora ho capito:
ho scoperto che la CreateCompatibleDC crea un DC "monocromatico" (il perchè
non lo so davvero anche se il DC di partenza è a colori), ovviamente io
eseguivo la CreateCompatibleBitmap sul DC compatibile, risultato è che la
bitmap era monocromatica. ho semplicemente creato la bitmap con il DC
originario (quello della finestra che è a colori) e poi l'ho selezionata su
quello compatibile e magia la BitBlt visualizza una bitmap colorata (ma
va?). il risultato che volevo (uno scroll veloce) è raggiunto: la bitmap di
prova è una matrice 1000*1000 pixel settati con colore random (ho proprio
eseguito un doppio ciclo for i,j con la SetPixel sul DC compatibile previa
selezione della bitmap), il DC compatibile e la bitmap sono membri del
CDocument, in OnDraw della CView riseleziono la bitmap nel DC compatibile e
faccio la BitBlt sul DC della finestra, scroll velocissimo. in questo modo
creo una volta sola la bitmap nel CDocument  (ho un pulsante che carica la
bitmap che si disabilita subito dopo e si riabilita con un nuovo documento),
ho poi un pulsante che la visualizza richiamando ondraw in cui c'è solo la
bitblt dell'immagine memorizzata.
non so se avete mai provato in OnDraw con la sola setpixel: lo scorrimento è
assurdamente lento...


 wrote in message
93ctlq$qnc$1...@lacerta.tiscalinet.it...

Allora usare la SetPixel anzichè manipolare direttamente i dati del bitmap
funziona!!
(personalmente non ho ancora capito quando un DC seleziona una bitmap che
BIP succede
di preciso!?!?!).
Scrolling senza BitBlt... non voglio nemmeno immaginarmelo...
Ciao

 Scrolling senza BitBlt... non voglio nemmeno immaginarmelo...
Io invece l'ho visto e ne ho ancora gli incubi.
