powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Цвет текста панелей в StatusBar
13 сообщений из 13, страница 1 из 1
Цвет текста панелей в StatusBar
    #39413183
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С чем только не ковырялся, но этого никогда не делал.

Отображаю в StatusBar к примеру состояние сервиса.
Хочу для наглядности:
Запущен - синий
Остановлен - красный
Запускается - зеленый
и т.п.
(желание нормальное)

Слово OwnerDraw я не люблю, это обычно в противоречии со стилями системы.
Куда копать грамотно?
Custom_draw? GDI на hdc? Или сообщение какое отловить?
С Listview - Custom_draw - делал(в .Net кстати есть реализация этого, но кривоватая).
C кнопками кажется через GDI цветной текст рисовал.

Неохота конечно этим заниматься.
Думал, есть готовые "свойства".
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39413432
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вопрос в принципе решаем как раз через OwnerDraw панелей.
И "системные стили" в данном случае не страдают (я не заметил).


Событие StatusBar.DrawItem

Код: vbnet
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.
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  ...

    Me.StatusBar1.Panels(0).Text = "Text in Red"
    Me.StatusBar1.Panels(0).Icon = IconOne
    Me.StatusBar1.Panels(0).Tag = Color.Red

    Me.StatusBar1.Panels(1).Text = "Text in Blue"
    Me.StatusBar1.Panels(1).Icon = IconTwo
    Me.StatusBar1.Panels(1).Tag = Color.Blue

    Me.StatusBar1.Panels(2).Text = "Text in Green"
    Me.StatusBar1.Panels(2).Icon = IconThree
    Me.StatusBar1.Panels(2).Tag = Color.Green
  End Sub

  Private Sub StatusBar1_DrawItem(sender As Object, sbdevent As StatusBarDrawItemEventArgs) Handles StatusBar1.DrawItem
    ' Create a StringFormat object to align text in the panel.
    Dim sf As New StringFormat()
    ' Format the String of the StatusBarPanel to be left + vert.centered.
    sf.Alignment = StringAlignment.Near
    sf.LineAlignment = StringAlignment.Center

    '>=Vista: Segoe UI 9 ; XP/2003 Tahoma; 8,25pt + сдвиг вправо-вниз на 1px чтоб попасть в оригинал
    Dim DeltaX As Integer = IIf(sys_WinVista, 0, 1)
    Dim DeltaY As Integer = IIf(sys_WinVista, 0, 1)
    '+18 запас на картинку 16px+2 (используем .Net-овскую, она при ownerdraw все равно рисуется)

    sbdevent.Graphics.DrawString(sbdevent.Panel.Text, StatusBar1.Font, New SolidBrush(sbdevent.Panel.Tag), _
             New RectangleF(sbdevent.Bounds.X + 18 + DeltaX, sbdevent.Bounds.Y + DeltaY, _
             sbdevent.Bounds.Width, sbdevent.Bounds.Height), sf)
  End Sub



Буквы скачут немного если форму дергать, а так нормально.
По хорошему это конечно не через OwnerDraw бы сделать.
Правильный метод SetTextColor для родного текста в нужном месте или чето еще, но не понятно куда это можно вставить для StatusBar.
WM_CTLCOLOR<...> для него вроде нет, Custom Draw также так понял отдыхает.
Да и .handle только у самого StatusBar, у панелей вроде как не наблюдается.

Наверно на этом варианте остановлюсь.
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39413436
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Буквы скачут немного если форму дергать,
А, понял почему. Они скакать начинают, когда места начинает не хватать. Текст в этом случае нормально должен обрезаться, а не пытаться уместиться.
Т.е. надо ставить заведомо большую горизонтальную ширину.
Не надо привязываться к sbdevent.Bounds.Width, Me.Width в самый раз (ширина формы).
Код: vbnet
1.
2.
3.
    sbdevent.Graphics.DrawString(sbdevent.Panel.Text, StatusBar1.Font, New SolidBrush(sbdevent.Panel.Tag), _
             New RectangleF(sbdevent.Bounds.X + 18 + DeltaX, sbdevent.Bounds.Y + DeltaY, _
             Me.Width, sbdevent.Bounds.Height), sf) ' + 1
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39413438
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не, похоже это единственный грамотный способ.
SB_SETTEXT message
If wParam is SBT_OWNERDRAW, ... The parent window must interpret the data and draw the text when it receives the WM_DRAWITEM message.
И .Net в данном случае избавляет от гимора c API-структурами.

Типа пример на C:
Display colored text on Status Bar
Тоже самое делает.
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39413511
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77,

Ночью надо спать, а статусбары раскрашивать!
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39413923
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, походу, всё на WinAPI делает, нафига ему тогда WinForms не понятно :) помню он и на WPF с WinAPI пытался делать :)
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39413973
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesпомню он и на WPF с WinAPI пытался делать :)
Чужих заслуг мне не приписывай и чуши не пиши. WPF я никогда даже не пытался - оно с API ничего общего не имееет.
Roman MejtesДмитрий77, походу, всё на WinAPI делает, нафига ему тогда WinForms не понятно :)
Что непонятно? WinForms реализует Common Controls в большинстве случаев (Listview, Treview, StatusBar...), обертка над теми же API. Так же как и устаревшая VB6. Что с одной стороны упрощает жизнь во многих случаях (не надо писать API-простыни), с другой стороны работаешь с "родными" системными контролами и можно если что "подрихтовать" через API. Это очень удобно и менее трудозатратно чем ваять все на чистом API с нуля. Жаль VB6 задвинули, там был именно Native (+ те удобства о которых говорю), без "управляемого кода", что по сути своего рода дурдом, а какие другие варианты.
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39413995
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77а какие другие варианты
c/c++
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39414000
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77а какие другие варианты
c/c++
Где там
Дмитрий77+ те удобства о которых говорю???
20248619
Application.StartupPath
IO.Path.GetDirectoryName(FilePath)
IO.Path.Combine(Directory, "Proga.exe")
В C без всего этого молча вешаешься.

Мож хватит уже из пустого в порожнее переливать.
Моя позиция предельно ясна и аргументирована.

P.S. Но лучше VB6 ничего не было. К сожалению он считай сдох (как минимум сидеть в VB6 студии 98г. выпуска крайне некомфортно).
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39414002
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Моя позиция предельно ясна и аргументирована.
и безнадёжна, говоря шахматным языком
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39414005
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77...WinForms реализует Common Controls в большинстве случаев (Listview, Treview, StatusBar...), обертка над теми же API. Так же как и устаревшая VB6. Что с одной стороны упрощает жизнь во многих случаях (не надо писать API-простыни), с другой стороны работаешь с "родными" системными контролами и можно если что "подрихтовать" через API. Это очень удобно и менее трудозатратно чем ваять все на чистом API с нуля. Жаль VB6 задвинули, там был именно Native (+ те удобства о которых говорю), без "управляемого кода", что по сути своего рода дурдом, а какие другие варианты.
Ну так и используй дНет + ВинФормс.

Им пока конец жизни (EOL) не обещали.

VB6 ровно такой же нативный как и дНет.
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39414006
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНу так и используй дНет + ВинФормс.
Ну дык и использую.

По существу вопроса есть что сказать?
Хотя чего говорить. Решен вопрос во втором посте. Уже имплементировал решение куда надо.
К чему этот базар?
...
Рейтинг: 0 / 0
Цвет текста панелей в StatusBar
    #39414008
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglVB6 ровно такой же нативный как и дНет.
Здесь не согласен.
В VB6 что пишешь, то и получаешь (как и в C). А здесь надо быть начеку из-за того же "мусорщика".
В .Net часты случаи, когда применяешь API, а они не применяются, потому что некий внутренний (не-"найтивный" так сказать) механизм придуманный разработчиками .Net этому мешает (пример тому .Net-овские Tooltip-ы в Listview и Treview, которые мешают воспользоваться найтивными стилями).
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Цвет текста панелей в StatusBar
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]