Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: Графика в Windows API
Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


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();
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:53, 19-03-2008 | #2

Название темы: Графика в Windows API