Цитата
Пните меня в нужном направлении, как это может мне помочь очищать окно?
Очищать нужно не окно, а внеэкранный буфер.
BitBlt копирует с одного HDC на другой, один из них - DC вашего окна, другой - DC битмапа, который можно создать с помошью функции CreateDIBSection, вот пример:
Код
COLORREF *ScreenBuffer;
ScreenBuffer = (COLORREF *)malloc(SCREEN_H*SCREEN_W*4);
hdcDest=GetDC(Handle);
bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth=SCREEN_W;
bmi.bmiHeader.biHeight=SCREEN_H;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=32;
bmi.bmiHeader.biCompression=BI_RGB;
bmi.bmiHeader.biSizeImage=0;
bmi.bmiHeader.biClrUsed=0;
bmi.bmiHeader.biClrImportant=0;
hdcSrc=CreateCompatibleDC(NULL);
BitMap=CreateDIBSection(hdcSrc,&bmi,DIB_RGB_COLORS,&(void *)ScreenBuffer,NULL,0);
SelectObject(hdcSrc,BitMap);
/*здесь рисуем в ScreenBuffer
.................................*/
//А теперь копируем буфер на окно
BitBlt(hdcDest,0,0,SCREEN_W,SCREEN_H,hdcSrc,0,0,SRCCOPY);
ScreenBuffer - выделенный блок памяти размером SCREEN_W*SCREEN_H*biBitCount/8 байт.
biBitCount - определяет количество битов на точку для нашего буфера (а не для окна), т.е. не зависит от текущего граф. режима видеокарты.
если biBitCount == 32, то формат цвета соответствует стандартному COLORREF.
Чтобы поставить точку с координатами 10,10 делаем так:
Код
ScreenBuffer[10+10*SCREEN_W]=color;
Соответственно, по окончании необходимо удалить все, что насоздавали:
Код
DeleteObject(BitMap);
DeleteDC(hdcSrc);
free(ScreenBuffer);
Да, и еще - создавать и удалять буферы и битмапы надо при старте и закрытии приложения соответственно, а алгоритм отрисовки одного кадра такой:
1. Заполняем ScreenBuffer цветом фона
2. Рисуем все что нужно
3. Делаем BitBlt
Если возникает мерцание, то перед 3. надо дождаться обратного хода луча монитора, как это сделать сейчас не скажу, ибо не помню