Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/16: Рейтинг темы: голосов - 16, средняя оценка - 5.00
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2

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

02.06.2012, 18:34. Показов 3251. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
почему то не работает Двойная Буферизация
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
case WM_PAINT: 
{ 
hdc=BeginPaint(hwnd,&PaintStruct);
GetClientRect(hwnd,&rect);
hdcMem = CreateCompatibleDC(hdc);
hbmMem = CreateCompatibleBitmap(hdc, wWidth, wHeight);
hOld = (HBITMAP)SelectObject(hdcMem, hbmMem);
 
DrawMap(hdcMem,map);
 
BitBlt(hdc, 0, 0, wWidth, wHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hOld);
DeleteObject(hbmMem);
DeleteDC (hdcMem);
EndPaint(hwnd, &PaintStruct);
 
}
break;

Текст всё равно мерцает...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2012, 18:34
Ответы с готовыми решениями:

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

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

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

10
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2012, 19:42
Создавать BITMAP-ы и девайс-контексты при обработке WM_PAINT не есть камильфо.
Тем более DrawMap() ты от нас скрыл...
О какой двойной буферизации может идти речь!?
0
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.06.2012, 19:54  [ТС]
в DrawMap() лежит отрисовка прямоугольника
В нете нашол что если мерцает то надо использовать двойную буферизацию и там был вот такой пример но он не работает..
Я создал ету тему чтоб мне помогли найти ошибки а если вы думаете что так не надо делать то покажите как
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2012, 21:01
Цитата Сообщение от Taras_Z Посмотреть сообщение
то покажите как
Рисуешь в битмэп (в память), потом выводишь на окно, и никакого мерцания! Это и называется двойной буферизацией.
Только не говори что все это надо написать за тебя.
Если сам попытаешься и не получится то готов помочь, но никак иначе.

... сейчас кину пример

Добавлено через 10 минут
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <windows.h>
 
#define             W                   500
#define             H                   500
 
static char         g_szWindowName[]    = "dib";
static char         g_szWindowClass[]   = "dib32";
static HWND         g_hWnd;
 
static BITMAPINFO   g_bi;
static long *       p_dib;
 
LRESULT CALLBACK wnd_proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch ( uMsg ) {
        case WM_LBUTTONDOWN: {
            static long x = 0;
 
            for ( int i = 0; i < W * H; i++ ) p_dib[i] = i * i + x;
            x += 0x10101010;
 
            InvalidateRect( g_hWnd, NULL, FALSE );
            UpdateWindow( g_hWnd );
        } break;
 
        case WM_PAINT: {
            PAINTSTRUCT ps;
            BeginPaint( hWnd, &ps );
            SetDIBitsToDevice( ps.hdc, 0, 0, W, H, 0, 0, 0, H, p_dib, &g_bi, DIB_RGB_COLORS );
            EndPaint( hWnd, &ps );
        } return 0;
 
        case WM_KEYDOWN: if ( (int)wParam != VK_ESCAPE ) break;
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
 
int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    MSG         msg;
    WNDCLASS    wc;
 
    ZeroMemory( &wc, sizeof( WNDCLASS ) );
    wc.style            = CS_SAVEBITS;
    wc.lpfnWndProc      = wnd_proc;
    wc.hInstance        = hInst;
    wc.hCursor          = LoadCursor( hInst, IDC_ARROW );
    wc.hbrBackground    = (HBRUSH)GetStockObject( LTGRAY_BRUSH );
    wc.lpszClassName    = g_szWindowClass;
    RegisterClass( &wc );
 
    g_hWnd = CreateWindow( g_szWindowClass, g_szWindowName, WS_POPUP | WS_VISIBLE,
        (GetSystemMetrics( SM_CXSCREEN ) >> 1) - (W >> 1),
        (GetSystemMetrics( SM_CYSCREEN ) >> 1) - (H >> 1),
        W, H, NULL, NULL, hInst, NULL );
 
    ZeroMemory( &g_bi, sizeof( BITMAPINFO ) );
    g_bi.bmiHeader.biSize           = sizeof( BITMAPINFOHEADER );
    g_bi.bmiHeader.biWidth          = W;
    g_bi.bmiHeader.biHeight         = -H;
    g_bi.bmiHeader.biPlanes         = 1;
    g_bi.bmiHeader.biBitCount       = 32;
    g_bi.bmiHeader.biCompression    = BI_RGB;
 
    p_dib = malloc( W * H * 4 );
 
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
 
    DestroyWindow( g_hWnd );
    UnregisterClass( g_szWindowClass, hInst );
    return 0;
}
Добавлено через 1 минуту
Админы! Сделайте поле для кода пошире!!!.. или шрифт поменьше!
0
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.06.2012, 22:03  [ТС]
Спасибо разберусь!
просто
http://slava.fateback.com/work... licker.htm
тут по другому и везде тоже так пишут
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2012, 22:22
Цитата Сообщение от Taras_Z Посмотреть сообщение
просто
http://slava.fateback.com/work... licker.htm
тут по другому и везде тоже так пишут
можно по-разному. просто надо понимать принцип отрисовки в ОС Windows. А так ничего сложного.
0
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.06.2012, 22:26  [ТС]
спасибо нашол виход
при WM_ERASEBACKGROUND возвращать 1
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2012, 22:39
Цитата Сообщение от Taras_Z Посмотреть сообщение
при WM_ERASEBACKGROUND возвращать 1
Поправка: WM_ERASEBKGND
Было бы интересно взглянуть...
0
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.06.2012, 22:54  [ТС]
ну да ошибся..

Добавлено через 32 секунды
return 1;
и всё работает и не мигает вообще
0
28 / 28 / 3
Регистрация: 27.05.2012
Сообщений: 114
06.08.2012, 18:10
Ну дык покажи код. У меня таже проблема нуждаюсь в подобном же решении.
0
4192 / 1839 / 222
Регистрация: 06.10.2010
Сообщений: 4,125
07.08.2012, 06:39
Можно ещё установить прозрачную кисть для WM_ERASEBKGND
C
1
SetClassLong(wnd,GCL_HBRBACKGROUND,GetStockObject(HOLLOW_BRUSH));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2012, 06:39
Помогаю со студенческими работами здесь

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

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

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

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

Двойная буферизация и WIN32 (GDI).
В MSDN написано: Я в свою очередь добавил обработку этого сообщения, но оно приходит только раз - когда я сам его посылаю. Это...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru