Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как быстро вывести массив точек на экран?

4.8K
23 апреля 2004 года
disorder
17 / / 17.02.2004
Проблема такая:
Есть двумерный массив точек, напирмер DWORD mas[800][600]. В каждом элементе массива содержится цвет пиксела.
Выводить этот массив на экран с помощью SetPixel() слишком медленно. Например так:

CPaintDC dc(this);
for (int i = 0 ; i < 800; i++)
for (int j = 0 ; j < 600; j++)
SetPixel(HDC(dc),i,j,mas[j]);

Есть ли более быстрый способ?
Заранее спасибо!
527
23 апреля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by disorder
Проблема такая:
Есть двумерный массив точек, напирмер DWORD mas[800][600]. В каждом элементе массива содержится цвет пиксела.
Выводить этот массив на экран с помощью SetPixel() слишком медленно. Например так:

CPaintDC dc(this);
for (int i = 0 ; i < 800; i++)
for (int j = 0 ; j < 600; j++)
SetPixel(HDC(dc),i,j,mas[j]);

Есть ли более быстрый способ?
Заранее спасибо!


Посмотри функцию SetDIBits, а вообще советую - лучше переделай в одномерный массив (так в памяти понятней) и точку можно вычислять брать mas[i * 800 + j]. Тогда у тебя будет просто массив сканов. Почитай про битмапы.

4.0K
24 апреля 2004 года
Enygma
34 / / 03.04.2004
Цитата:
Originally posted by disorder
Проблема такая:
Есть двумерный массив точек, напирмер DWORD mas[800][600]. В каждом элементе массива содержится цвет пиксела.
Выводить этот массив на экран с помощью SetPixel() слишком медленно. Например так:

CPaintDC dc(this);
for (int i = 0 ; i < 800; i++)
for (int j = 0 ; j < 600; j++)
SetPixel(HDC(dc),i,j,mas[j]);

Есть ли более быстрый способ?
Заранее спасибо!




StretchDIBits - gde ukazivaesh svoj masssiv...

527
24 апреля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by Enygma



StretchDIBits - gde ukazivaesh svoj masssiv...


VOID *lpBits:!!!:

319
25 апреля 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by pavor

VOID *lpBits:!!!:


ИМХО, рисовать массив точек лучше сначала в памяти в виртуальном контексте, а потом этот виртуальный контекст целиком копировать в реальный.

Посмотри функцию CreateCompatibleBitmap - и все что идет с ней.

Создание виртуального контекста:

Код:
HDC m_memDC;    //l'ecran virtuel
   HBITMAP m_memBitMap;//le bitmap pour l'ecran

   HDC myDC;
   myDC=GetDC(hWnd);

   m_memDC=CreateCompatibleDC(myDC);
   
   int maxX=2000;
   int maxY=1000;

   m_memBitMap = CreateCompatibleBitmap(myDC,maxX,maxY);
   SelectObject ( m_memDC, m_memBitMap );
   PatBlt(m_memDC,0,0,maxX,maxY,WHITENESS);
   ReleaseDC(hWnd,myDC);

Копирование виртуального в реальный:
 
Код:
BitBlt(hdc,0,0,maxX,maxY,m_memDC,iHscrollPos,iVscrollPos,SRCCOPY);
4.8K
25 апреля 2004 года
disorder
17 / / 17.02.2004
Цитата:
Originally posted by xelos

ИМХО, рисовать массив точек лучше сначала в памяти в виртуальном контексте, а потом этот виртуальный контекст целиком копировать в реальный.



Да именно так я и делаю(просто не стал усложнять свой первый вопрос). Но выводить в виртуальный контекст тоже надо быстро. Ну я так понял что это это можно сделать спомощь SetDIBits, только чтобы ее использовать столько всяких структур надо предварительно надо заполнить...

Всем большое спасибо.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог