Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 12.11.2022
Сообщений: 1

Двойная буферизация

12.11.2022, 23:44. Показов 1245. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мерцания вроде бы прекратились(на мой взгляд), но при изменении размера окна, появляются черные полосы. Что я делаю не так?
C++
1
2
3
4
5
6
7
8
9
case WM_CREATE:
    {
        RECT clientRect;
        GetClientRect(hwnd, &clientRect);
        hdc = GetDC(hwnd);
        hMdc = CreateCompatibleDC(hdc);
        hBmpFrame = CreateCompatibleBitmap(hdc, clientRect.right, clientRect.bottom);
        SelectObject(hMdc, hBmpFrame);
///
C++
1
2
3
4
5
6
7
    case WM_SIZE:
    {
        RECT w;
        GetClientRect(hwnd, &w);
        hBmpFrame = CreateCompatibleBitmap(GetDC(hwnd), w.right, w.bottom);
    }
    return 0;
C++
1
2
3
4
5
6
7
8
case WM_PAINT:
        PAINTSTRUCT ps;
        RECT clientRect;
        GetClientRect(hwnd, &clientRect);
        hdc = BeginPaint(hwnd, &ps);
        BitBlt(hdc, 0, 0, clientRect.right, clientRect.bottom, hMdc, 0, 0, SRCCOPY);
        EndPaint(hwnd, &ps);
    return 0;
Вычисление вынесены в отдельный поток:
C++
1
2
3
4
5
6
7
        RECT clientRect;
        GetClientRect(hwnd, &clientRect);
        SelectObject(hMdc, hBmpFrame);
        HorizontalGradient(hMdc, clientRect, bckGrn, nbckGrn);
        PaintLines(hMdc, clientRect.right, clientRect.bottom);
        PaintFigures(hMdc, clientRect.right, clientRect.bottom);
        InvalidateRect(hwnd, NULL, TRUE);
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2022, 23:44
Ответы с готовыми решениями:

Двойная буферизация
Добрый день! Имеется обычное оконное приложение Win32, необходимо реализовать при рисовании механизм двойной буферизации. Вот мой код, по...

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

Двойная буферизация
Написал тетрис (но только с палочками (друг попросил сделать =) )) Писал на чистом WinAPI, в WM_PAINT происходит сначала отрисовка...

1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
13.11.2022, 11:12
Лучший ответ Сообщение было отмечено rbleidd как решение

Решение

Всё рисование идёт в два этапа.
1. Сначала рисуется фон кистью которую вы указали при регистрации класс окна.
2. Затем вы обрабатываете WM_PAINT и рисуете на окне.

Это выглядит так, как будто сначала всё стирается, а потом рисуется. Чтобы не мерцало, вам необходимо взять под контроль процесс обновления фона и рисования.

1. При регистрации класса окна для кисти ставите значение NULL, обновление фона всё равно не понадобится.
2. В обработчике сообщения WM_ERASEBKGND просто возвращайте TRUE.
3. Рисовать следует в контексте устройства в памяти, который создаётся через CreateCompatibleDC.
4. После того, как рисование завершено, вам необходимо сообщить окну, что его поверхность недействительна и её нужно обновить (InvalidateRect).
5. В обработчике WM_PAINT просто копируете из hDC памяти в hDC окна нужный прямоугольник функцией BitBlt. Вам не нужно каждый раз получать размеры клиентской области, координаты прямоугольника обновления лежат в поле rcPaint структуры PAINTSTRUCT.
6. В обработчике WM_SIZE необходимо объявить окно недействительным (InvalidateRect), пересчитать размер сцены и пересоздать контекст памяти, если у вас размеры не совпадают.

https://www.cyberforum.ru/blog... g6972.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2022, 11:12
Помогаю со студенческими работами здесь

Двойная буферизация в gdi+
Не могу разобраться, как правильно ее сделать. Есть функция: void createImage(wchar_t *path, int _abscissa, int _ordinate,...

Двойная буферизация графики
Дабы избавиться от мерцания изображения(фоновое изображение + побочные элементы + текс) прибегнул к использованию буферизации, проблема с...

Двойная буферизация, мерцание
Всем привет! Пишу просто графическое приложение на чистом WinApi и никак не могу разобраться с двойной буфферизацией. Попробовал...

Двойная буферизация консоли
У меня есть консольная программа(что-то типа игры) с картой, когда эта карта воспроизводится во время перемещения она мерцает. Не сочтите...

Двойная буферизация не работает
почему то не работает Двойная Буферизация case WM_PAINT: { hdc=BeginPaint(hwnd,&PaintStruct); GetClientRect(hwnd,&rect); ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru