Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 59
1

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

26.03.2020, 20:57. Показов 835. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
У меня есть маленькая программа которая выводит текст на панели задач, и этот текст постоянно изменяется в цикле.
Принцип такой Отрисовка->Очистка текста, но проблема в том что текст мерцает.
Есть предположение что нужно реализовать двойную буферизацию чтобы текст не мерцал.

Сам код отрисовки:
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
void Draw()
{
    HWND panel = ::FindWindowEx(NULL, NULL, L"Shell_TrayWnd", NULL);
    panel = ::FindWindowEx(panel, NULL, L"ReBarWindow32", NULL);
    panel = ::FindWindowEx(panel, NULL, L"MSTaskSwWClass", NULL);
    panel = ::FindWindowEx(panel, NULL, L"MSTaskListWClass", NULL);
 
    //буфер для форматирования текста
    std::wstring text(256, '\0');
 
    //создаём объекты для рисования
    HFONT font = ::CreateFont(14, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DECORATIVE, L"Arial");
    //HBRUSH br=::CreateSolidBrush(::GetSysColor(COLOR_3DFACE));
    //HPEN pen0=::CreatePen(PS_NULL,0,0);
    for (;; Sleep(100))
    {
        const float num = int(getCpuPercent() * 10) / 10.0;
        const float mem = int(GetRamUsage());
        swprintf(&text[0], text.size(), L"CPU: %2.1f%%\nMem: %2.1f%%", num, mem);
 
        //добываем текущий контекст таскбара
        HDC dc = ::GetDC(panel);
        const int saved = ::SaveDC(dc);
 
        //рисуем на контексте
        {
            RECT rc = {};
            ::GetClientRect(panel, &rc);
            rc.left = rc.right - 90;
 
            //::SelectObject(dc,br);
            //::SelectObject(dc,pen0);
            //::Rectangle(dc,rc.left,rc.top,rc.right,rc.bottom);
 
            //перерисовываем прямоугольник, чтобы потом нарисовать поверх него
            ::InvalidateRect(panel, &rc, 0);
            ::UpdateWindow(panel);
 
            ::SetBkMode(dc, TRANSPARENT);
            ::SetTextColor(dc, RGB(0, 128, 0));
            ::SelectObject(dc, font);
            ::DrawTextW(dc, text.c_str(), text.size(), &rc, DT_VCENTER  | DT_LEFT);
        }
 
        //удаляем контекст
        ::RestoreDC(dc, saved);
        ::ReleaseDC(panel, dc);
 
        //если вдруг захотелось выйти из цикла
        //break;
    }
 
    //удаляем созданные нами объекты
    ::DeleteObject(font);
    //::DeleteObject(br);
    //::DeleteObject(pen0);
}
 
int main()
{
    HWND hWnd = GetConsoleWindow();
    ShowWindow(hWnd, SW_HIDE);
    Draw();
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2020, 20:57
Ответы с готовыми решениями:

двойная буферизация
Здравствуйте. Ребят не сочтите за труд, помогите разобраться. Проблема собственно вот в чём: Пишу...

Двойная буферизация на С++
Можно её реализовать для консоли, а то больно уж сильно экран мигает. Если можно то подскажите как...

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

Нужна двойная буферизация для программы
Сделал игру змейка.Но не могу найти нигде как использовать двойную буферизацию, потому что моргания...

1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
27.03.2020, 00:29 2
vitya790,
C++
1
2
3
4
5
6
7
8
9
10
11
12
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hDC, X, Y);
SelectObject(hMemDC , hBitmap);
 
while (...)
{
    // Рисуешь в hMemDC
    // ...
 
    // Копируешь нарисованное на экран
    BitBlt(hDC, 0, 0, X, Y, hMemDC, 0, 0, SRCCOPY);
}
X и Y замени на нужные тебе размеры. Если размеры окна, в которое ты рисуешь изменятся, то необходимо будет пересоздать битмап.
0
27.03.2020, 00:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2020, 00:29
Помогаю со студенческими работами здесь

Пользовательская буферизация
Что такое пользовательская буферизация? Читаю книгу по системному программированию и в ней есть...

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

Двойная спираль в C++
Нужно построить двумерный массив, с заполнением двойной спиралью. Самое сложное что сделать это...

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru