Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 749
#1

двойная буферизация - C++

05.07.2011, 20:04. Просмотров 2720. Ответов 8
Метки нет (Все метки)

Здравствуйте. Ребят не сочтите за труд, помогите разобраться. Проблема собственно вот в чём:
Пишу тетрис, в окошке находится стакан с фигурами, а на фоне нужно чтобы была некая картинка.
Сначала всё сделал с выводом прямо на экран, но столкнулся с миганием окна.
Теперь пробую через двойную буферизацию, но, после показа первого расположения падающей фигурки экран совсем не меняется.
Вот код прорисовки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
case WM_CREATE:
        space_bmp = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
        break;
 
 
case WM_PAINT:
    {
        RECT rect;
        GetClientRect(main_hWnd,&rect);
        HBITMAP hMemBmp;
            
        hdc =  BeginPaint (main_hWnd,&ps);
        memdc = ::CreateCompatibleDC(hdc); // создаю контекст в памяти
        hMemBmp = CreateCompatibleBitmap(hdc, // совместимый битмап
                GetDeviceCaps(hdc, HORZRES), 
                GetDeviceCaps(hdc, VERTRES));
            
    // дальше нужно чтобы совместимый битмап в памяти содержал моё изображение  space_bmp
    // чтобы потом уже на нём прорисовывать
        hMemBmp = space_bmp;
 
        ::SelectObject(memdc,hMemBmp); // контекст в памяти получает совместимый битмап
        
        
        // .......
        // ....... здесь выполняю перерисовку стакана. Всё рисую в memdc
        // ....... 
 
    // теперь вывожу на экран
    BitBlt(hdc, 0, 0, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), memdc, 0,0, SRCCOPY);
        
    DeleteObject(hMemBmp);
    DeleteDC(memdc);
    EndPaint(hWnd, &ps);
    break;  
    }
Если закоментировать строку 20 hMemBmp = space_bmp;, то всё работает отлично, не мигая, но на чёрном фоне! что не есть хорошо.
Не могу понять почему не обновляется экран когда подгружаю фоновую картинку?
Миниатюры
двойная буферизация   двойная буферизация  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2011, 20:04     двойная буферизация
Посмотрите здесь:

двойная буферизация - C++
можете помочь мне нужен простой пример двойной буферизации а то уже второй день не могу разобраться...и если можно прокоментированый код....

