Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2012, 00:01   #1
Мастак
Пользователь
 
Регистрация: 24.02.2010
Сообщений: 19
Вопрос Правильная двойная буфиризация.

Как правильно осуществить двойную буферизацию.Из литературы,форумов следует, что надо создать контекст в памяти через функцию CreateCompatibleDC рисовать в нём, а затем через блитинг(bitblt) копировать в основной контекст. И в основном я вижу такой способ , причём везде. Но есть одно, но посмотрите на картинки

Таким способом получается изображение,если всё рисовать всё прямо в контекст отображения

Как мы видим всё прорисованно, изображение цветное, всё гуд, всё замечательно.

А вот пример с двойной буферизацией

Как видим тоже всё замечательно.Все изображения на своих местах, но изображение которое я предворительно отобразил с помощью блитинга в контекст памяти в при выводе на экран представляет чёрный прямоугольник.Тоесть пропорции сохраняются а самого изображения почему то нет.
Перелопатил кучу литературы и решил написать сюда может кто сталкивался с подобным?
Мастак вне форума Ответить с цитированием
Старый 19.04.2012, 00:07   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

на код надо смотреть.

кстати буферизация же есть еще через формат пикселя, см SwapBuffers и флаг формата пикселя PFD_DOUBLEBUFFER.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.04.2012, 00:53   #3
Мастак
Пользователь
 
Регистрация: 24.02.2010
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
на код надо смотреть.

кстати буферизация же есть еще через формат пикселя, см SwapBuffers и флаг формата пикселя PFD_DOUBLEBUFFER.
Я попробовал вышеописанный метод и какие то тормоза.пробовал отключать этот метод как по маслу. Не разбирался почему так, может как то настраивать надо формат пикселя )

Вобщем код не на си но думаю разобраться можно ))


Эта процедура создаёт совместимый контекст с изображением и отображает его в переданный в параметрах контекст.
Image proc hWin:HWND,mainHdc,hdc:HDC
LOCAL hBmp,hOldBmp:HBITMAP,newHdc:HDC
LOCAL rect:RECT

mov hBmp,FUNC(LoadBitmap,hInstance,IDB_ BMP)
mov newHdc,FUNC(CreateCompatibleDC,main Hdc)
mov hOldBmp,FUNC(SelectObject,newHdc,hB mp)

invoke GetClientRect,hWin,addr rect
invoke BitBlt,hdc,1,1,rect.right,rect.bott om,newHdc,0,0,SRCCOPY



invoke DeleteObject,FUNC(SelectObject,newH dc,hOldBmp)
invoke DeleteDC,newHdc
ret

Image endp
Это код сообщения WM_PAINT
LOCAL ps:PAINTSTRUCT
LOCAL hdcNew:HDC
LOCAL hBmpOld:HBITMAP
invoke BeginPaint,hWin,addr ps
mov hdcNew,FUNC(CreateCompatibleDC,ps.h dc)
mov hBmpOld,FUNC(SelectObject,hdcNew,FU NC(CreateCompatibleBitmap,hdcNew,ps .rcPaint.right,ps.rcPaint.bottom))



invoke Image,hWin,ps.hdc,hdcNew




invoke BitBlt,ps.hdc,0,0,ps.rcPaint.right, ps.rcPaint.bottom,hdcNew,0,0,SRCCOP Y
invoke DeleteObject,FUNC(SelectObject,hdcN ew,hBmpOld)
invoke DeleteDC,hdcNew
invoke EndPaint,hWin,addr ps
Мастак вне форума Ответить с цитированием
Старый 19.04.2012, 00:57   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
но изображение которое я предворительно отобразил с помощью блитинга в контекст памяти в при выводе на экран представляет чёрный прямоугольник.Тоесть пропорции сохраняются а самого изображения почему то нет.
Одно из двух, либо в контексте буфера не выбран HBITMAP, либо выбран монохромный.
PS. Пока писал, появился код автора.

PPS.Так и есть - монохромный
Цитата:
mov hBmpOld,FUNC(SelectObject,hdcNew,FU NC(CreateCompatibleBitmap,hdcNew,ps .rcPaint.right,ps.rcPaint.bottom))
Замените hdcNew на ps.hdc

Последний раз редактировалось EUGY; 19.04.2012 в 01:25.
EUGY вне форума Ответить с цитированием
Старый 19.04.2012, 02:34   #5
Мастак
Пользователь
 
Регистрация: 24.02.2010
Сообщений: 19
По умолчанию

Я тоже в какой то момент думал что может быть изображение монохромным, что-то пробовал менять, думал уже через Dib-ы начать делать )))
Спасибо за ответы.Задача решена.Всё нормально теперь отображается )
Мастак вне форума Ответить с цитированием
Старый 19.04.2012, 09:18   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кстати ТС, зачем вы каждую прорисовку грузите картинку из файла?
это достаточно сделать один раз в WM_CREATE(а то и тупо в коде программы, а не обработчика сообщений) и уничтожить в WM_DESTROY.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двойная буферизация в dotNet DimaTs Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 13.12.2011 22:26
Двойная авторизация Ribun Microsoft Office Access 2 15.07.2011 12:53
Двойная шкала на диаграмме mephist Microsoft Office Excel 1 24.03.2010 00:13
Двойная номерация страниц litvin22 Microsoft Office Word 0 18.05.2009 15:04
Двойная буферизация volod3000 Общие вопросы Delphi 4 27.03.2009 00:08