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

DrawText наложение текста

17.11.2019, 09:40. Показов 2400. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

У меня появилась проблема, при перерисовке через DrawText происходит наложение текста.
Думаю после прорисовки нужно чистить и заного рисовать, но как это сделать?

P.S. InvalidateRect и UpdateWindow не помогают

Скриншот проблемы:
Изображения
 
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.11.2019, 09:40
Ответы с готовыми решениями:

Помогите получить HDC принтера вывести печать текста функцией DrawText
Написал программку (для бух.) и хочу сделать свою процедуру печати. Помогите получить HDC принтера с помощью CreateDC, вывести туда...

Наложение текста на картинку
Ребят есть такая проблемrа, нужно наложить текст на картинку в примерно таком виде: функция(<изображение>, <текст>, любые...

Вывод текста не экран с помощью DrawText (DirectX)
Здравствуйте, проблема такая: пытаюсь вывести текст на экран, если я пишу вот так pFont->DrawText(NULL, L"Все работает", -1,...

9
фрилансер
 Аватар для Алексей1153
6455 / 5656 / 1129
Регистрация: 11.10.2019
Сообщений: 15,066
17.11.2019, 10:05
1) либо InvalidateRect с параметром bErase==1
2) либо сначала прямоугольник цвета фона, затем поверх - текст с прозрачным фоном
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 59
17.11.2019, 10:15  [ТС]
Не помогло, теперь вообще не рисует
Миниатюры
DrawText наложение текста  
0
фрилансер
 Аватар для Алексей1153
6455 / 5656 / 1129
Регистрация: 11.10.2019
Сообщений: 15,066
17.11.2019, 10:21
vitya790, InvalidateRect вызывается не в процедуре отрисовки, а "снаружи". Петля обработки сообщений пришлёт WM_PAINT при первой же возможности. Если же "снаружи" необходимо немедленно перерисовать окно, то сообщение WM_PAINT можно пнуть при помощи UpdateWindow

и зачем ещё слип в процедуре отрисовки ? Бесконечный цикл - вообще огонь )

Прицепи кусочек проекта с повторением проблемы, я попробую разобраться

Добавлено через 2 минуты
или вот так - вместо той строки, где у тебя сейчас InvalidateRect, закрась прямоугольник фоном
C++
1
dc.FillSolidRect(&rc,::GetSysColor(COLOR_3DFACE));
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 59
17.11.2019, 10:22  [ТС]
Держи
Вложения
Тип файла: rar TaskbarText.rar (2.7 Кб, 10 просмотров)
0
фрилансер
 Аватар для Алексей1153
6455 / 5656 / 1129
Регистрация: 11.10.2019
Сообщений: 15,066
17.11.2019, 11:15
Лучший ответ Сообщение было отмечено vitya790 как решение

Решение

vitya790, я так понял, ты достаёшь HDC таскбара и пытаешься на нём в цикле постоянно рисовать. Моргать будет нещадно, конечно, такое делается на отдельном окошке с перерисовкой в двойном буфере.

Твой вариант подправил

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
void Draw()
{
    HWND panel = ::FindWindowEx(NULL, NULL, _T("Shell_TrayWnd"), NULL);
    panel = ::FindWindowEx(panel, NULL, _T("ReBarWindow32"), NULL);
    panel = ::FindWindowEx(panel, NULL, _T("MSTaskSwWClass"), NULL);
    panel = ::FindWindowEx(panel, NULL, _T("MSTaskListWClass"), NULL);
 
    //буфер для форматирования текста
    std::wstring text(256,'\0');
 
    //создаём объекты для рисования
    HFONT font= ::CreateFont(16, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DECORATIVE, _T("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;
        swprintf(&text[0],text.size(), L"CPU: %2.1f%%", num);
 
        //добываем текущий контекст таскбара
        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);
 
            ::SetBkMode(dc, TRANSPARENT);
            ::SetTextColor(dc, RGB(0,128,0));
            ::SelectObject(dc, font);
            ::DrawTextW(dc, text.c_str(), text.size(), &rc, DT_VCENTER | DT_SINGLELINE | DT_LEFT); 
        }
 
        //удаляем контекст
        ::RestoreDC(dc,saved);
        ::ReleaseDC(panel, dc);
 
        //если вдруг захотелось выйти из цикла
        //break;
    }
 
    //удаляем созданные нами объекты
    ::DeleteObject(font);
    ::DeleteObject(br);
    ::DeleteObject(pen0);
}
1
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 59
17.11.2019, 11:18  [ТС]
Спасибо, робит, но мне нужен прозрачный фон

