Newsgroup: it.comp.programmare.win32
Titolo: Cosa vuol dire che non tutti i DC supportano BitBlt?

ciao.
Ho un problema con BitBlt e non capisco a cosa sia dovuto.
Una mia applicazione (VC++6.0) sul mio PC (Win2k) va benissimo.
Per scrupolo l'ho provata da amici su Win95 e WinME e WinXP.
Su WinXP bene.
Su Win95 e WinME questo problema:
OnDraw non mi ridisegna il contenuto della finestra.
Sembrerebbe che non funzioni il trasferimento di Bitmap.
Vi posto parte del codice:
void CMiaAppView::OnDraw(CDC* pDC)
{
    CDC mDC;
    CBitmap bmp;
    mDC.CreateCompatibleDC(pDC);
    CSize size;
    size = pDC->GetWindowExt();
    bmp.CreateCompatibleBitmap(pDC, 
size.cx
, 
size.cy
);
    mDC.SelectObject(&bmp);
    SetViewScale_mDC(&mDC);    // Imposta le unità di misura video
    DisegnaTutto(&mDC);
    pDC->BitBlt(0, 0, 
size.cx
, 
size.cy
, &mDC, mDC.GetWindowOrg().x,
mDC.GetWindowOrg().y, SRCCOPY);
}
BitBlt non fa niente!
Spulciando su MSDN CDC::BitBlt ho trovato questo:
Note that not all device contexts support BitBlt. To check whether a given
device context does support BitBlt, use the GetDeviceCaps member function
and specify the RASTERCAPS index.
Ok, potrebbe essere questo!
Ma non mi è chiaro. Cosa vuol dire che non tutti i DC supportano BitBlt?
E soprattutto come faccio a risolvere il mio problema?
Grazie a chiunque mi possa dare un po' della sua "luce".
ciao
DANILO


il problema probabilmente è un altro, infatti i dc che non supportano il
bitblt sono quelli relativi a periferiche come plotter o altre, ma non certo
il monitor
Pela

 and specify the RASTERCAPS index.
Trovo piu` plausibile che si tratti di un problema di dimensioni massime
del bitmap che devi blittare, o cose del genere dovute alle limitazioni
del motore GDI di Windows 9x. Prova a chiamare GetLastError() dopo avere
fatto il blit e controlla il codice di errore.
--
Lorenzo

 fatto il blit e controlla il codice di errore.
Grazie.
Purtroppo sul mio PC ho soloWin2k e da me nessun problema.
Che palle!

 }
Ho trovato l'inghippo!
(... grazie Lorenzo!)
Ora vi spiego, ...magari ci sbatte qualcun'altro...
Il problema sta nelle dimensioni della bitmap che creo in
bmp.CreateCompatibleBitmap(pDC, 
size.cx
, 
size.cy
);
Quando la bitmap ha dimensioni troppo grandi (per esempio 
size.cx
=2040
size.cy
=2800) il motore GDI di Win9x fallisce e infatti l'istruzione sopra
mi ritorna FALSE. (NB: Solo Win9x fallisce!!!!!!!!!)
Nella mia applicazione ho risolto cosi:
void CMiaAppView::OnDraw(CDC* pDC)
{
    CDC mDC;
    CBitmap bmp;
    mDC.CreateCompatibleDC(pDC);
    CSize size;
    size = pDC->GetViewportExt();
    bmp.CreateCompatibleBitmap(pDC, 
size.cx
, 
size.cy
);
    mDC.SelectObject(&bmp);
    SetViewScale_mDC(&mDC);    // Imposta le unità di misura video
    DisegnaTutto(&mDC);
    pDC->BitBlt(0, 0, pDC->GetWindowExt().cx, pDC->GetWindowExt().cy, &mDC,
mDC.GetWindowOrg().x, mDC.GetWindowOrg().y, SRCCOPY);
}
GetViewportExt() retrieves the x- and y-extents of the device context's
viewport
che normalmente sono dimensioni più piccole di cio' che restituisce
GetWindowExt()
Però tranne quando ho uno zoom elevato (eh si ... gestisco anche lo zoom).
In questo caso non posso utilizzare la bitmap e sono costretto a disegnare
il tutto direttamente in pDC.
Bruttissimo.... ma va bene cosi'.
Quindi in OnDraw, in funzione del livello di zoom, disegno tutto o
attraverso mDC e poi blitto (come sopra)
o direttamente attraverso pDC.
.... è tutto un equilibrio, sopra la follia
...sopra la FOLLIA!
...dadabadan...
ciao.
DANILO