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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - Графика в Windows API

Ответить
Настройки темы
Win32 API - Графика в Windows API

Новый участник


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

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


Требуется вывести в окно большой массив точек (например 800 на 600). Функцией SetPixel это выводится очень долго. Подскажите пожалуйста, есть ли способ более быстрого вывода?

Отправлено: 23:33, 18-03-2008

 
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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


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

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


pva, а возможны варианты с GDI+? Я видел, что в реальном коде, он принимался где нужна прозрачность, градиент для VB .NET.
И как насчёт OpenGL?

Отправлено: 16:14, 19-03-2008 | #3


Новый участник


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

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


Спасибо за ответ. На самом оказалось что мне не хватало функции ReleaseDC(hWnd,DC). Ее нет в стандартном коде и это сильно запутывает понимание.

Отправлено: 19:10, 19-03-2008 | #4


Новый участник


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

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


Попробуйте использовать функции BitBlt и CreateCompatibleDC. Вторая создаёт виртуальный контекст устройства, на котором и можно рисовать: SetPixel, DrawLine и т.п. После чего копируйте образ из виртуального в обычный контекст с помощью функции BitBlt. Функция BitBlt очень быстрая. На виртуальном контексте тоже всё очень быстро "прорисовывается". Деталей я не помню, но идея именно такая. Удачи.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:17, 20-03-2008 | #5


Ветеран


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

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


podsyp, нечто похожее на DirectXкий z-буфер.

Отправлено: 21:19, 20-03-2008 | #6


Аватара для DillerInc

Обратный инженер


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

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


Раз мы уже начали говорить о графике в win32, то не мог бы кто-то пояснить,чем принципиально отличается GDI от OpenGL?
Например,при создании окна необходимо похоже проинициализировать пиксельный формат с помощью структуры PIXELFORMATDESCRIPTOR.Так вот в ней можно выставить флаг либо PFD_SUPPORT_GDI, либо PFD_SUPPORT_OPENGL...

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 00:01, 21-03-2008 | #7

pva pva вне форума

Аватара для pva

Ветеран


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

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


Цитата Admiral:
возможны варианты с GDI+?
Конечно, ничего невозможного нет, но пиксели выставлять ими нет смысла, там эффективней использовать более сложные примитивы
Цитата podsyp:
Попробуйте использовать функции BitBlt и CreateCompatibleDC
Функция putpixel работает недостаточно быстро даже с memory DC

Отправлено: 07:28, 24-03-2008 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - Графика в Windows API

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Графика в PascalABC verdix Флейм 3 12-10-2010 16:06
[решено] Несоответствие PHP API и Module API Negativ Программное обеспечение Linux и FreeBSD 6 10-04-2007 19:53
Win32 API | Нужна помошь по API функциям! vasika_hk Программирование и базы данных 2 23-05-2006 09:51
Графика в С++ mask Программирование и базы данных 15 04-06-2003 19:51
графика и JavaScript Vlad Drakula Вебмастеру 1 04-03-2003 20:01




 
Переход