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
      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;
[/code]

Автор:  Илья Ермаков [ Вторник, 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 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Вот правильное решение: ...

Спасибо :). Я пробовал уже обрабатывать и MarkMsg и реализовывал методы RestoreMark и HandleViewMsg - по примеру StdRuler, запутался и реализовал так, как привык:
Код:
| 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 домены уже разные :shock:. Возможно, не очень корректно вставлять текстовую модель в свою, и лучше её вставить в свою вьюшку, а изменять эту текстовую модель в PROCEDURE (v: StdView) HandleModelMsg....

Автор:  Илья Ермаков [ Среда, 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;

Ещё не понятно (и если б только это... :lol: ), для чего параметр focus в процедуре Views.InstallFrame. Я же всё равно могу передать фокус этой встроенной рамке, даже если Views.InstallFrame(f, v.textView, x, y, 0, FALSE).
Цитата:
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/