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

Ваш аккаунт

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

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

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

Проблемы с BitBlt ???

1.6K
08 февраля 2005 года
GDragon
67 / / 11.10.2002
Всем привет.
Такая проблема: необходимо создать и отобразить в окне определенный рисунок, причем создается он, во избежание мерцаний, в памяти, а потом вываливается на экран. Делаю следующим образом:

CPaintDC dc(this); // device context for painting

CDC BackBuffer;
CRect EQRect(0, 0, EQ_WIDTH, EQ_HEIGHT);
BackBuffer.CreateCompatibleDC((CDC*)&dc);

CBrush Brush(PaperColor);

BackBuffer.FillRect(LPRECT(EQRect), &Brush);

dc.BitBlt(0, 0, EQ_WIDTH, EQ_HEIGHT, &BackBuffer, 0, 0, SRCCOPY);

(для начала просто залить цветом).
Результат нулевой. Окно цвета не меняет. Если делаю непосредственно:

dc.FillRect(LPRECT(EQRect), &Brush);

то все ок.
Подскажите, в чем проблема?
527
09 февраля 2005 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by GDragon
Всем привет.
Такая проблема: необходимо создать и отобразить в окне определенный рисунок, причем создается он, во избежание мерцаний, в памяти, а потом вываливается на экран. Делаю следующим образом:

CPaintDC dc(this); // device context for painting

CDC BackBuffer;
CRect EQRect(0, 0, EQ_WIDTH, EQ_HEIGHT);
BackBuffer.CreateCompatibleDC((CDC*)&dc);

CBrush Brush(PaperColor);

BackBuffer.FillRect(LPRECT(EQRect), &Brush);

dc.BitBlt(0, 0, EQ_WIDTH, EQ_HEIGHT, &BackBuffer, 0, 0, SRCCOPY);

(для начала просто залить цветом).
Результат нулевой. Окно цвета не меняет. Если делаю непосредственно:

dc.FillRect(LPRECT(EQRect), &Brush);

то все ок.
Подскажите, в чем проблема?


Внимательно прочитай в platform sdk про функцию CreateCompatibleDC. С самого начала там выбрана monochrome bitmap 1x1.
Тебе надо создать битмап (только в др.месте, чтобы ее каждый раз не создавать) например по размеру экрана и совместимую с desktop dc. Затем выбирать ее в buffer dc, рисовать там что угодно ну и использовать bitblt, не забывай выбирать старые объекты обратно в dc.

1.6K
09 февраля 2005 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by pavor

Внимательно прочитай в platform sdk про функцию CreateCompatibleDC. С самого начала там выбрана monochrome bitmap 1x1.
Тебе надо создать битмап (только в др.месте, чтобы ее каждый раз не создавать) например по размеру экрана и совместимую с desktop dc. Затем выбирать ее в buffer dc, рисовать там что угодно ну и использовать bitblt, не забывай выбирать старые объекты обратно в dc.


Ок, уже разобрался. Все оказалось проще, нужно было создать CompatibleBitmap и передать его в CompatibleDC. Изображение рисуется в буфере COLORREF и передается в Bitmap.
Вот рабочий вариант, кому интересно:

CPaintDC dc(this); // device context for painting

CDC BackBuffer;
BackBuffer.CreateCompatibleDC((CDC*)&dc);

CBitmap *OldBitmap, NewBitmap;
NewBitmap.CreateCompatibleBitmap((CDC*)&dc, EQ_WIDTH, EQ_HEIGHT);
OldBitmap = BackBuffer.SelectObject(&NewBitmap);

//Здесь создается и заполняется массив COLORREF Buffer

NewBitmap.SetBitmapBits(EQ_WIDTH * EQ_HEIGHT * sizeof(COLORREF), (void*)Buffer);

dc.BitBlt(0, 0, EQ_WIDTH, EQ_HEIGHT, &BackBuffer, 0, 0, SRCCOPY);

BackBuffer.SelectObject(OldBitmap);

527
10 февраля 2005 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by GDragon

Ок, уже разобрался. Все оказалось проще, нужно было создать CompatibleBitmap и передать его в CompatibleDC. Изображение рисуется в буфере COLORREF и передается в Bitmap.
Вот рабочий вариант, кому интересно:

CPaintDC dc(this); // device context for painting

CDC BackBuffer;
BackBuffer.CreateCompatibleDC((CDC*)&dc);

CBitmap *OldBitmap, NewBitmap;
NewBitmap.CreateCompatibleBitmap((CDC*)&dc, EQ_WIDTH, EQ_HEIGHT);
OldBitmap = BackBuffer.SelectObject(&NewBitmap);

//Здесь создается и заполняется массив COLORREF Buffer

NewBitmap.SetBitmapBits(EQ_WIDTH * EQ_HEIGHT * sizeof(COLORREF), (void*)Buffer);

dc.BitBlt(0, 0, EQ_WIDTH, EQ_HEIGHT, &BackBuffer, 0, 0, SRCCOPY);

BackBuffer.SelectObject(OldBitmap);



Я тебе просто сказал, что каждый раз создавать в обработчике dc и bitmap как минимум плохой стиль.

1.6K
10 февраля 2005 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by pavor


Я тебе просто сказал, что каждый раз создавать в обработчике dc и bitmap как минимум плохой стиль.


12 раз в секунду - это не критично. Впрочем, согласен, есть простор для оптимизации.

10K
10 февраля 2005 года
ShadowZ
3 / / 09.02.2005
Цитата:
Originally posted by GDragon

12 раз в секунду - это не критично. Впрочем, согласен, есть простор для оптимизации.



Ребята... А вы вообще про __asm { ... } что-нибудь слышали... Вот и оптимизируйте ... У меня на проце 1,9 Гц 89 кадров/сек как делать нечего :)
С уважением, -: ShadowZ :-

1.6K
10 февраля 2005 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by ShadowZ


Ребята... А вы вообще про __asm { ... } что-нибудь слышали... Вот и оптимизируйте ... У меня на проце 1,9 Гц 89 кадров/сек как делать нечего :)
С уважением, -: ShadowZ :-


asm не избавляет от возни с ДевайсКонтекстом, это тебе не старый добрый DOS. При создании же битмэпа выигрыш по времени при так смехотворен, что даже возиться не хочу.

1,9 Гц??? Это круто, чувак! :D Он у тебя на электромагнитных реле, видать :)

10K
10 февраля 2005 года
ShadowZ
3 / / 09.02.2005
Цитата:
Originally posted by GDragon

asm не избавляет от возни с ДевайсКонтекстом, это тебе не старый добрый DOS. При создании же битмэпа выигрыш по времени при так смехотворен, что даже возиться не хочу.

1,9 Гц??? Это круто, чувак! :D Он у тебя на электромагнитных реле, видать :)



Имеется ввиду 1,9 ГИГАгерц...:P А про встроенный в C++ ассемблер ты зря так... Вещь отличная... Стандартные Сишные (то бишь директовские) функции и процедуры тьфу... Не зря же все движки пишутся на 60-70% на asm... :!!!: :}

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