RGB — работа с цветами консоли

Разработка Far.
Post Reply
User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

RGB — работа с цветами консоли

Post by DrKnS » Tue 26 Jul, 2011 14:16

Возможно, некоторые уже заметили, что актуальные версии Far для внутреннего представления цвета используют не один байт, а немного больше.
Теоретически, это позволяет ассоциировать с любыми элементами интерфейса и любыми знакоместами любые цвета из сабжевой палитры.
Разумеется, это не будет работать в стандартной консоли.

Желающим поиграться с самостоятельным рисованием:

Если изобразите dll с примерно таким интерфейсом (обсуждаемо):

Code: Select all

BOOL GetTextAttributes(FarColor* Attributes)
BOOL SetTextAttributes(const FarColor* Attributes)
BOOL ReadOutput(FAR_CHAR_INFO* Buffer, COORD BufferSize, COORD BufferCoord, SMALL_RECT* ReadRegion);
BOOL WriteOutput(const FAR_CHAR_INFO* Buffer, COORD BufferSize, COORD BufferCoord, SMALL_RECT* WriteRegion);
и, наверное,

Code: Select all

 int GetColorDialog(FarColor* Color, BOOL Centered, BOOL AddTransparent);
(который сведётся к ChooseColor или как там вам удобнее) - то Far вполне сможет её загружать и вызывать, когда надо.

Что делать дальше со свалившимся на вас богатством красок - зависит только от вашей фантазии. :popcorn:
Last edited by HaRT on Tue 26 Jul, 2011 14:16, edited 2 times in total.
Reason: Изменён заголовок Темы

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: RGB

Post by Maximus5 » Tue 26 Jul, 2011 14:30

Еще наверное, хорошо бы функцию типа
void CommitOutput();
чтобы не напрягать попусту GUI

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: RGB

Post by Maximus5 » Tue 26 Jul, 2011 14:32

И еще вопрос. Эта длл-ка будет загружаться как обычныйи плагин, или плодить отдельную, которая, например, будет рядом с Far.exe?

Yegor
Posts: 848
Joined: Mon 04 Apr, 2005 13:41
Location: Kharkov, Ukraine
Has thanked: 2 times
Been thanked: 7 times

Re: RGB

Post by Yegor » Tue 26 Jul, 2011 14:42

Я малость далек от темы, но мне не понятно чьи цвета запрашиваются и возвращаются через:

Code: Select all

BOOL GetTextAttributes(FarColor* Attributes)
BOOL SetTextAttributes(const FarColor* Attributes)
Или Attributes это массив, соответствующий PaletteColors.COL_* ?
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Re: RGB

Post by DrKnS » Tue 26 Jul, 2011 14:43

Maximus5 wrote:Еще наверное, хорошо бы функцию типа
void CommitOutput();
чтобы не напрягать попусту GUI
Зачем? WriteOutput - это прямая замена одноимённой функции из console.cpp.
Т. е. дело до неё и так дойдет только тогда, когда Far будет коммитить, а до этого всё кешируется.
Эта длл-ка будет загружаться как обычныйи плагин, или плодить отдельную, которая, например, будет рядом с Far.exe?
Это концепт, поэтому пока планируется отдельно. А тебе ещё и доступ к api нужен?

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Re: RGB

Post by DrKnS » Tue 26 Jul, 2011 14:52

Yegor wrote:мне не понятно чьи цвета запрашиваются и возвращаются
Текущие цвета консоли.
То, что возвращает GetConsoleScreenBufferInfo и то, что меняет SetConsoleTextAttribute.

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 » Tue 26 Jul, 2011 15:57

WriteOutput - это прямая замена одноимённой функции из console.cpp.
Т. е. дело до неё и так дойдет только тогда, когда Far будет коммитить, а до этого всё кешируется.
Что-то я сомневаюсь, что фар коммитит весь буфер целиком за один вызов... не?

Доступ к api фара не нужен, можно и отдельную длл сплодить.
То, что возвращает GetConsoleScreenBufferInfo и то, что меняет SetConsoleTextAttribute.
Т.е. эти функции оперируют с буфером целиком?
Странно как-то, параметров не хватает... Есть ведь еще и прокрутка? то бишь видимая область или весь буфер?

И еще. Как фар будет менять размер буфера (видимой области)? или это остается на совести gui?

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Re: RGB — работа с цветами консоли

Post by DrKnS » Tue 26 Jul, 2011 17:02

Maximus5 wrote:Что-то я сомневаюсь, что фар коммитит весь буфер целиком за один вызов... не?
Не, только изменившиеся с прошлого коммита участки.
Странно как-то, параметров не хватает... Есть ведь еще и прокрутка? то бишь видимая область или весь буфер?
Размеры видимой области ты можешь узнать сам через winapi, консоль же никуда не делась.
И еще. Как фар будет менять размер буфера (видимой области)? или это остается на совести gui?
А что, он сейчас как-то меняет? Это всё через winapi доступно же.

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 » Tue 26 Jul, 2011 17:48

DrKnS wrote:
Maximus5 wrote:Что-то я сомневаюсь, что фар коммитит весь буфер целиком за один вызов... не?
Не, только изменившиеся с прошлого коммита участки.
Так и я о том же.
10 изменившихся участков -> 10 вызовов Write -> 10 раз обновлен экран в gui
нехорошо

User avatar
HaRT
Moderator
Posts: 8074
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

Re: RGB — работа с цветами консоли

Post by HaRT » Tue 26 Jul, 2011 17:56

Maximus5 wrote:10 вызовов Write -> 10 раз обновлен экран в gui
При грамотном использовании InvalidateRect — ничего страшного.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 » Tue 26 Jul, 2011 19:48

При чем тут InvalidateRect? хуже то, что 10 раз придется гонять данные из одного процесса (консоль) - в другой (gui).
Более того, может случиться так, что фактический Redraw в GUI произойдет в середине обновления консоли, будет весело.

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Re: RGB — работа с цветами консоли

Post by DrKnS » Tue 26 Jul, 2011 20:03

Maximus5 wrote:При чем тут InvalidateRect? хуже то, что 10 раз придется гонять данные из одного процесса (консоль) - в другой (gui).
Винда для своей консоли и так гоняет из одного процесса в другой, вроде никто не жалуется.
Ну и 10 раз там не наберется, 2-3 в среднем.

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 » Tue 26 Jul, 2011 20:39

Почему такое нежелание сделать "красиво"? Жалко один вызов в конце цикла обновления вставить?

Аргументы
У плагинов фара почему-то commit (в виде Text(NULL)) есть. Для чего-то же его делали ;) А ведь плагины тоже только измененные участки в консоль пишут.
В какой момент обновлять (передавать данные) при постоянном обновлении экрана (скроллинг, пробег курсора по панели,...)?
Да и равняться на кривую консоль винды некошерно.

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Re: RGB — работа с цветами консоли

Post by DrKnS » Tue 26 Jul, 2011 20:57

Ok, убедил.

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: RGB — работа с цветами консоли

Post by Maximus5 » Wed 27 Jul, 2011 16:28

На счет аргументов GetColorDialog.
В чем смысл "Centered"?

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Re: RGB — работа с цветами консоли

Post by DrKnS » Wed 27 Jul, 2011 16:33

Сравни настройки цветов и раскраску файлов.

Post Reply

Return to “Development”