Newsgroup: it.comp.programmare.win32
Titolo: problema con GetDC

Ho scritto un funzione che alla pressione di un tasto dovrebbe 
ridisegnarmi alcune bitmap in una finestra...c'è solo un problema: 
invece di ridisegnarmi il tutto nella finestra mi viene ridisegnato 
nell'angolo in alto a sinistra del desktop. chi mi può aiutare? posto il 
codice della funzione!
void repaint(void)
{
int i; /* variabile contatore */
BITMAP bm;
HDC hdc = GetDC(hwnd);
HDC hdcBuffer =CreateCompatibleDC(hdc);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = SelectObject(hdcMem, sfondo);
GetObject(sfondo, sizeof(bm), &bm);
SelectObject(hdcMem, sfondo);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
for (i=0; i<7; i++)
{
SelectObject(hdcMem, mask[i]);
BitBlt(hdc, stone[i].X_POS, stone[i].Y_POS, bm.bmWidth, bm.bmHeight, 
hdcMem, 0, 0, SRCAND);
SelectObject(hdcMem, pietra[i]);
BitBlt(hdc, stone[i].X_POS, stone[i].Y_POS, bm.bmWidth, bm.bmHeight, 
hdcMem, 0,0, SRCPAINT);
};
SelectObject(hdcMem, hbmOld); /*distruzione del DC creato */
DeleteDC(hdcMem);
DeleteDC (hdcBuffer);
ReleaseDC(hwnd, hdc);
Gli stessi passaggi li uso per disegnare quando processo WM_PAINT e 
funzionano perfettamente...lì però uso BeginPaint() anzichè 
GetDC()...può dipendere da questo???
Fabio

Azz! ho riscritto completamente la funzione scopiazzando in giro e 
adesso funziona a dovere ma solo per 8 volte! all'ottava volta che premo 
il pulsante mi da l'errore:
excepion 0xc0000005
address 0x401963
cosa vuol dire? da che dipende? posto la nuova versione della routine
RECT rcClient;
HDC hdc = GetDC(hwnd);
GetClientRect(hwnd, &rcClient);
DrawStone(hdc, &rcClient);
ReleaseDC(hwnd, hdc);
mentre la funzione DrawStone è così:
void DrawStone(HDC hdc, RECT* prc)
{
	int i = 0;
	HDC hdcBuffer = CreateCompatibleDC(hdc);
	HBITMAP hbmBuffer = CreateCompatibleBitmap(hdc, prc->right, prc->bottom);
	HBITMAP hbmOldBuffer = SelectObject(hdcBuffer, hbmBuffer);
	HDC hdcMem = CreateCompatibleDC(hdc);
	HBITMAP hbmOld = SelectObject(hdcMem, sfondo);
	BitBlt(hdcBuffer,0,0,514,317,hdcMem,0,0,SRCCOPY);
	for (i=0 ; i<7; i++)
	{
	SelectObject(hdcMem, mask[i]);
	BitBlt(hdcBuffer, stone[i].X_POS, stone[i].Y_POS, 90, 13, hdcMem, 0, 0, 
SRCAND);
	SelectObject(hdcMem, pietra[i]);
	BitBlt(hdcBuffer, stone[i].X_POS, stone[i].Y_POS, 90, 13, hdcMem, 0, 0, 
SRCPAINT);
	};
	BitBlt(hdc, 0, 0, 514, 317, hdcBuffer, 0, 0, SRCCOPY);
	SelectObject(hdcMem, hbmOld);
	DeleteDC(hdcMem);
	SelectObject(hdcBuffer, hbmOldBuffer);
	DeleteDC(hdcBuffer);
	DeleteObject(hbmBuffer);
}
potete aiutarmi a capire???

C'è di più! appena ho letto il tuo post ho provato la con 
InvalidateRect() ed effettivamente funziona ed è più comoda, però sempre 
all'ottava pressione del tasto mi da lo stesso errore! quindi non 
dipende dalle procedure di disegno, ma da qualcos'altro! però non 
capisco da cosa.... :-(

 mentre la funzione DrawStone č cosě:


Ti ringrazio, ma ho scoperto che le funzioni per il disegno andavano 
alla grande...comunque ho deciso di eliminare quella scritta da me e di 
utilizzare la InvalidateRect() che mi hai suggerito...Molto più comoda e 
veloce ;-) il vero problema stava nel fatto che alcune strutture che 
riempivo di dati poi mi risultavano riempite con dati completamente 
assurdi, generando di conseguenza indirizzi errati..sinceramente non ho 
ancora capito il perchè, mi sono solo limitato a riscrivere le strutture 
semplificandole un po' (tanto mi sono accorto che la maggior parte dei 
membri non mi serviva!) :-p ....ancora grazie comunque!
Fabio