двойная сортировка - C++
Необходимо отсортировать массив, как показано на рисунке, используя класс/структуру с двумя переменными а (левая колонка) и б (правая...

Двойная сумма на C++ - C++
Есть такое вот задание: \sum_{i=1}^{n-1} \sum_{j=1}^{n-1} x/(i+j) (В условии есть и произведение, но его скидывать не стал, так как...

Двойная диспетчеризация :) - C++
Здорова! Я тут от пытаюсь понять такое понятие взаимодействия классов или хз как назвать, вообщем что такое двойная диспетчеризация. Так...

двойная табуляция - C++
Здравствуйте. Помогите написать функцию. Есть таблица в ней, заполненные столбцы и пустые. Программа записывает в пустые столбцы значения...

Консольная двойная буферирзация - C++
Подскажите как реализовать двойную реализацию в консоли. Допустим у меня бесконечный цикл while(true) cout<<"hello"; ...

Двойная загрузка файла - C++
Помогите понять, в чем тут дело. Код пишу в среде QT Creator под OS X, компилятор - CLang. При компиляции такого кода, появляется ошибка...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
05.07.2011, 20:24     двойная буферизация #2
Первым же вызовом DeleteObject ты удаляешь space_bmp, потому что hMemBmp = space_bmp.
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 749
05.07.2011, 20:40  [ТС]     двойная буферизация #3
Цитата Сообщение от Somebody Посмотреть сообщение
Первым же вызовом DeleteObject ты удаляешь space_bmp, потому что hMemBmp = space_bmp.
Somebody, я удаляю hMemBmp, и то после того как выполню всю прорисовку. При следующей генерации WM_PAINT, опять помещаю копию space_bmp в hMemBmp. По идее новая наложеная картинка должна стирать ранее существующую, но не стирает.
Мне кто нибудь может пояснить почему при пустом битмапе в контексте (т. е. hMemBmp) - всё нормально работает. А если копировать туда картинку (space_bmp), то ни фига!
Может я что-то не так делаю?

Добавлено через 5 минут
Цитата Сообщение от Somebody Посмотреть сообщение
Первым же вызовом DeleteObject ты удаляешь space_bmp, потому что hMemBmp = space_bmp.
Somebody, возможно вы поняли так, что фоновая картинка пропадает и потом всё происходит на чёрном фоне? Нет, просто если копировать в hMemBmp копию space_bmp, окно совсем не обновляется.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
05.07.2011, 21:33     двойная буферизация #4
Цитата Сообщение от jonson Посмотреть сообщение
Somebody, я удаляю hMemBmp, и то после того как выполню всю прорисовку. При следующей генерации WM_PAINT, опять помещаю копию space_bmp в hMemBmp
Никакой копии больше нет. То, что было создано при WM_CREATE было удалено при первом же вызове WM_PAINT. Нет больше картинки. А вот тот битмап, что создан в строке 14 остался неудалённым. По сути, вот эта операция:
C++
1
hMemBmp = space_bmp;
как раз и некорректна. Она не копирует space_bmp в hMemBmp, как Вы рассчитываете.

Добавлено через 4 минуты
В общем копировать надо битмапу. По-настоящему копировать, а не присваивать.
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 749
05.07.2011, 21:41  [ТС]     двойная буферизация #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
В общем копировать надо битмапу. По-настоящему копировать, а не присваивать.
grizlik78, если копировать в контекст именно space_bmp, т.е.
C++
1
::SelectObject(memdc,space_bmp);
То тогда получается вот такой вывод на экран. Т.е. новая картинка не затирает старую!
Миниатюры
двойная буферизация  
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 749
05.07.2011, 21:46  [ТС]     двойная буферизация #6
а при копировании в memdc пустого hMemBmp, как я понимаю, после создания он(совместимый битмап) содержит полностью черный цвет. Так вот, он то, черным цветом заливает прежнюю картинку.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
05.07.2011, 21:48     двойная буферизация #7
Не, в этот контекст рисовать не надо, я сначала так написал, но понял, что ошибся. Надо именно создать совместимый битмап для рисования, а в него скопировать фоновую картинку. Как это сделать правильно с ходу не скажу. На ум приходит только второй контекст в памяти, с выбранным фоном, из которого копируем в первый, затем рисуем в первом и уже после копируем на устройство. Но это как-то громоздко. Надо поискать.
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 749
05.07.2011, 22:33  [ТС]     двойная буферизация #8
Цитата Сообщение от grizlik78 Посмотреть сообщение
На ум приходит только второй контекст в памяти, с выбранным фоном, из которого копируем в первый,
grizlik78, спасибо за совет, всё получилось.

Добавлено через 36 минут
grizlik78, ээээм, всё-же есть ещё одна маленькая деталь. Окно где выводится колличество очков, оно вот мигает, почему на него не действует двойная буферизация?
его делаю так:
C++
1
2
wnd.score = CreateWindow("static", "0" ,
        SS_CENTER| WS_CHILD | WS_VISIBLE,348,130,135,30,main_hWnd,0, hInstance,0);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2011, 22:39     двойная буферизация
Еще ссылки по теме:

Двойная алгебраическая сумма (сигма) - C++
Есть условие: y=\sum_{i=1}^{n-1} \sum_{j=1}^{n-1} x/(i+j) И есть код: #include <cstdlib> #include <iostream> using namespace std; ...

Указатели. Матрица и двойная косвенная адресация - C++
При метке 4, косяк..не могу понять..что-то с указателем? Помогите пожалуйста.. #include<stdio.h> #include<locale.h> ...

Помощь по задаче(структура, двойная сортировка) - C++
В общем, парни, совсем запутался и запарился) нужна помощь по этой задаче: 11. Сформировать массив структур, каждый элемент которого...

Двойная кавычка как значение символьной переменной - C++
Требуется вычистить строку от двойных кавычек. Строка состоит из широких символов. Как бы я ни объявлял кавычку - wchar_t ch = '"'; ...

Двойная буферизация - C#
Надо включить двойную буферизацию в приложении. на MSDN написано, что это делается так: DoubleBuffered = true; или так: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
05.07.2011, 22:39     двойная буферизация #9
У этого окна небось свой обработчик со своей функцией перерисовки?

Не по теме:

Я-то откуда знаю? У меня линукс вообще

Yandex
Объявления
05.07.2011, 22:39     двойная буферизация
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru