1. определись, совместимый код будет или быстрый (не на много)
2. определись как часто будешь переисовываться
3. определись с глубиной цвета (8/16/32 bpp)
дальше варианты выбора:
1. используешь функции GDI или DirectX
2. если GDI, то CreateDIBitmap (типа кэширование) либо SetDIBitsToDevice
3. подстрой свой алгоритм под глубину цвета
Код:
class DrawScreen
{
enum {
scr_width = 800, scr_height=600
};
long screen_[scr_width*scr_height];
BITMAPINFOHEADER bmi_;
public:
DrawScreen();
long& pixel(int x, int y) {return screen_[max(0,min(x, scr_width)) + scr_width*max(0,min(y, scr_height))];}
long& pixel_(int x, int y) {return screen[x + scr_width*y];}
void show();
static long Rgb(int r, int g, int b) {return max(0,min(255,r)) | (max(0,min(255,g))<<8) | (max(0,min(255,g))<<16);}
}
DrawScreen::DrawScreen() : screen_(), bmi_()
{
bmi_.biSize = sizeof(bmi_);
bmi_.biWidth = scr_width;
bmi_.biHeight = scr_height;
bmi_.biPlanes = 1;
bmi_.biBitCount = 32;
}
void DrawScreen::show()
{
HDC dc = GetDC(0);
SetDIBitsToDevice(dc, 0, 0, scr_width, scr_height, 0, 0, 0, scr_height, screen_, (BITMAPINFO*)&bmi_, DIB_RGB_COLORS);
ReleaseDC(0, dc);
}
// рисуем:
DrawScreen screen;
for (int x=0; x<800; ++x) screen.pixel(x, 10) = DrawScreen::Rgb(x, 255-x, 128-x);
screen.show();