Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Цвет текста панелей в StatusBar / 13 сообщений из 13, страница 1 из 1
02.03.2017, 15:20
    #39413183
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
С чем только не ковырялся, но этого никогда не делал.

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

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

Неохота конечно этим заниматься.
Думал, есть готовые "свойства".
...
Рейтинг: 0 / 0
03.03.2017, 00:20
    #39413432
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
Ну, вопрос в принципе решаем как раз через 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
03.03.2017, 00:32
    #39413436
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
Дмитрий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
03.03.2017, 01:01
    #39413438
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
Да не, похоже это единственный грамотный способ.
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
03.03.2017, 09:50
    #39413511
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
Дмитрий77,

Ночью надо спать, а статусбары раскрашивать!
...
Рейтинг: 0 / 0
03.03.2017, 19:01
    #39413923
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
Дмитрий77, походу, всё на WinAPI делает, нафига ему тогда WinForms не понятно :) помню он и на WPF с WinAPI пытался делать :)
...
Рейтинг: 0 / 0
03.03.2017, 22:09
    #39413973
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
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
04.03.2017, 00:58
    #39413995
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
Дмитрий77а какие другие варианты
c/c++
...
Рейтинг: 0 / 0
04.03.2017, 01:35
    #39414000
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
ИзопропилДмитрий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
04.03.2017, 01:57
    #39414002
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
Дмитрий77Моя позиция предельно ясна и аргументирована.
и безнадёжна, говоря шахматным языком
...
Рейтинг: 0 / 0
04.03.2017, 02:37
    #39414005
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет текста панелей в StatusBar
Дмитрий77...WinForms реализует Common Controls в большинстве случаев (Listview, Treview, StatusBar...), обертка над теми же API. Так же как и устаревшая VB6. Что с одной стороны упрощает жизнь во многих случаях (не надо писать API-простыни), с другой стороны работаешь с "родными" системными контролами и можно если что "подрихтовать" через API. Это очень удобно и менее трудозатратно чем ваять все на чистом API с нуля. Жаль VB6 задвинули, там был именно Native (+ те удобства о которых говорю), без "управляемого кода", что по сути своего рода дурдом, а какие другие варианты.
Ну так и используй дНет + ВинФормс.

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

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

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


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