Newsgroup: it.comp.programmare.win32
Titolo: Non riesco a far funzionare BitBlt()...

Salve a tutto il NG!
Spero possiate aiutarmi in questo piccolo problema... ho provato e
riprovato, ho letto gli esempi e funzionano tutti ma non capisco dove
sbaglio, ho chiesto in giro e la risposta piu' valida che ho trovato
e' "passa alle DirectX". Oltre al fatto che le DX mi sembrano una
complicazione inutile, e il mio programma non ne ha bisogno, mi sembra
un modo di risolvere i problemi... comunque, ecco il mio probbbbblema:
[uso Visual C++ 6.0]
Creo una nuova applicazione single-window MFC. Nella funzione
CChildWindow::OnPaint() ci metto questo:
(spero che non ci siano errori di compilazione, e' un collage di pezzi
di codice che ho scritto)
void CChildView::OnPaint() 
{
	CPaintDC dc(this);
 
	CDC* wndDC = GetDC();  // DC della finestra
	CRect rect;
	GetWindowRect(&rect);
	CDC memDC;             // DC virtuale
	memDC.CreateCompatibleDC(wndDC);
	CDC* pDC = wndDC;  // Puntatore a un DC, virtuale o della
                           // finestra. 
	// Questo dovrebbe disegnare un rettangolo rosso.
	{
		CBrush redBrush(0x000000ff);
 
		CRgn myRgn;
		myRgn.CreateRectRgn(50, 50, 100, 200);
		pDC->FillRgn(&myRgn, &redBrush);
	}
	// La funzione origine delle mie bestemmie.
	wndDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0,
SRCCOPY)
}
La funzione disegna un rettangolo rosso sul DC puntato da pDC. Se pDC
= wndDC, tutto ok, il rettangolo appare felicemente. Se invece pDC =
&memDC, visivamente non succede assolutamente niente. Immagino che il
rettangolo rosso venga effettivamente disegnato sul DC virtuale, se e'
vero che e' compatibile a quello della finestra. Intanto la BitBlt()
non fa proprio nulla, nulla di nulla. Non copia un'immagine bianca
perche' altrimenti il rettangolo non apparirebbe nemmeno quando pDC =
wndDC.
Perche BitBlt() non fa nulla?
Grazie un milione!
-- 
er Cicca
er underscore cicca at freemail dot it
Windows XP. Ora puoi bestemmiare.

 Grazie un milione!
ciao

ciao
Ciao a te!


 >> }
qui in realtà non blitti niente perchè  memdc nella funzione è il dc
sorgente e il questo momemto non contiene nulla
infatti se non chiami la funzione il rettangolo rosso c'è comunque:quello
viene disegnato in pDC->FillRgn(&myRgn, &redBrush);
dopo la creazione del memdc devi creare un cbitmap compatibile e
selezionarlo nel memdc
CBitmap hBmp;
 hBmp.CreateCompatibleBitmap(wndDC,rect.Width(),rect.Height());
 memDC.SelectObject(hBmp);
ora puoi diregnare il rettangolo e dopo quando blitti devi usare come dc
destinazione quello della finestra
wndDC->BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0,
  SRCCOPY);
ciao
p.s.
per non avere brutte sorprese pulisci il memdc prima di disegnarci e
blittarlo sullo
schermo
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), NULL, 0, 0,
  WHITENESS);

ciao
Che dire... FUNZIONAAAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!! :))
Pero' vedo qualcosa di non tanto bello: quando ridimensiono la
finestra (premetto che ho il "ridimensionamento dinamico" attivo,
insomma la finestra si ridisegna mentre trascino), il rettangolo rosso
sfarfalla in bianco... credo che questo sia dovuto al fatto che
Windows o qualcosa nella mia app pulisce la finestra (in bianco,
appunto) e poi mi ci fa disegnare. Non e' possibile invece disegnare
direttamente sul disegno che c'era prima?
Grazie ancora


 Grazie ancora
ciao