Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 03:36

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Виртуальные кнопки для Protona
СообщениеДобавлено: Пн июн 18, 2007 13:39 
Виртуальные кнопки для Protona.
Все обновления будут лежать здесь же. :)
Минимальный (джентельменский) набор, для кнопок.
Есть пример создания кнопок.
* 19.06.2007
Все создаваемые кнопки автоматически прописываются в массиве указателей кнопок. Теперь не надо в слово "РисоватьКнопки" вручную их все записывать.
* 21.06.2007
Добавлено слово .PRINT для написания текста с прозрачным фоном
* 03.07.2007
Оформлено в виде библиотеки. Немного переделано слово "СоздатьКнопку"

Библиотека Graph.fpm:

Код:
: DUPS // Arr[1..M] M --> Arr[1..M] Arr[1..M]
DUP 0 DO
  DUP PICK SWAP
LOOP
DROP
;

: 2DUPS // a b --> a b a b
OVER OVER
;

: DROPS // Arr[1..M] M -->
0 DO DROP LOOP
;

// Графика
: RGB-> // Color --> R G B
65536 /MOD
256 /MOD
ROT ROT SWAP
;

: Box // x y ширина высота цвет -->
4 PICK 4 PICK
2 DUPS
6 PICK 5 PICK HLINE
3 PICK 3 PICK VLINE
4 PICK 3 PICK + 4 PICK 3 PICK 1+ 3 PICK VLINE
4 PICK 4 PICK 3 PICK + 4 PICK 1+ 3 PICK HLINE
5 DROPS
;

: FillBox // x y ширина высота цвет -->
3 PICK 2 PICK + 4 PICK DO
  4 PICK I 4 PICK 3 PICK HLINE
LOOP
5 DROPS
;

: Gradient // Percent Color1 Color2 --> Color
           // Переход от цвета1 к цвету2
           // Percent - 0..100
SWAP RGB->
3 PICK RGB-> // DS: Percent Color2 R1 G1 B1 R2 G2 B2
3 PICK - 7 PICK * 100 / 3 PICK + 3 XCHG DROP // DS: Percent Color2 R1 G1 Bnew R2 G2
3 PICK - 6 PICK * 100 / 3 PICK + 3 XCHG DROP // DS: Percent Color2 R1 Gnew Bnew R2
3 PICK - 5 PICK * 100 / 3 PICK + 3 XCHG DROP // DS: Percent Color2 Rnew Gnew Bnew
RGB
2 XCHG DROP DROP
;

: GradientBox // x y ширина высота цвет1 цвет2 -->
  4 PICK 3 PICK + 5 PICK DO
  5 PICK I // x i
  5 PICK   // ширина
  OVER 8 PICK - 100 * 6 PICK / // Percent=(i-y)/высота
  5 PICK 5 PICK Gradient // Percent цвет1 цвет2 --> color
  HLINE
LOOP
6 DROPS
;

: +X // n -->
WHERETEXTXY ROT ROT + SWAP TEXTXY
;

: +Y // n -->
WHERETEXTXY ROT + TEXTXY
;

-1 VALUE TextOpaque
-1 VALUE BackOpaque

// Печать текста с прозрачным фоном
// Работает аналогоично слову PRINT
: .PRINT // p --->
DUP C@ IF
  BEGIN
  DUP C@ 16 * SYMBOLS +
   16 0 DO
    DUP I + C@
    0x80
    8 0 DO
     OVER OVER AND IF
      TextOpaque NOT IF WHERETEXTXY GETCOLOR PIXEL THEN
     ELSE
      BackOpaque NOT IF WHERETEXTXY GETBGCOLOR PIXEL THEN
     THEN
     2/
     1 +X
    LOOP
    DROP DROP
    -8 +X
    1 +Y
   LOOP
   DROP
   8 +X
   -16 +Y
  1+ DUP C@ 0 = UNTIL
THEN
DROP
;

: strLen // p --> len
0
OVER C@ IF
  BEGIN 1+ OVER OVER + C@ 0 = UNTIL
THEN
SWAP DROP
;

: gPRINT // p -->
DUP strLen
WHERETEXTXY ROT // x y len
8 * 16
GETCOLOR GETBGCOLOR
GradientBox

BackOpaque TextOpaque GETBGCOLOR
  0 TO BackOpaque
-1 TO TextOpaque
3 PICK .PRINT
SETBGCOLOR TO TextOpaque TO BackOpaque
DROP
;


Библиотека самих кнопок
Код:
" Graph.fpm" L

: FIELD
CREATE
  OVER , +
DOES>
@ +
;

: int
4 FIELD
;

0
int ->кнХ
int ->кнУ
int ->кнШирина
int ->кнВысота
int ->кнРаботай
int ->кнНадпись
int ->кнЦвет1
int ->кнЦвет2
CONSTANT Кнопка

100 VALUE MaxButtons
QUAN CurButtons
CREATE Buttons[] MaxButtons 4 * ALLOT

: СоздатьКнопку // IT: str -->
HERE
CREATE Кнопка ALLOT
25 OVER ->кнХ !
25 OVER ->кнУ !
96 OVER ->кнШирина !
32 OVER ->кнВысота !
0xBFBFBF  OVER ->кнЦвет1 !
0x707070  OVER ->кнЦвет2 !
" Button" OVER ->кнНадпись !
['] NOOP  OVER ->кнРаботай !
CurButtons
  SWAP OVER 4 * Buttons[] + !
1+ TO CurButtons
;

0 CONSTANT обычную
1 CONSTANT подсвеченую
2 CONSTANT нажатую

QUAN кнАдрес
QUAN dbLigth
: КнопкуРисуй // addr Подсвечивать? -->
TO dbLigth
TO кнАдрес

кнАдрес ->кнХ @
кнАдрес ->кнУ @
кнАдрес ->кнШирина @
кнАдрес ->кнВысота @
dbLigth обычную = NOT IF
  0xFFFFFF
ELSE
  50
  кнАдрес ->кнЦвет1 @
  кнАдрес ->кнЦвет2 @
  Gradient
THEN
FillBox

кнАдрес ->кнХ @ 3 +
кнАдрес ->кнУ @ 3 +
кнАдрес ->кнШирина @ 6 -
кнАдрес ->кнВысота @ 6 -
кнАдрес ->кнЦвет1 @
кнАдрес ->кнЦвет2 @
dbLigth нажатую = IF SWAP THEN
GradientBox

// Надпись на кнопке
кнАдрес ->кнХ @ 15 +
кнАдрес ->кнУ @ кнАдрес ->кнВысота @ SHR SHR +
TEXTXY
50 кнАдрес ->кнЦвет1 @ кнАдрес ->кнЦвет2 @ Gradient SETBGCOLOR
0x000000 SETCOLOR
-1 TO BackOpaque
  0 TO TextOpaque
  кнАдрес ->кнНадпись @ .PRINT
  0 TO BackOpaque
0x000000 SETBGCOLOR
0x00FF00 SETCOLOR
;

: ПроверитьКнопку // addr --> 0 | -1
TO кнАдрес
0
MOUSE-X @
кнАдрес ->кнХ @ DUP
кнАдрес ->кнШирина @ +
WITHIN IF
  MOUSE-Y @
  кнАдрес ->кнУ @ DUP
  кнАдрес ->кнВысота @ +
  WITHIN IF
   DROP -1
  THEN
THEN
;

: Нажата? // addr -->
DUP ПроверитьКнопку IF
  DUP нажатую КнопкуРисуй
  ->кнРаботай @ EXECUTE
ELSE DROP THEN
;

: Подсветить? // addr -->
DUP ПроверитьКнопку IF
  подсвеченую КнопкуРисуй
ELSE DROP THEN
;

: РисоватьКнопки
CurButtons IF
  CurButtons 0 DO
   Buttons[] I 4 * + @ обычную КнопкуРисуй
  LOOP
THEN
;

: ЧтоНажато? // -->
CurButtons IF
  CurButtons 0 DO
   Buttons[] I 4 * + @ Нажата?
  LOOP
THEN
;

: ЧтоПодсветить? // -->
CurButtons IF
  CurButtons 0 DO
   Buttons[] I 4 * + @ Подсветить?
  LOOP
THEN
;

: LeftClick
РисоватьКнопки
ЧтоНажато?
;
' LeftClick TO <MOUSE_LEFT>

: MouseMove
РисоватьКнопки
ЧтоПодсветить?
;
' MouseMove TO <MOUSE_MOVE>

// Пример использования
СоздатьКнопку кнопка
: Работать!!!
0 0 GOTOXY
" Да работаю, работаю!" PRINT
;
' Работать!!! кнопка ->кнРаботай !

СоздатьКнопку рычалка
75 рычалка ->кнУ !
0x7F7FFF рычалка ->кнЦвет1 !
0x0000FF рычалка ->кнЦвет2 !
: Рычать
0 0 GOTOXY
" Рыыы-ры-ры-ры-рыыы!" PRINT
;
' Рычать рычалка ->кнРаботай !

CLS 


Последний раз редактировалось white_TigR Вт июл 03, 2007 01:46, всего редактировалось 5 раз(а).

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 18, 2007 16:40 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Кнопочки конечно хороши, но вот цветовая расцветка у них как-то не очень... Контрастная слишком, нужны более нейтральные цвета. Им еще объема не хватает, и подсветку, кроме краев, еще бы и в небольшом радиусе от кнопочки сделать - как буд-то она действительно светится. Но это уже эстетика. 8) Во! Придумал! Надо сделать слово Эффект+ которое берет со стека адрес слова, добавляющего определенный графический эффект для конкретной кнопки. Ну или что-нибудь аналогичное. А почему только два цвета? Для краев необходим другой цвет. А еще неплохой эффект получится если края сделать градиентными, или даже инвертирующие свой градиент при наведении. И на кнопке это тоже будет смотреться очень даже ничего сразу после нажатия.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 18, 2007 20:00 
VoidVolker писал(а):
цветовая расцветка у них как-то не очень

Цветовая расцветка задается полями ->кнЦвет1 (верхний край) и ->кнЦвет2 (нижний край).
VoidVolker писал(а):
Надо сделать слово Эффект+

Можно сделать поле ->кнОтрисовщик указывающее на ту процедуру, которая будет заниматься отрисовкой. Сейчас только одна процедура для отрисовки "КнопкуРисовать". :)
VoidVolker писал(а):
И на кнопке это тоже будет смотреться очень даже ничего сразу после нажатия.

В новой версии (которая лежит на месте старой) это введено: при нажатии кнопка инвертирует градиент. :)

Ну и в общем: по большому счету надо создавать не виртуальные кнопки на виртуальном экране, а реальные кнопки в реальном Windows-окне. Т.е. создавать VisualForth. :)
Поэтому, мне кажется, что тут можно особо не увлекаться различными эфектами. Ушли от серого прямоугольника, изображающего кнопку, к более-менее симпатичным кнопкам - и хорошо.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 18, 2007 20:16 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
white_TigR писал(а):
надо создавать не виртуальные кнопки на виртуальном экране, а реальные кнопки в реальном Windows-окне

Во-первых: это все легко делается через винапи.
Во-вторых и в-третьих: либа по генерации виндовс-окон уже есть - зачем это-же делать еще раз?
В четвертых: зачем зависить от платформы?
white_TigR писал(а):
тут можно особо не увлекаться различными эфектами. Ушли от серого прямоугольника, изображающего кнопку, к более-менее симпатичным кнопкам - и хорошо.

В этом и есть суть кварка - создавать различные графические элементы не зависимо от платформы. Т.е. - - вызвал в любой программе и рисуй че хошь, к тому же какой красивый и быстрый интерфес получится для программ, да еще и 3D. /me считает Кварк новым шагом форта по лестинце эволюции, шагом в 3D.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 18, 2007 20:25 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Кстати, у /me была идея оконного интерфейса на поверхности куба :) Текстуры с окнами "натягиваются" на грани куба, переключение окон делается "облетом" вокруг куба (или его вращением). Но это так, в рамках свободной фантазии.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 18, 2007 20:42 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Хищник писал(а):
оконного интерфейса на поверхности куба

Нее, куб не катит - всего лишь шесть граней, вот например у меня сейчас 7 окон и еще пяточе прог в трее. Надо идти дальше - многогранник, какой именно я еще подумаю.
Хищник писал(а):
рамках свободной фантазии.

Как только надумаешь делать - мне свистни, я тоже буду участвовать, есть тут у меня несколько идей по интерфейсу...

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 18, 2007 21:55 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
VoidVolker писал(а):
Нее, куб не катит - всего лишь шесть граней, вот например у меня сейчас 7 окон и еще пяточе прог в трее. Надо идти дальше - многогранник, какой именно я еще подумаю.

Да хоть лабиринт! :))) С комнатами (включая "кладовку" с системными приложениями), потолком, подвалом и монстрами-файрволлами и паролями. :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 18, 2007 22:04 
Не в сети
Аватара пользователя

Зарегистрирован: Пт май 05, 2006 06:19
Сообщения: 192
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
хм, дыквам движок от дюка нюкема или от кваки I впалне подойдет
эх, пешком то по указателям бегать по файловому древу, вручную фиксить память, падрывать процесы для их уничтожения, и кастовать скрипты,
однако флейм,
однако устал

_________________
SPF


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 19, 2007 11:23 
Выложил новую версию "кнопок".
Лежит в самом верху страницы. :)


Последний раз редактировалось white_TigR Вт июн 19, 2007 13:13, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 19, 2007 12:29 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
white_TigR писал(а):
Выложил новую версию "кнопок" тут.

А рекурсия-то зачем? :))

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 19, 2007 12:55 
:))
Чтобы видно было. Я только сейчас написал, что все новые версии будут там. :)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 21, 2007 00:29 
Выложена новая версия. Лежит в начале этой темы.


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

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB