Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
1

Изменение шрифта и\или цвета в StatusBar

23.03.2010, 17:02. Показов 8961. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Вот появился вопрос. Имеется компонент StatusBar в свойстве Panels значится 5 StatusPanel. Мне нужно именить цвет в 1-й и 2-й панельке на жирный, оставив: 0-ю, 3-ю, 4-ю, панели как есть. Цель, подсветить в этих панелях значения HTM и XML
C++
1
2
3
4
...
   StatusBar1->Panels->Items[1]->Text = L"HTM";
   StatusBar1->Panels->Items[2]->Text = L"XML";
...
Если ещё не затруднит, покажите как менять шрифт только в отдельных панелях (если это возможно). Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2010, 17:02
Ответы с готовыми решениями:

Изменение цвета шрифта
В программе по событию меняю цвет шрифта CategoryPane, которая содержит в себе разные элементы,...

Изменение цвета и/или шрифта заданных узлов TreeView
Гуглил, но ничего путного для себя не нагуглил по указанному сабжу. Возможно ли это в принципе?

Изменение цвета фона, шрифта и типа шрифта по выбору пользователя
Необходимо, чтобы в программе, изменялся цвет фона, шрифта, и изменялся тип шрифта, по выбору...

Изменение цвета StatusBar-а (Android)
Необходимо разукрасить StatusBar в определенный цвет, судя по всему цвет можно прописать в...

9
Покинул форум
3187 / 1366 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
23.03.2010, 17:34 2
C++
1
2
StatusBar1->Canvas->Font->Color=clRed;
StatusBar1->Canvas->TextOutA(54,5,L"HTM");
Способ не самый лучший, но работает.
Добавлено через 3 минуты
Вот так работает нормально:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StatusBar1->Panels->Items[0]->Text= L"LOL";
StatusBar1->Panels->Items[3]->Text = L"ROFL";
StatusBar1->Panels->Items[1]->Text= L"HTM";
StatusBar1->Panels->Items[2]->Text = L"XML";
}
//---------------------------------------------------------------------------
Теперь закрашиваем:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Button1Click(TObject *Sender)
{
StatusBar1->Canvas->Font=StatusBar1->Font;
StatusBar1->Canvas->Font->Color=clRed;
StatusBar1->Canvas->TextOutA(54,5,L"HTM");
StatusBar1->Canvas->TextOutA(105,5,L"XML");
}
//---------------------------------------------------------------------------
Добавлено через 1 минуту
У меня размер 1 ячейки равен 50.
2
1856 / 713 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
23.03.2010, 17:52 3
Все так как сказал Ni'Tan, но вот только у панелек панели состояния нужно установить стиль OwnerDraw, и прорисовку вести в StatusBar1DrawPanel. Так, я думаю, будет более правильно.
2
Покинул форум
3187 / 1366 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
23.03.2010, 17:57 4
но вот только у панелек панели состояния нужно установить стиль OwnerDraw, и прорисовку вести в StatusBar1DrawPanel. Так, я думаю, будет более правильно.
OwnerDraw нужно постваить только у 1 и 2 панельки. У остальных должно быть Text. А с остальным полностью согласен.
0
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
23.03.2010, 18:26  [ТС] 5
Ni'Tan, Otaka, Ребята, советы дельные, рабочие. Но видимо я не до конца выразился точно, что хочу получить. Поэтому способ немного не подходит (подозреваю, что не так реализовываю.) Предполагается, что в некоторых случаях пользователь может перетянуть только один из двух файлов или HTM или XML. Тогда при перетаскивании xml выделяется красным цветом 2-я ячейка, если перетаскивает htm то 1-я ячейка, при перетаскивании двух файлов, выделяются обе ячейки, всё работает. Проблем нет. Кроме одной. При изменении размера окна, выделеный красным цвет и сам текст пропадает. Как я понял, нужна перерисовка
Цитата Сообщение от Otaka Посмотреть сообщение
прорисовку вести в StatusBar1DrawPanel
Но если я ставлю туда код, то выделеные значения появляются при старте программы, даже когда RichEdit пустые и файлы не открыты... Сама работа происходит с списками: ListHTM и ListXML, но это уже другой вопрос.

Как и куда правильно вписать код, чтобы при изменении размера окна, подстветка и значения ячеек не пропадали? Вот код.
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
...
// Перетаскиваем файлы. Создаём события--------------------------------------
void __fastcall TForm1::WmDropFiles(TWMDropFiles& Message)
{
   HDROP drop_handle = (HDROP)Message.Drop;
   char fName[MAXPATH];
   int filenum = DragQueryFile(drop_handle, -1, NULL, 2);
   for(int i = 0; i < filenum; i++){
      DragQueryFile(drop_handle, i, fName, MAXPATH);
      ReadFile(fName);
     }
   DragFinish(drop_handle);
}
// После перетаскивания, вычисляем расширения и открываем файл в RichEdit-----
void __fastcall TForm1::ReadFile(AnsiString FileName)
{
   AnsiString str = ExtractFileExt(FileName);
   if(str == ".htm"){
      RichEdit2->Lines->LoadFromFile(FileName);
      ListHTM->Text = RichEdit2->Text;
      StatusBar1->Canvas->Font=StatusBar1->Font; // Это добавлено по рецепту
      StatusBar1->Canvas->Font->Color=clRed; // Это добавлено по рецепту
      StatusBar1->Canvas->TextOutA(55,5,L"HTM"); // Это добавлено по рецепту
      StatusBar1->Canvas->TextOutA(92,5,L""); // Это добавлено по рецепту
     }
    else if(str == ".xml"){
      RichEdit2->Lines->LoadFromFile(FileName);
      ListXML->Text = RichEdit2->Text;
      StatusBar1->Canvas->Font=StatusBar1->Font; // Это добавлено по рецепту
      StatusBar1->Canvas->Font->Color=clRed; // Это добавлено по рецепту
      StatusBar1->Canvas->TextOutA(55,5,L""); // Это добавлено по рецепту
      StatusBar1->Canvas->TextOutA(92,5,L"XML"); // Это добавлено по рецепту
     }
 
    RichEdit2->Clear();
}
...
Цитата Сообщение от Ni'Tan Посмотреть сообщение
OwnerDraw нужно постваить только у 1 и 2 панельки.
Ну, это я сам понял. Стиль установлен, вопрос остаётся.
0
Покинул форум
3187 / 1366 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
24.03.2010, 11:11 6
хм....

Добавлено через 13 минут
Сделал

Добавлено через 1 минуту
Обьявляем
C++
1
bool htm=false,xml=false;
На событие StatusBar1DrawPanel пишем:
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
if((htm==false) && (xml==false)){
 StatusBar1->Canvas->Font->Color=clBlack;
StatusBar1->Canvas->TextOutA(55,5,"HTM");
StatusBar1->Canvas->TextOutA(105,5,"XML");}
 
if((htm==true) && (xml==false)){
 StatusBar1->Canvas->Font->Color=clRed;
StatusBar1->Canvas->TextOutA(55,5,"HTM");
 StatusBar1->Canvas->Font->Color=clBlack;
 StatusBar1->Canvas->TextOutA(105,5,"XML");
}
 
 
if((htm==false) && (xml==true)){
 StatusBar1->Canvas->Font->Color=clRed;
  StatusBar1->Canvas->TextOutA(105,5,"XML");
 StatusBar1->Canvas->Font->Color=clBlack;
 StatusBar1->Canvas->TextOutA(55,5,"HTM");
}
 
 
if((htm==true) && (xml==true)){
  StatusBar1->Canvas->Font->Color=clRed;
  StatusBar1->Canvas->TextOutA(105,5,"XML");
 StatusBar1->Canvas->TextOutA(55,5,"HTM");
 
}
Добавлено через 1 минуту
Просто при изменение размеров формы StatusBar тоже перерисовывается.
1
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
24.03.2010, 14:16  [ТС] 7
Ni'Tan, Отлично. Правда чуть-чуть код подправил.
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
...
// Перерисовка формы, когда индикация говорит о том что файл(ы) загружен(ы)
void __fastcall TForm1::StatusBar1DrawPanel(TStatusBar *StatusBar,
      TStatusPanel *Panel, const TRect &Rect)
{
   if((bHTM == false) && (bXML == false)){
     StatusBar1->Canvas->TextOutA(55, 5, "");
     StatusBar1->Canvas->TextOutA(92, 5, "");
    }
 
   else if((bHTM == true) && (bXML == false)){
     StatusBar1->Canvas->Font->Color = clRed;
     StatusBar1->Canvas->TextOutA(55, 5, "HTM");
     StatusBar1->Canvas->TextOutA(92, 5, "");
    }
 
   else if((bHTM == false) && (bXML == true)){
     StatusBar1->Canvas->Font->Color = clRed;
     StatusBar1->Canvas->TextOutA(92, 5, "XML");
     StatusBar1->Canvas->TextOutA(55, 5, "");
    }
 
  else if((bHTM == true) && (bXML == true)){
    StatusBar1->Canvas->Font->Color = clRed;
    StatusBar1->Canvas->TextOutA(92, 5, "XML");
    StatusBar1->Canvas->TextOutA(55, 5, "HTM");
   }
}
...
Вопрос решён.

Но на будущее хотелось бы знать, а как выделить эти два значения, ещё и жирным цветом?
0
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 477
24.03.2010, 14:53 8
ну так добавляеш строчку еще одну

C++
1
StatusBar1->Canvas->Font->Style << fsBold;
1
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
24.03.2010, 17:23  [ТС] 9
koldun, Так и сделал. Спасибо.

Вопросы решены окончательно и полностью.
0
0 / 0 / 1
Регистрация: 04.02.2013
Сообщений: 5
26.02.2013, 22:41 10
Извините, не стал создавать новую тему, т.к. пример описанный выше похож на мой...
Вопрос заключается в следующем, у меня есть три кнопки "Добавить", "Редактировать", "Удалить", по нажатию на любую из кнопок в StatusBar выводится сообщение с действием, которое происходит в данный момент, будь то "Добавление данных", либо "Редактирование данных", либо "Удаление".
Вопрос: Почему не всегда меняется статус при нажатии кнопок?
Как я понимаю, при нажатии на кнопку, нужно, чтобы выполнялось событие OnDrawPanel. Как это сделать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if ((status_insert==true) && (status_custom==false) && (status_delete==false))
{
StatusBar1->Canvas->Font->Color=clGray;
StatusBar1->Canvas->Font->Size=10;
StatusBar1->Canvas->Font->Name="Times New Roman";
StatusBar1->Canvas->TextOut(210,5,L"Добавление записи");
}
else if ((status_custom==true) && (status_insert==false) && (status_delete==false))
{
StatusBar1->Canvas->Font->Color=clGray;
StatusBar1->Canvas->Font->Size=10;
StatusBar1->Canvas->Font->Name="Times New Roman";
StatusBar1->Canvas->TextOut(210,5,L"Просмотр записей базы данных");
}
else if ((status_delete==true) && (status_custom==false) && (status_insert==false))
{
StatusBar1->Canvas->Font->Color=clGray;
StatusBar1->Canvas->Font->Size=10;
StatusBar1->Canvas->Font->Name="Times New Roman";
StatusBar1->Canvas->TextOut(210,5,L"Удаление записей из базы данных");
}
Добавлено через 30 минут
Хм... странно, получилось, статус меняется, если в код по нажатию кнопки прописать хотя бы
C++
1
StatusBar1->Panels->Items[1]->Text= " ";
, тогда программа входит в процедуру OnDrawPanel и начинает естесвенно перерисовывать. Как так получается?
0
26.02.2013, 22:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2013, 22:41
Помогаю со студенческими работами здесь

Задайте изменение цвета кнопок и цвета шрифта на кнопках формы в ходе выполнения программы
1. Задайте изменение цвета кнопок и цвета шрифта на кнопках формы в ходе выполнения программы. 2....

Изменение цвета шрифта
Есть 5 слов, необходимо вывести их разными цветами. Пробовал system(&quot;color&quot;); и с помощью Handle....

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

ToolTip изменение шрифта и цвета
Добрый день! Пишу прогу в VS2008 на С++. Как можно изменить в ToolTip шрифт и цвет, что-бы при...


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

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

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