Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
4 / 4 / 0
Регистрация: 26.09.2012
Сообщений: 39

SetBkColor работает криво

06.12.2012, 14:16. Показов 2187. Ответов 4

Студворк — интернет-сервис помощи студентам
Есть пэинтбокс. На нем вывожу надпись под углом. Все настройки по тексту работают прекрасно. Но вот с заливкой бэка какая-то ерунда. Если использую пример нижу без вывода прямоугольника, то ничего не происходит с заливкой. если раскомментировать то зальется и бэк и прямоугольник. как вариант думал просто прямоугольник оставить только выводить под углом с текстом, но не могу реализовать его поворот( В общем посоветуйте что-нибудь, а то уже голова взрывается. картинку с примером залил.

C++
1
2
3
4
5
6
7
if (flagbkg==true){
SetBkMode(hdc, TRANSPARENT);
SetBkColor (hdc, colorbkg)  ;
//Form1->PaintBox1->Canvas->Brush->Color=colorbkg;
//Form1->PaintBox1->Canvas->Rectangle(xd,yd,xd+WidthOfString2/2,yd+HeightOfString2/2);
}          
    TextOut(hdc, xd-WidthOfString2/2, yd, s2.c_str(), s2.Length());}
Миниатюры
SetBkColor работает криво  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.12.2012, 14:16
Ответы с готовыми решениями:

Создание запись в .txt файл, и добавление в StringGrid Криво работает
Вообщем когда добавляет запись, вторая строчка пустая становится. if(Edit1->Text == "" && Edit2->Text ==...

SetBkColor - функция работает, но в окне ничего не меняется
SetBkColor(HDC, colorref). Так вот оно работает только с HDC получаемым через WM_CTLCOLOR, а с обычными GetWindowDC,GetCompatibleDC не. Не...

Криво работает
У меня задание "Создать триггер. Нужно, чтобы при изменении столбца ПРЕМИЯ, у меня столбец ИТОГО пересчитывался по формуле ...

4
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
06.12.2012, 14:28
Координаты по кругу
TRANSPARENT - это = ПРОЗРАЧНО
0
4 / 4 / 0
Регистрация: 26.09.2012
Сообщений: 39
07.12.2012, 03:05  [ТС]
LK, я этим и пользуюсь. Единственное отличие - у меня вывод при нажатом маусдаун вывод текста в этой позиции и помимо текста я там еще кучу всего рисую. По этому нельзя стирать фон. Вот код.
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
 Form1->DoubleBuffered = true;
  //  PaintBox1->Canvas->Rectangle(0,0,PaintBox1->ClientWidth,PaintBox1->ClientHeight);
   // char *s1 = "ûâèìûì";
    String s2 = Edit1->Text;
    PaintBox1->Canvas->Brush->Style = bsClear;
    HDC hdc = PaintBox1->Canvas->Handle;
 
    LOGFONT lf;
    ZeroMemory(&lf, sizeof(LOGFONT));
    lf.lfHeight = (Edit2->Text).ToInt(); // âûñîòà øðèôòà
    lf.lfWidth = (Edit3->Text).ToInt(); // øèðèíà ñèìâîëîâ
 
if  (CheckBox1->Checked==true) lf.lfWeight = 800; else lf.lfWeight = 400;     // òîëùèíà, "æèðíîñòü" øðèôòà
if  (CheckBox2->Checked==true) lf.lfItalic = 1; else  lf.lfItalic = 0;  // åñëè ýòî ïîëå íå ðàâíî 0, øðèôò áóäåò êóðñèâíûé
if  (CheckBox3->Checked==true) lf.lfUnderline = 1; else lf.lfUnderline = 0; // åñëè ýòî ïîëå íå ðàâíî 0, øðèôò áóäåò ïåðå÷åðêíóòûé
if  (CheckBox4->Checked==true) lf.lfStrikeOut = 1; else lf.lfStrikeOut = 0; // åñëè ýòî ïîëå íå ðàâíî 0, øðèôò áóäåò ïîä÷¸ðêíóòûé
 
 
    lf.lfEscapement = (Edit4->Text).ToInt()*10; // ïîâîðîò øðèôòà, 0; øðèôò áåç ïîâîðîòà
    lf.lfCharSet = DEFAULT_CHARSET;
    lf.lfPitchAndFamily = FIXED_PITCH; // DEFAULT_PITCH;
 
if (ComboBox2->Text=="Arial")             strcpy(lf.lfFaceName,"Arial");
if (ComboBox2->Text=="Georgia")           strcpy(lf.lfFaceName,"Georgia");
if (ComboBox2->Text=="Meiryo")            strcpy(lf.lfFaceName,"Meiryo");
if (ComboBox2->Text=="Monotype Corsiva")  strcpy(lf.lfFaceName,"Monotype Corsiva");
if (ComboBox2->Text=="Roman")             strcpy(lf.lfFaceName,"Roman");
if (ComboBox2->Text=="Tahoma")            strcpy(lf.lfFaceName,"Tahoma");
if (ComboBox2->Text=="Times New Roman")   strcpy(lf.lfFaceName,"Times New Roman");
 
 
    PaintBox1->Canvas->Font->Handle = CreateFontIndirect(&lf);
   // PaintBox1->Canvas->Brush->Color = clWhite;
    //PaintBox1->Canvas->FillRect(PaintBox1->Canvas->ClipRect);
    SetTextAlign(hdc, TA_LEFT); // |TA_BASELINE|TA_UPDATECP);
 
    /* int WidthOfString = PaintBox1->Canvas->TextWidth(s1);
    int HeightOfString = PaintBox1->Canvas->TextHeight(s1);
    SetTextColor(hdc, 0x00ffff); //  // öâåò òåêñòà ïåðâîé ñòðîêè
   TextOut(hdc, PaintBox1->ClientWidth/2-WidthOfString/2,
                    PaintBox1->ClientHeight/2+HeightOfString/2,
                    String(s1).c_str(), String(s1).Length());
//                  UnicodeString(s1).c_str(), UnicodeString(s1).Length());  */
 
    int WidthOfString2 = PaintBox1->Canvas->TextWidth(s2);
    int HeightOfString2 = PaintBox1->Canvas->TextHeight(s2);
 
if (flagtext==true){SetTextColor(hdc, colortext);}
 else SetTextColor(hdc,clBlack);                        // öâåò òåêñòà âòîðîé ñòðîêè
 
if (flagbkg==true){
//SetBkMode(hdc, TRANSPARENT);
SetBkColor (hdc, colorbkg ) ;
//Form1->PaintBox1->Canvas->Brush->Color=colorbkg;
//Form1->PaintBox1->Canvas->Rectangle(xd,yd,xd+WidthOfString2/2,yd+HeightOfString2/2);
 
 
//flagbkg=false;
}
 else {flagbkg==false;SetBkMode(hdc, 0);}              //âòîðîé ïàðàìåòð çàäà¸ò öâåò ôîíà òåêñòà
 
    TextOut(hdc, xd,
                    yd, // // îòñòóï ìåæäó ñòðîê
                    s2.c_str(), s2.Length());
   }
Добавлено через 48 секунд
Все отлично работает кроме бэка((

Добавлено через 15 минут
LK, и если брать этот пример, то мне тогда надо както заменить
C++
1
2
    PaintBox1->Canvas->Brush->Color = clWhite;
    PaintBox1->Canvas->FillRect(PaintBox1->Canvas->ClipRect);
Так чтобы не перезаливался фон

Добавлено через 12 часов 5 минут
up!
0
4 / 4 / 0
Регистрация: 26.09.2012
Сообщений: 39
08.12.2012, 03:39  [ТС]
Решил поставленную задачу. Прежде чем рисовать, надо создать шрифт и поле, после их удалить.

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
// Старый и новый шрифт
 HFONT     hFont,hFontOld;
 // Структура определения шрифтов
 LOGFONT   tLf;
 if  (CheckBox3->Checked==true)  tLf.lfUnderline = 1; else  tLf.lfUnderline = 0;
 if  (CheckBox2->Checked==true) tLf.lfItalic = 1; else  tLf.lfItalic = 0;
 if  (CheckBox4->Checked==true)  tLf.lfStrikeOut = 1; else  tLf.lfStrikeOut = 0;
 tLf.lfEscapement=(Edit4->Text).ToInt()*10;
 tLf.lfOrientation=1500;
 // Значение 700 из 1000
 if  (CheckBox1->Checked==true) tLf.lfWeight = 800; else tLf.lfWeight  = 400;
 tLf.lfCharSet=RUSSIAN_CHARSET;
 // Использовать True Type, даже если 
 // есть подходящий шрифт другого типа
 tLf.lfOutPrecision=4;
 // Использовать точность, заданную по умолчанию
 tLf.lfOutPrecision = OUT_DEFAULT_PRECIS;
 // Способ отсечения символа за пределами области
 tLf.lfClipPrecision = CLIP_DEFAULT_PRECIS; 
 // Нужен шрифт с переменной шириной символов семейства
 //  Roman. Переменная ширина букв c засечками
 tLf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
 // Низкое качество. Допустимо масштабирование шрифтов,
 // синтезирование наклонных, жирных, перечеркнутых и т.п.
 tLf.lfQuality=DRAFT_QUALITY; 
 // Имя шрифта
if (ComboBox2->Text=="Arial")             wsprintf(tLf.lfFaceName,"Arial");
if (ComboBox2->Text=="Georgia")           wsprintf(tLf.lfFaceName,"Georgia");
if (ComboBox2->Text=="Meiryo")            wsprintf(tLf.lfFaceName,"Meiryo");
if (ComboBox2->Text=="Monotype Corsiva")  wsprintf(tLf.lfFaceName,"Monotype Corsiva");
if (ComboBox2->Text=="Roman")             wsprintf(tLf.lfFaceName,"Roman");
if (ComboBox2->Text=="Tahoma")            wsprintf(tLf.lfFaceName,"Tahoma");
if (ComboBox2->Text=="Times New Roman")   wsprintf(tLf.lfFaceName,"Times New Roman");
 
 // Желательные размеры шрифта
 tLf.lfHeight=(Edit2->Text).ToInt();
 tLf.lfWidth =  (Edit3->Text).ToInt();
 // Создаем шрифт
 hFont = CreateFontIndirect(&tLf);
 // Где будем писать, получаем HDC устройства
   HDC hDc = PaintBox1->Canvas->Handle;
 //HDC     hDc=GetDC(Handle);
 // HDC  hDc=CreateDC("DISPLAY",NULL,NULL,NULL);
 // Выбираем шрифт в контекст устройства
 hFontOld=(HFONT)SelectObject(hDc,hFont);
 // Дополнительные параметры текста
 if (flagtext==true){SetTextColor(hDc, colortext);}
 else SetTextColor(hDc,clBlack);
  if (flagbkg==true){SetBkMode(hDc,OPAQUE);SetBkColor (hDc, colorbkg ) ;}
 else  SetBkMode(hDc,TRANSPARENT);
 
 // Выводим текст
 TextOut(hDc,xd,yd,(Edit1->Text).c_str(),(Edit1->Text).Length());
 //Возвращаем все на свои места
 SelectObject(hDc,hFontOld);
 DeleteDC(hDc);
 DeleteObject(hFont);
 DeleteObject(hFontOld);
    }
0
08.12.2012, 03:52

Не по теме:

молодец

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2012, 03:52
Помогаю со студенческими работами здесь

Криво работает do while
Есть рабочий код на паскале, var a, k, s, b, x1, x2, y1, y2, h: real; n, j: integer; begin a := -1; b := 1; n :=...

Криво работает RollingCurl
привет, народ! Есть проблема конкретно с RollingCurl, в гугле нет ничего такого, на форуме не нашел тоже, поэтому решил спросить, может...

Memcpy криво работает
Всем доброго дня. Вот столкнулся с проблемой связанной с работой процедуры memcpy. Дело в том что если её вызывать в функции то она...

Криво работает youtube.ru
в мозиле криво работает ютуб, отображается так, как будто запрещены все скрипты и нету css, т.е. гольный текст в столбик. а в других...

Криво работает WORD
У меня Word 2007 . Проблема вот в чем: вставлять , печатать , создавать документы можно, но сохранять, выделять, перемешать курсор нельзя,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru