OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 21 Май, 2024 00:53

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Фокус и прозрачность
СообщениеДобавлено: Вторник, 14 Ноябрь, 2006 17:53 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
1. Создал свой контрол - прямоугольник, который меняет свой цвет при каждом нажатии на него мышкой. Размещаю этот контрол на форме. Как узнать, находится ли сейчас мой контрол в фокусе и в процедуре Restore нарисовать рамку, если он в фокусе?

2. Можно ли создавать частично прозрачные вьюшки? Или это можно сделать только через WinApi?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 14 Ноябрь, 2006 22:05 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вот правильное решение:

Код:
   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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
По поводу прозрачности - вы имеете в виду полупрозрачность, то есть, альфа-канал?
Встроенной возможности в ББ нет.
Однако ее можно довольно легко докрутить, не меняя ни конкретных отображений, ни Host, ни стандартных модулей - написав свой тип кадров (Frames).
Я бы это попробовал сделать, меня альфа тоже заинтересовала, однако что-то не нашел информации о необходимых WinApi-функциях - у меня SDK старый. Насколько я понимаю, должно быть нечто вроде AlphaBlt.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 15 Ноябрь, 2006 11:14 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
меня альфа тоже заинтересовала, однако что-то не нашел информации о необходимых WinApi-функциях - у меня SDK старый.


msdn.microsoft.com? ;)

Илья Ермаков писал(а):
Насколько я понимаю, должно быть нечто вроде AlphaBlt.


AlphaBlend. Но если нужна прозрачность для всего окна (HWND), то есть более удобные функции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 15 Ноябрь, 2006 17:18 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Илья Ермаков писал(а):
Вот правильное решение: ...

Спасибо :). Я пробовал уже обрабатывать и 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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
По поводу автоскроллинга текстовой модели...
Возможно, нужно использовать метод Append текстовой модели, дополняя ее сразу блоками текста, как это делает StdLog?
В любом случае, принудительно показать хвост можно:
pos := text.Length();
TextViews.ShowRange(text, pos, pos, TextViews.any);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 15 Ноябрь, 2006 22:17 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
По поводу доменов - объясните подробнее, что имеете в иду, я чего-то к ночи торможу непомерно :-)

Там такой нюанс, что Join(a, b) - это еще не значит, что у a и b будут домены. Домен может инициализироваться потом, просто он будет один на всех. Если не запамятовал...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 16 Ноябрь, 2006 14:41 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Илья Ермаков писал(а):
По поводу автоскроллинга текстовой модели...
Возможно, нужно использовать метод 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)

А это обязательно попробую! Спасибо!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB