Форум программистов, компьютерный форум, киберфорум
Наши страницы

Visual C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.69
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
#1

Двойная буферизация, присутствует мерцание - Visual C++

05.08.2012, 18:12. Просмотров 4415. Ответов 32
Метки нет (Все метки)

Здравствуйте!
Если форма на C++ (чистый WinAPI), на ней рисуется графика с помощью GDI+.
Форма обновляется каждые 100мс., но вот беда она мерцает.
Код отрисовки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
VOID OnPaint(HDC hdc)
{
   Graphics     graphics(hdc);
   SolidBrush  brush(Color(255, 0, 0, 255));
   FontFamily  fontFamily(L"Times New Roman");
   Font         font(&fontFamily, 24, FontStyleRegular, UnitPixel);
   PointF         pointF(10.0f, 20.0f);
   Bitmap* picture = Bitmap::FromResource(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDB_BITMAP1));
   graphics.DrawImage(picture, 0, 0);
   if (is_game)
        graphics.DrawString(L"Game is running!", -1, &font, pointF, &brush);
   else graphics.DrawString(L"Game is'nt running!", -1, &font, pointF, &brush);
}
Само рисование формы и применение буферизации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case WM_PAINT:
  {
   HDC hdc;
   PAINTSTRUCT ps;
   ULONG_PTR gdiplusToken;
   HDC mdc = CreateCompatibleDC(NULL);
   HBITMAP mbmp =  CreateBitmap(420,320,1,8,NULL);
   HBITMAP moldbmp = (HBITMAP)SelectObject(mdc,mbmp);
   hdc = BeginPaint(hWnd, &ps);
   GdiplusStartupInput gdiplusStartupInput;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
   {
        OnPaint(hdc);
   }
   SelectObject(mdc,moldbmp);
   DeleteObject(mbmp);
   DeleteDC(mdc);
   EndPaint(hWnd, &ps);
  }
  break;
И собственно говоря код, который вызывает обновление:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case WM_TIMER:
  {
   if (ME->GetProcessByName() != 0)
   {
        is_game = true;
        RECT rect = {0, 0, 420, 320};
        InvalidateRect(hWnd, &rect, false);
   }
   else
   {
        is_game = false;
        RECT rect = {0, 0, 420, 320};
        InvalidateRect(hWnd, &rect, false);
   }
  }
  break;
Как я могу устранить мерцание элементов формы? Может что-то не так с буферизацией?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2012, 18:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Двойная буферизация, присутствует мерцание (Visual C++):

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

Двойная буферизация под Win на VC++ (MFC) - Visual C++
Двойная буферизация под Win на VC++(MFC) - кто-нибудь знает - это вообще возможно?? Или по-другому: можно-ли создать в MFC SDI копию...

Двойная компиляция - Visual C++
Всем привет! При компиляции на VS2010 происходит двойной запуск программы. При использовании OpenGL в первый раз консоль перекрывает...

Мерцание консоли - Visual C++
Пишу RPG. Но возникла такая проблема: когда персонаж двигается, начинает моргать консоль. Для вас очень простой вопрос, а для меня...

Мерцание при Invalidate - Visual C++
(MFC) Вызываю в OnMouseMove MoveWindow(SetWindowPos (отключаю перерисовку)) и Invalidate Происходит мерцание, как избавиться? ...

Анимация огня. Мерцание - Visual C++
Собственно само задание выглядит так: Задание я вроде бы выполнил, но изображение сильно мерцает. Пробовал отрисовывать в память, а...

32
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
06.08.2012, 00:52 #31
Цитата Сообщение от Sheppard Посмотреть сообщение
Текст мерцает также
Если ты все сделал так как я тебе говорил, то мне верится в это с трудом. Показывай код в CUT.
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
06.08.2012, 01:00  [ТС] #32
Цитата Сообщение от lazybiz Посмотреть сообщение
Если ты все сделал так как я тебе говорил, то мне верится в это с трудом. Показывай код в CUT.
С++ source code
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VOID OnPaint(HDC hdc)
{
   HDC memDC = CreateCompatibleDC(NULL);
   Graphics    graphics(hdc);
   SolidBrush  brush(Color(255, 0, 0, 255));
   FontFamily  fontFamily(L"Times New Roman");
   Font        font(&fontFamily, 24, FontStyleRegular, UnitPixel);
   PointF      pointF(10.0f, 20.0f);
   PointF      pointF2(10.0f, 45.0f);
   Bitmap* picture = Bitmap::FromResource(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDB_BITMAP1));
   graphics.DrawImage(picture, 0, 0);
   if (is_game)
   {
       graphics.DrawString(L"Game is running!", -1, &font, pointF, &brush);
       graphics.DrawString(ammo, -1, &font, pointF2, &brush);
   }
   else graphics.DrawString(L"Game is'nt running!", -1, &font, pointF, &brush);
   BitBlt(hdc, 0, 0, 420, 320, memDC, 0, 0, SRCCOPY);
   DeleteDC(memDC);
}

Только не говори, что я что-то перепутал
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
06.08.2012, 01:21 #33
Опять ты кое-что перепутал, а точнее не доделал. Кстати, ты заметил что с прошлого раза этот код не изменился!? Обрати на это внимание.

Я спать. Сделай как я говорил, и, если не будет работать выложи код целиком, завтра посмотрим...
0
06.08.2012, 01:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2012, 01:21
Привет! Вот еще темы с ответами:

Мерцание при перерисовке (MFC) - Visual C++
Господа Программисты! Делаю Тетрис на MFC. При перерисовке игрового поля (сообщение ON_WM_PAINT), возникает мерцание. ...

Постоянное мерцание при прорисовке - Visual C++
создал класс, в котором реализованы методы для рисования графиков. есть маcсив sinys, где у меня сохранены все точки, который мне надо...

Как побороть мерцание при перерисовке строки контрола CListBox - Visual C++
Добрый день! Как побороть мерцание при перерисовке строки контрола CListBox. //Строку обновляю в void DrawItem(LPDRAWITEMSTRUCT...

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Опции темы

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