OberonCore https://forum.oberoncore.ru/ |
|
Фокус и прозрачность https://forum.oberoncore.ru/viewtopic.php?f=24&t=337 |
Страница 1 из 1 |
Автор: | Cardinal [ Вторник, 14 Ноябрь, 2006 17:53 ] |
Заголовок сообщения: | Фокус и прозрачность |
1. Создал свой контрол - прямоугольник, который меняет свой цвет при каждом нажатии на него мышкой. Размещаю этот контрол на форме. Как узнать, находится ли сейчас мой контрол в фокусе и в процедуре Restore нарисовать рамку, если он в фокусе? 2. Можно ли создавать частично прозрачные вьюшки? Или это можно сделать только через WinApi? |
Автор: | Илья Ермаков [ Вторник, 14 Ноябрь, 2006 22:05 ] |
Заголовок сообщения: | |
Вот правильное решение: Код: TYPE [/code]
View = POINTER TO RECORD (Views.View) showBorder: BOOLEAN END; PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); VAR w, h: INTEGER; BEGIN v.context.GetSize(w, h); IF v.showBorder THEN f.DrawRect(0, 0, w, h, 0, 0FF0000H) END END Restore; PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View); BEGIN WITH msg: Controllers.MarkMsg DO v.showBorder := msg.show; Views.Update(v, Views.keepFrames) ELSE END END HandleCtrlMsg; |
Автор: | Илья Ермаков [ Вторник, 14 Ноябрь, 2006 22:26 ] |
Заголовок сообщения: | |
По поводу прозрачности - вы имеете в виду полупрозрачность, то есть, альфа-канал? Встроенной возможности в ББ нет. Однако ее можно довольно легко докрутить, не меняя ни конкретных отображений, ни Host, ни стандартных модулей - написав свой тип кадров (Frames). Я бы это попробовал сделать, меня альфа тоже заинтересовала, однако что-то не нашел информации о необходимых WinApi-функциях - у меня SDK старый. Насколько я понимаю, должно быть нечто вроде AlphaBlt. |
Автор: | Vlad [ Среда, 15 Ноябрь, 2006 11:14 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): меня альфа тоже заинтересовала, однако что-то не нашел информации о необходимых WinApi-функциях - у меня SDK старый. msdn.microsoft.com? ![]() Илья Ермаков писал(а): Насколько я понимаю, должно быть нечто вроде AlphaBlt.
AlphaBlend. Но если нужна прозрачность для всего окна (HWND), то есть более удобные функции. |
Автор: | Cardinal [ Среда, 15 Ноябрь, 2006 17:18 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Вот правильное решение: ... Спасибо ![]() Код: | msg: Controllers.TrackMsg: v.select := ~v.select Илья Ермаков писал(а): По поводу прозрачности - вы имеете в виду полупрозрачность, то есть, альфа-канал? ... Да, это и имел в виду. Что эту полупрозрачность нужно реализовать через свой фрейм - эт я догадался. Только функций WinApi не для целого окна не знаю. Кстати, вопрос ещё один ![]() Код: MODULE TestModels;
TYPE StdModel = POINTER TO RECORD (Model) textModel-: TextModels.Model END; .... PROCEDURE (m: StdModel) SomeProc; VAR f: TextMappers.Formatter; BEGIN f.ConnectTo(m.textModel); f.WriteString('SomeProc'); f.WriteLn; m.text.RestoreDomain(m.text.Domain()) END SomeProc; .... PROCEDURE New* (): Model; VAR m: StdModel; BEGIN NEW(m); m.textModel := TextModels.dir.New(); RETURN m END New; END TestModels. MODULE TestViews; TYPE StdView = POINTER TO RECORD (View) textView: TextViews.View END .... PROCEDURE New* (): View; VAR v: StdView; BEGIN NEW(v); ... Stores.Join(v, m); v.textView := TextViews.dir.New(m.textModel); RETURN v END New; END TestViews. Хочу, чтобы текстовая вьюшка скроллировалась автоматически при изменении текстовой модели - также как и StdLog. Я пробовал по-разному применять методы вроде Stores.Join(v.textView, m.textModel), Stores.InitDomain(m.textModel) и разные их комбинации в процедурах New() для модели и вьюшки, но скроллирования v.textView не добился. А в ходе экспериментов осталось непонятным для меня следующее: в процедуре TestViews.New все модели и вьюшки разделяют один домен (это получается сделать), в процедуре Restore домены уже разные ![]() |
Автор: | Илья Ермаков [ Среда, 15 Ноябрь, 2006 22:12 ] |
Заголовок сообщения: | |
По поводу автоскроллинга текстовой модели... Возможно, нужно использовать метод Append текстовой модели, дополняя ее сразу блоками текста, как это делает StdLog? В любом случае, принудительно показать хвост можно: pos := text.Length(); TextViews.ShowRange(text, pos, pos, TextViews.any); |
Автор: | Илья Ермаков [ Среда, 15 Ноябрь, 2006 22:17 ] |
Заголовок сообщения: | |
По поводу доменов - объясните подробнее, что имеете в иду, я чего-то к ночи торможу непомерно ![]() Там такой нюанс, что Join(a, b) - это еще не значит, что у a и b будут домены. Домен может инициализироваться потом, просто он будет один на всех. Если не запамятовал... |
Автор: | Cardinal [ Четверг, 16 Ноябрь, 2006 14:41 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): По поводу автоскроллинга текстовой модели... Возможно, нужно использовать метод Append текстовой модели, дополняя ее сразу блоками текста, как это делает StdLog? Я делал Append (правда, с пустой добавляемой моделью) - не заработало, , списал на то, что текстовая модель и текстовая вьюшка не в одном домене. Пытался их объединить, это получилось только в процедуре инициализации: Код: PROCEDURE (v: StdView) Restore (...); BEGIN (* а здесь textView и textModel в РАЗНЫХ ДОМЕНАХ *) ... Views.InstallFrame(f, v.textView, x, y, 0, TRUE); ... END Restore; PROCEDURE New* (m: TestModels.Model): View; VAR v: StdView; BEGIN NEW(v); v.model := m; Stores.Join(v, m) v.textView := TextViews.dir.New(m.textModel); (* здесь textView и textModel в одном домене *) END New; Ещё не понятно (и если б только это... ![]() Цитата: pos := text.Length();
TextViews.ShowRange(text, pos, pos, TextViews.any) А это обязательно попробую! Спасибо! |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |