|
║XLR8║
|
|||||||
Двойная буферизация и WIN32 (GDI).18.12.2011, 18:23. Показов 16026. Ответов 10
Метки нет (Все метки)
В MSDN написано:
Это был первый вопрос, второй: когда перетаскиваешь окно мерцание все-таки видно, можно ли как-то укорить процесс копирование информации с буфера в буфер? Например, просто свопать ссылки на буфера. Третий вопрос: если создавать контекст через GetDC() и выделять под него буфер, тогда задний фон черного цвета, как его можно поменять? Заранее благодарен за помощь.
0
|
|||||||
| 18.12.2011, 18:23 | |
|
Ответы с готовыми решениями:
10
Двойная буферизация в gdi+ Двойная буферизация
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 18.12.2011, 18:40 | |
|
да вроде нормальная буфериция у вас. эффект мерцания наверно из-за того, что перед сообщением WM_PAINT идет сообщения об отчистке окна с целью зарисовать все фоном. это отменяется. правда не помню как. либо вставить свой обработчик, который ничего не делает, либо это как-то стилем окна выставляется. дефолтный фон у дс - хз. когда делал подобную штуку явно заливал дс нужным цветом.
http://msdn.microsoft.com/en-u... S.85).aspx - попробуйте для этого сообщения свой ничего не делающий обработчик вставить.
0
|
|
|
║XLR8║
|
|||||||
| 18.12.2011, 19:52 [ТС] | |||||||
|
Ответьте на первый вопрос пожалуйста, я с таймером никак разобраться не могу.. Добавлено через 45 минут Всем спасибо, вот что у меня вышло:
1
|
|||||||
|
589 / 96 / 6
Регистрация: 24.01.2009
Сообщений: 379
|
||||||
| 19.12.2011, 04:00 | ||||||
|
Все вроде нормально, только в функции BitBlt нужно использовать структуру paintStruct, иначе зачем мы передаем в нее прямоугольник через функцию InvalidateRect:
1
|
||||||
|
║XLR8║
|
|||||||||||
| 19.12.2011, 20:04 [ТС] | |||||||||||
|
Dimazzzzzz, у меня к тебе будет пара вопросов:
1. Следующий участок кода закрашивает область в белый, как залить вспомогательный буфер областью памяти из текущего представления и рисовать поверх (или как дополнительный контекст залить данными с контекста окна) и как просто задать цвет фона при создании вспомогательного буфера?
3. Меня интересует создание буфер под кондекст, а именно что означают ширина и высота в параметрах HBITMAP CreateCompatibleBitmap(HDC hdc, int nWidth, int nHeight); на MSDN не нашел внятного ответа. Если мы создадим буфер под вспомогательный контекст 100 пикселов, а рисовать будем вне его пределах что тогда произойдет. Только что посмотрел, часть которая не попадает в область буфера просто обрезается, причем если надо отрисовать полосу от 20 до 40 пикселов, надо создавать буфер размером 40, т.к. он начинается с 0, как выделять буфер под конкретную область не с начала координат? Добавлено через 24 минуты Вот что вышло для перерисовки:
0
|
|||||||||||
|
589 / 96 / 6
Регистрация: 24.01.2009
Сообщений: 379
|
|
| 19.12.2011, 20:05 | |
|
1. Функция Rectangle создает прямоугольник с рамкой, нарисованной текущим Pen'ом и заливается текущей Brush'ю. Если нужно просто закрасить какой-то участок, то лучше использовать функцию FillRect ().
2. В структуре paintstruct будет содержаться прямоугольник, на контексте ОКНА, который нужно перекрасить. При вызове функции InvalidateRect мы сами задаем этот прямоугольник, а при перекрытии окон, его задает система. Зачем нам проверять размеры прямоугольника, если вспомогательный буфер будет по размерам такой же, как и основное окно? Геморой возникнет, когда тебе нужно изменять размеры окна, тогда нужно налету создавать новый буфер под новые размеры и копировать туда со старого или перерисовывать заново. Хотя можно изначально создать достаточно большой буфер (например, 1600х1200) и создать механизм масштабирования при копировании и кликанье мышью на картинке. В таком случае нужно будет использовать не BitBlt, а StretchBlt в обработчике WM_PAINT. Главное не перепутать указание координат прямоугольника: во второй функции указываются координаты углов, а не размеры. В любом случае, тот прямоугольник, который в момент обработки WM_PAINT находится в структуре paintstruct, выражает именно ту область основного окна, которую надо перекрасить. А каким образом это сделать, это уже решать тебе. 3) Все правильно ты нашел: те точки, которые не влезают в наш bitmap, будут просто откидываться. Начало координат находится в верхнем левом углу и начинается с нуля.
1
|
|
|
║XLR8║
|
|
| 19.12.2011, 20:17 [ТС] | |
|
Ок, поставлю вопрос так: если нам надо перерисовывать область (20,20):(40,40) мы можем создать буфер размером 40 и туда все рисовать, если это уже (1020,1020):(1040,1040) все уже не так хорошо, так как куча памяти идет в никуда, а ведь нужно просто квадрат 20х20.
И еще буфер создается мной для каждого элемента UI и он прорисовывает себя, затем говорит перерисовать себя элементам на нем, они в свою очередь своим и т.д. Каждый элемент имеет свой буфер, если нужно прорисовать он просто копирует свой буфер в общий буфер (буфер всего окна), и если этот элемент находится далеко и занимает мало места и таких не мало, тогда уже приходиться худо, вот к чему я веду.
0
|
|
|
589 / 96 / 6
Регистрация: 24.01.2009
Сообщений: 379
|
|
| 20.12.2011, 01:31 | |
|
В любом случае размер промежуточного буфера должен совпадать с размером окна, т.к. это как бы копия одного и того же.
Если я правильно понял, ты хочешь узнать зачем создавать большой bitmap, если то, что нужно нам на нем, будет маленькое и незаметное где-нибудь в уголке? На картинке посмотри, как происходит процесс. Этот промежуточный буфер содержит то, что нужно рисовать в окне. Но рисунок на окне постоянно нужно восстанавливать и сделать это можно двумя способами: - либо рисовать заново, высчитывая всё - либо просто скопировать с буфера нужный кусок (наш выбор )То, каким образом и что ты будешь рисовать, копировать на этом буфере, это не важно. Если у тебя одна маленькая картинка, которую ты постоянно рисуешь в окне (и в буфере разумеется тоже), то ты можешь хранить ее в одном маленьком bitmap'e. Если у тебя свой графический интерфейс со кучей нарисованных кнопок, то не нужно для каждой из них создавать отдельный контекст и буфер, можно уместить всё на одном (вспомни старые спрайтовые игры, где много мелких игровых картинок рисовались на одной. Хотя и в любой современной программе все элементы интерфейса, как правило, рисуют на одной картинке) и создать механизм копирования нужного маленького квадратика на промежуточный буфер с этого большого холста.
1
|
|
| 18.01.2012, 16:38 | |||
|
1
|
|||
|
589 / 96 / 6
Регистрация: 24.01.2009
Сообщений: 379
|
||
| 18.01.2012, 19:00 | ||
|
0
|
||
| 18.01.2012, 19:00 | |
|
Помогаю со студенческими работами здесь
11
Двойная буферизация графики Двойная буферизация, мерцание Двойная буферизация не работает Двойная буферизация консоли Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|