Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2018, 20:41   #21
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Куда рисует символ в буфер ли на экран.
А какая разница? Код один и тот же.

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Что представляет собой ClientArea? Если это буфер, его размеры проблематично изменить,
Нет это не буфер. Вы же сами написали рабочее пространство - это оно и есть. Это объект используя идиому MVC его можно отнести к контролёру.
При изменении своих размеров он сверяет свои размеры с окном и при необходимости у полос прокрутки выставляет и снимает флаг Visible.

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Если объект хотя бы частично на экране, то он прорисовывается полностью:
Зачем? Так у вас будет большой расход по памяти и скорости.
Какой объект? Если контрл, то у него несколько виджетов и он сам проверяет какой из них виден. К примеру полоса прокрутки состоит из 2-х кнопок и ползунка.
А так как операция проверки однотипная у разных контролов, то используют оргонайзеры в QT: QGridLayout, QHBoxLayout и QVBoxLayout.
Оргнонайзер проверяет видимость виджетов и вызывает для них Draw.
Они считывают свои Pen и Brush и засылают указатель на них в холст (canvas). Так же передают свои размеры в качестве ViewFrame. Далее вызывают отрисовку примитива.
Которая проверяет попадания частей примитива в ViewFrame.
canvas тут не добавлял но он просто добавляется.
Код:
{рисуем горизонтальную линию}
procedure SpanMono(x1,x2,y:Integer; Color:Byte);
var x:Integer;
 yy:Word;
begin
yy:=Word(y)*Width;
for x:=x1 to x2 do
 Buffer^[yy+x]:=Color;
end;

{Рисуем закрашенный прямоугольник}
procedure FillRectangle(x1,y1,x2,y2:Integer; Color:Byte);
var j:Integer;
w,h:Integer;
begin
// обрезаем по размеру кадра, вернее ViewFrame.
w:=x2-x1;
h:=y2-y1;
if (w<0) then
 begin
 j:=x1; x1:=x2; x2:=j;
 w:=-w;
 end;
if (h<0) then
 begin
 j:=y1; y1:=y2; y2:=j;
 h:=-h;
 end;

if (y1<0) then
 begin
 h:=h+y1;
 y1:=0;
 end;
if (y1<ViewFrame.Height) and (y1+h>=ViewFrame.Height) then  h:=ViewFrame.Height-y1;

if (x1<0) then
 begin
 w:=w+x1;
 x1:=0;
 end;
if (x1<ViewFrame.Width) and (x1+w>=ViewFrame.Width) then  w:=ViewFrame.Width-x1;
if (x1>=ViewFrame.Width )then w:=-1;
if (y1>=ViewFrame.Height) then h:=-1;

// Вывод
for j:=0 to h do
 SpanMono(x1,x1+w,j+y1,Color);
end;
Если хотите уйти от написания Draw для каждого Widget, то всё многообразие фигур можно описать одной фигурой PolyShape (PolyGons).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 30.10.2018, 23:13   #22
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
512х240, один цвет (бумага, чернила) на линию в 8 точек из 16 цветов. это 2 страницы памяти (32 кб) выше 64 кб.
Процессор Z80, частота 3.5Мгц, турбо 14Мгц.
Спектрум или Комодор?
С Зэд-80 не знаком, даташит говорит одна инструкция занимает 10-16 тактов, это 200-350тыс. операций в секунду – Ооочень медленно, особенно учитывая отсутствие аппаратного умножения и деления, на одну команду которого придётся до пары сотен инструкций.

Похоже Ваш выбор: Асм, Си, Паскаль. На ассемблере я вижу препятствие с MUL, DIV, MOD... числа с плав.запятой, их вывод в 10-ю систему и т.п.
Чистый Си не поддерживает ООП, либо с++ либо костыли. Значит паскаль:

Цитата:
Куда рисует символ в буфер ли на экран.
Write[Char/buf] - всегда рисуют в буфер выделенный в памяти.

*
Цитата:
Давайте определимся с термином: Что такое буфер?
Var Buffer: Pointer;
GetMem(Buffer, Width*Height);
И только самый верхний контейнер (РабочийСтол) не выделяет памяти.
Код:
CONSTRUCTOR Desktop.Init;
BEGIN
  ...
  Buffer:= Ptr(ScreenSegment, ScreenOffset);
  ...
END;
Цитата:
Что значит "компонент виден на экране"? Он должен быть полностью на экране или частично?
если видно хоть один пиксель компонента, т.е. он не перекрыт окном, функция должна выдать тру. В целом это очень сложная функция, поэтому делай костыль чтоб всегда возвращала тру.

Цитата:
ципочку отрисовки?
Цыпочка, ох какая цыпочка
Как-то так
Код:
procedure TContainer.Draw;
  procedure DrawAll(PComp: PComponent); far;
  begin 
     PComp^.Draw;
  end;
begin
  ForEach(@DrawAll);
  Owner^.DrawBuf(top, left, width, height, buffer);
end;
Тобиш: буфер имеет только контейнер и его наследники. Он выделяет под него память, далее запускает Draw всех объектов которые он имеет, т.о. буфер зарисован, далее он отсылает свой буфер вышестоящему контейнеру по иерархии, т.е. своему хозяину.

Цитата:
Что делать с частичным перекрытием окон/элементов?
Не заморачиваться, элементы рисуются в прямом или обратном порядке добавления на форму/окно/стол.

Цитата:
Что представляет собой ClientArea?
см. рис.

Цитата:
Так коечная реализация будет на асме, это проблематично
Для начала надо наваять нечто рабочее на ПК, чтоб понять что куда как и зачем.
Если качественно - ООП, иначе с морганием и дикими тормозами, как от автора BSS на кубэйсике.

Цитата:
я даже Turbo Vision'ом не могу воспользоваться на прямую, так как ему нежно 670Мб
ДАЛАДНА!!!!11аадин


В общем это только лёгкая верхушечка, дальше будут заморочки с метками фокуса, активных, выбранных эл-в.


Так что за платформа? Своя собственная или ретро из 80-х?
Изображения
Тип файла: jpg F07zg03.JPG (21.9 Кб, 55 просмотров)

Последний раз редактировалось jillitil; 30.10.2018 в 23:16.
jillitil вне форума Ответить с цитированием
Старый 31.10.2018, 06:02   #23
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Держи Turbo Vision. Использовать совместно с Turbo Pascal 6.0
Вложения
Тип файла: zip TVISION.ZIP (121.8 Кб, 9 просмотров)
Тип файла: zip DOCDEMOS.ZIP (44.8 Кб, 10 просмотров)
Тип файла: zip ONLINE.ZIP (53.1 Кб, 10 просмотров)
Тип файла: zip DEMOS.ZIP (30.4 Кб, 10 просмотров)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 31.10.2018, 13:18   #24
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от jillitil Посмотреть сообщение
Спектрум или Комодор?
Клон Спектрума - Spectrum Profi. Разрабатывался с 1991 в Москве. Последняя официальная версию 5.03. Особенность, состоит из двух плат: плата процессора и плата периферии.
В 2016 Solegstar (Харьков) подготовил новую версию обеих плат 5.06 (плата процессора и плата периферии). Исправил известный проблемы, добавил выход SVGA, "стандартные" мышь и клаву, винт по двух схема, 5 разных музыкальных расширений (19 независимых каналов) и т.п.
В тот же год Вадим Чертков (Курган) выпустил новую версию своей ОС PQ-Dos, она основана на одной из последних версий CP/M с добавлением возможностей MSX-dos и MSX-dos2 (получив частичную совместимость с ними). Итоговый вариант можно назвать MS-DOS на z80. На винте FAT32, размер раздела до 2 терабайт, файлы до 4 Гб, каталоги, понятие процесс, весь код был переписан, что позволило его резко ускорить и пр.

Параллельно с текущей темой прорабатываю "Менеджер переменных", который позволит создавать и работать с переменными в верхней (страничной) памяти. В том числе планируется работа со свапом, тогда максимальный объем общей памяти под переменные будет 1Гб и до 4гб на переменную в случае её выгрузки в отдельный файл. Всё это явно превосходит любые потребности.
Он пока так же на стадии проработки идеи, остались не понятны буквально 2-3 момента.

Цитата:
Сообщение от jillitil Посмотреть сообщение
С Зэд-80 не знаком, даташит говорит одна инструкция занимает 10-16 тактов, это 200-350тыс. операций в секунду – Ооочень медленно, особенно учитывая отсутствие аппаратного умножения и деления, на одну команду которого придётся до пары сотен инструкций.
Самые быстрые команды 4 такта, среднее время 8-12 тактов, есть команды и по 21 такту.
Для режима Спектрум базовая частота 3.5Мгц, в режиме Profi обязателен турбо режим (на разных машинах 7 или 14Мгц).

Цитата:
Сообщение от jillitil Посмотреть сообщение
Похоже Ваш выбор: Асм, Си, Паскаль. На ассемблере я вижу препятствие с MUL, DIV, MOD... числа с плав.запятой, их вывод в 10-ю систему и т.п.
Большинство задач на асме уже решены, есть сборник где собраны основные решения. Базовую часть операций над переменными планируется реализовать в "Менеджере переменных".

Цитата:
Сообщение от jillitil Посмотреть сообщение
Тобиш: буфер имеет только контейнер и его наследники. Он выделяет под него память, далее запускает Draw всех объектов которые он имеет, т.о. буфер зарисован,
Тут у меня проблемы с логикой работы.
У контейнера можно выделить две особенности:
1) Его физический размер (физический, логический) зависит от элементов его наполняющих. То есть в начале обработке не известен и может быть больше рабочего размера окна.
2) У него могут быть пустые места, не заполненные элементами, которые нужно (в будущем) залить фоном.

Цитата:
Сообщение от jillitil Посмотреть сообщение
далее он отсылает свой буфер вышестоящему контейнеру по иерархии, т.е. своему хозяину.
Он отсылает ссылку или буфер целиком? "Хозяин" будет встраивать в свой свой буфер ссылку или всю информацию целиком.

Так размеры контейнера заранее неизвестны и зависят от размеров наполняющих его элементов, а они в свою очередь зависят от своего содержимого и от размеров окружающих элементов, то придется делать двух проходную обработку. На первом проходе независимо обработать те элементы размеры которых зависят только от содержимого и учесть координаты их размещения, на втором проходе обработать сам контейнер и элементы размеры которых зависят от размера контейнера и окружающих элементов. А может второй проход разделить на два: для элементов и для контейнера.

Если графика храниться на уровне контейнера, в ней учитывается и "пустые" места. Почему нельзя хранить графику на уровне элементов? Тогда заливку пустых мест можно не хранить, а переложить на программу отрисовки.

Так же хотел передавать "на верх" только размеры буфера ширина/высота (для их учета в буфере родителя) и ссылку на него (по ней можно забрать информацию). Это позволит хранить информацию о буфере один раз и не перекидывать информацию с места на место.
Или предполагается, что после вставки в родительский буфер, буфер контейнера удалятся?

Цитата:
Сообщение от jillitil Посмотреть сообщение
Не заморачиваться, элементы рисуются в прямом или обратном порядке добавления на форму/окно/стол.
Да. Но как они рисуются? Физически? Тогда огромны расход времени на прорисовку невидимых частей.
По этому я предполагал логическую прорисовку (создания образа экрана), а потом физическую только тех частей что видно.
Это не избавляет от затрат памяти на полного хранения в графике всех окон, что видны на экране.

Цитата:
Сообщение от jillitil Посмотреть сообщение
ДАЛАДНА!!!!11аадин
Ну, "за что купил, за то и продаю". Проверить возможности пока нет.

Цитата:
Сообщение от Pavia Посмотреть сообщение
А какая разница? Код один и тот же.
Для Спектрума разница есть. Экран у него имеет не линейную структуру, а буфера нужно делать линейными.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Зачем? Так у вас будет большой расход по памяти и скорости.
Не всегда можно определить внешний вывод виджета/элемента без его полной перестройки. Не всё можно решить примитивами.
Предположим создали кнопку с надписью "Отмена". Размер кнопки может быть фиксированный (больше/меньше размера надписи) или произвольный (заполоняем всё свободное пространство) надпись по центру/слева/справа. И мы видим либо только правую часть кнопки или только середину. Как вывести графику без полной прорисовки кнопки? Да рамки выводим примитивам, но как быть с текстом или иконкой?
А ведь есть более сложные объекты, например таблицы с выводом графики в ячейки.
Да лишние расходы. С памятью ни чего сделать нельзя (только удалять информацию у объектов которые ушли с экрана). Времяные расходы оптимизировать тем, что прорисовывать объекты при первом выводе и при обновлении самого объекта (и только той информации, которая была изменена).
Решение одно - разумное проектирование данных для вывода.

Спасибо, за иллюстрацию, она поможет.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Держи Turbo Vision. Использовать совместно с Turbo Pascal 6.0
Спасибо, но только я могу воспользоваться максимум Turbo Pascal 3.0
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 31.10.2018, 16:33   #25
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Не всегда можно определить внешний вывод виджета/элемента без его полной перестройки.
Компьютер это машина состояний поэтому всегда можно определить. И этим стоит пользоваться. Исключение квантовые компьютеры.
Поэтому размеры всегда известны и этим и пользуются. Если они неизвестны, то они вычисляются по мере необходимости. Приходит сигнал(событие) вызывается метод он вызывает алгоритм вычисления. Допустим, пришёл сигнал на максимизации окна идёт пересчёт размера и положения контролов. А те в свою очередь пересчитывают размеры виджетов.

Цитата:
Сообщение от tae1980 Посмотреть сообщение
И мы видим либо только правую часть кнопки или только середину. Как вывести графику без полной прорисовки кнопки?
Как я уже показал на примере прямоугольника. Точно такие же отсечения делаются для текста, иконок и других примитивов.

Основная проблема в вашем методе в том, что если делать один буфер для контрла, а потом внём рисовать а потом его выводить. То пользователь будет долго ждать пока вы весь его заполните. Это очень долго. Допустим вы это решите при помощи псевдомногозадачности и флагов которые будут показывать готовность строки-буфера.

Так вот останется вторая проблема это то, что такие буферы потребуются для всех контролов, а их у вас много и весят они у вас постоянно в памяти.

Цитата:
Сообщение от tae1980 Посмотреть сообщение
А ведь есть более сложные объекты, например таблицы с выводом графики в ячейки.
Изучите как оно работает в дельфи. Вначале определяются видимые строки и только они вы водятся. Это 10 условий по 10 - 20 тактов на каждое . Вы дольше будете рисовать одну букву в вашем буфере.
Так вот после того как видимые строки определены проходят по ним определяют видимые ячейки. Ячейки выводят DrawCell либо DrawVirtualCell.
Перед от рисовкой каждой ячейки в canvas.ClipRect заносится размеры и положения этой самой ячейки, её Frame.
При выводе текста в ячейку если текст моноширинный, то берут длину самой большой буквы "W" и вычисляют количество видимых символов. Их и рисуют. Если есть автоперенос слов, то продолжают рисовать с новой строчки. Если нету то выходят из метода.
При выводи буквы canvas.ClipRect применяется для расчёта отсечения.Как было ранее показано на примере с ViewFrame.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 31.10.2018 в 16:36.
Pavia вне форума Ответить с цитированием
Старый 31.10.2018, 17:03   #26
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
я могу воспользоваться максимум Turbo Pascal 3.0
Вопрос: ООП реализован? Карты таро говорят нет, значит дальше продолжать обсуждать в этом направлении не стоит.
По прежнему паскаль предоставляет работу с кучей, так что надежда ещё есть. Придётся мутить с типизированными данными и массивами для хранения элементов/компонентов.
*****************************
Цитата:
Тут у меня проблемы с логикой работы.
У контейнера можно выделить две особенности:
1) Его физический размер (физический, логический) зависит от элементов его наполняющих. То есть в начале обработке не известен и может быть больше рабочего размера окна.
Не понял что значит физ. и логич. размер? Размер в байтах в памяти смотрим через SizeOf().
Код:
TComponent = object
  Top, Left, Width, Height: Integer;
  var1, var2: Byte;
end;
TContainer = object(TComponent)
  First: PComponent; {это указатель, допустим размер = 4}
end;
Т.о. размер комп. равен 10 байт, размер конт. = 14 байт.
Owner, Next: PComponent;

Цитата:
2) У него могут быть пустые места, не заполненные элементами, которые нужно (в будущем) залить фоном.
Пустые места зарисовываются самим контейнером ClientArea, компоненты типа StaticText могут заполнять свою область, а могут и нет если постоянно происходит перерисовка всех компонентов на clientArea.
Cм. рис.

Цитата:
Он отсылает ссылку или буфер целиком?
Что значит целиком? Мы всегда работаем с указателями.

Цитата:
Так размеры контейнера заранее неизвестны
Границы всегда известны. Если происходит выход за границы, часть отсекается.
Вопрос был про "из чего состоит окно". Так вот именно в окне есть особый элемент ClientArea, именно он умеет расширятся если у него есть элементы за границами. Да, придётся перерисовывать дважды или трижды или много раз, если элементы на нём за границей. Тут ответственность на дизайнере.

Цитата:
Или предполагается, что после вставки в родительский буфер, буфер контейнера удалятся?
Можно и так. Тогда свободной оперативки будет больше.
На практике каждый контейнер имеет флаг выделен ли у него буфер, если нет, то передает наверх
....
Изображения
Тип файла: gif window_disasn.gif (72.4 Кб, 140 просмотров)
jillitil вне форума Ответить с цитированием
Старый 31.10.2018, 17:40   #27
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Спасибо!
Я возьму не много времени, что бы всё обдумать.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание графического интерфейса drag'n'drop genaveng WPF, UWP, WinRT, XAML 5 06.07.2013 21:58
Инструменты изменения графического интерфейса контролов Smogg Win Api 6 24.12.2012 07:42
Какую библиотеку графического интерфейса выбрать? demigod82 Visual C++ 3 22.04.2012 12:24
Тормоза при отработке графического интерфейса sergey113 Помощь студентам 10 23.03.2011 12:51
Написание графического интерфейса zhuravlov Фриланс 3 04.01.2011 21:54