Всё, исправил
0
фрилансер
 Аватар для Алексей1153
6455 / 5656 / 1129
Регистрация: 11.10.2019
Сообщений: 15,066
17.11.2019, 11:32
vitya790, это нужно тогда своё окно туда вывешивать и что-то колдовать с прозрачностью. Я так с ходу не вспомню, как это делается.

Добавлено через 22 секунды
хотя, щас один вариант попробую

Добавлено через 24 секунды
Цитата Сообщение от vitya790 Посмотреть сообщение
Всё, исправил
что сделал?

Добавлено через 2 минуты
вот такое должно проканать, но моргать будет

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
void Draw()
{
    HWND panel = ::FindWindowEx(NULL, NULL, _T("Shell_TrayWnd"), NULL);
    panel = ::FindWindowEx(panel, NULL, _T("ReBarWindow32"), NULL);
    panel = ::FindWindowEx(panel, NULL, _T("MSTaskSwWClass"), NULL);
    panel = ::FindWindowEx(panel, NULL, _T("MSTaskListWClass"), NULL);
 
    //буфер для форматирования текста
    std::wstring text(256,'\0');
 
    //создаём объекты для рисования
    HFONT font= ::CreateFont(16, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DECORATIVE, _T("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;
        swprintf(&text[0],text.size(), L"CPU: %2.1f%%", num);
 
        //добываем текущий контекст таскбара
        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_SINGLELINE | DT_LEFT); 
        }
 
        //удаляем контекст
        ::RestoreDC(dc,saved);
        ::ReleaseDC(panel, dc);
 
        //если вдруг захотелось выйти из цикла
        //break;
    }
 
    //удаляем созданные нами объекты
    ::DeleteObject(font);
    //::DeleteObject(br);
    //::DeleteObject(pen0);
}
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 59
17.11.2019, 11:33  [ТС]
Прозрачность поставил
Миниатюры
DrawText наложение текста  
0
фрилансер
 Аватар для Алексей1153
6455 / 5656 / 1129
Регистрация: 11.10.2019
Сообщений: 15,066
17.11.2019, 11:39
vitya790, это ты сделал вот что:

C++
1
#define TRANSPARENT         1
взял значение 1

такое же как
C++
1
#define COLOR_BACKGROUND        1
по сути это ты вызвал
C++
1
::GetSysColor(COLOR_BACKGROUND)
и просто очень удачно закрасил цветом системного фона.

Посмотри код в моём последнем посте - там будет рисование именно поверх
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.11.2019, 11:39
Помогаю со студенческими работами здесь

Местоположение текста (DrawText)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc...

Качество отрисовки текста у TextRenderer.DrawText
Микрософт заявлял что GDI будет производительнее чем GDI+, но по факту почему-то Graphics.DrawString на максимальном качестве отрисовывает...

DrawText и перемещение текста в окне по вертикали
DrawText рисует текст в прямоугольнике структуры RECT и выводит в графическое окно, но как его двигать в окне (если текст большой)? (и,...

Ошибка при рисовании текста - в XE3 не линкуется метод TCustomStyleServices::DrawText()
#include <System.Types.hpp> #include <Vcl.Themes.hpp> //--------------------------------------------------------------------------- ...

Наложение текста
Здравствуйте подскажите пожалуйста верный ли код и как вывести полученное изображение? <?php ini_set('display_errors', 1); ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru