Урок № 1 Редактируем Button.inc
Откроем button.inc с помощью блокнота  и что мы видим. Видим комментарии.
Как вы уже догадались комментарии начинаются со знака %
В каждом комментарии свой смысл давайте рассмотрим 

Button handling (Обработка Шаблона) 
Содержаться переменные, которые могут использоваться в других скриптах формата inc 
Button templates (Шаблон кнопки) 
Тут содержаться основной Стек. 
Set default button (Кнопка по умолчанию) 
Кнопка при не наведённом состоянии, т. е. курсор на другой кнопке 
Make it _not_ the default button (Не кнопка по умолчанию) 
Кнопка при наведённом состоянии, т. е. курсор на кнопке 
Set button position (Позиция кнопки) 
Расположение кнопки 
Assign action to button (Действий Кнопки.) 
Действие, совершаемое кнопкой при нажатии 
Draw button (Прорисовка кнопки) 
Пиксельный чертеж кнопки в нормальном состоянии 
Press button (Прорисовка нажатия на кнопку) 
чертеж кнопки при нажатом состоянии

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
% button handling
%
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
Это то что мы называем версией или названием
Идем дальше

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Button templates.
%
% [ x y width height label selected hotkey action ]
%
/button.ok       { [ 0 0 90 25 txt_ok       false 0      0 ] } def
/button.cancel   { [ 0 0 90 25 txt_cancel   false keyEsc 0 ] } def
/button.reboot   { [ 0 0 90 25 txt_reboot   false 0      0 ] } def
/button.continue { [ 0 0 90 25 txt_continue false 0      0 ] } def
% /button.eject    { [ 0 0 90 25 "Eject"      false 0      0 ] } def

Разберём эту строку
 /button.ok       { [ 0 0 90 25 txt_ok       false 0      0 ] } def 
/button.ok  - переменная (может быть использована в других скриптах)     
0 – X 
0 – y  
90 – ширина 
25 – Высота 
txt_ok – Текст 
False – выбрана ли курсором кнопка 
0 – горячие клавиши (можно посмотреть в system.inc)
0 – действие 

Всё остальное смотрите в приложении urok.doc. 

Рассмотрим далее
 
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Set default button.
%
% ( button ) => ( button )
%
/button.default {
  dup 5 true put
} def
 
Кнопка при не наведённом состоянии, т. е. курсор на другой кнопке
 
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Make it _not_ the default button.
%
% ( button ) => ( button )
%
/button.notdefault {
  dup 5 false put
} def
 
Кнопка при наведённом состоянии, т. е. курсор на кнопке

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Set button position.
%
% ( button x y ) ==> ( button )
%
/button.moveto {
  rot dup 0 5 -1 roll put exch over 1 rot put
} def
 
Расположение кнопки
 
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Assign action to button.
%
% ( button action ) => ( button )
%
/button.setaction {
  over 7 rot put
} def
 
Действий Кнопки

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Draw button.
%
% ( button ) ==> ( )
%
/button.show {
  /bt.x over 0 get def
  /bt.y over 1 get def
  /bt.width over 2 get def
  /bt.height over 3 get def
  /bt.text over 4 get def
  /bt.default exch 5 get def

  bt.text strsize
  bt.height sub neg 2 div /bt.y.textofs exch def
  bt.width sub neg 2 div /bt.x.textofs exch def

  bt.x bt.y moveto
  currentpoint currentpoint currentpoint

  currentpoint bt.width bt.height window.current .color.bg get setcolor fillrect moveto

  bt.default {
    black black
  } {
    window.current .color.bg get dup
  } ifelse
  bt.width bt.height drawborder
  moveto 1 1 rmoveto white black bt.width 2 sub bt.height 2 sub drawborder
  moveto
  % 2 2 rmoveto white black bt.width 4 sub bt.height 4 sub drawborder

  window.current .color.fg get setcolor
  moveto bt.x.textofs bt.y.textofs rmoveto bt.text show
} def 
Прорисовка кнопки
Т. Е. мы сейчас разберём это по подробней
   bt.height sub neg 2 div /bt.y.textofs exch def 
я разобрался что 2 это расположение надписи на кнопке по середине от оси Y
   bt.width sub neg 2 div /bt.x.textofs exch def 
я разобрался что 2 это расположение надписи на кнопке по середине от оси X
ну теперь перейдём к самому интересному
 bt.default {
    black blue
  } {
    window.current .color.bg get dup
  } ifelse
  bt.width bt.height drawborder
  moveto 1 1 rmoveto green red bt.width 2 sub bt.height 2 sub drawborder
  moveto
  
  window.current .color.fg get setcolor
  moveto bt.x.textofs bt.y.textofs rmoveto bt.text show
} def 

 window.current .color.bg get dup  
В ДАННОМ СЛУЧАЕ ЭТО МЫ РИСУЕМ ГРАНИЦЫ ОКНА
  bt.default {
    black blue
  }   
Это внешняя рамка смотри рисунок

 bt.width bt.height drawborder  	
 Вводим  переменные
    moveto x y rmoveto green red2 bt.width 2 sub bt.height 2 sub drawborder  
moveto - Начинаем рисовать
x, y - расположение первой точки
rmoveto - Продолжаем рисовать
green - цвет 1
red - цвет 2

bt.ширина - переменная
2 - сколько надо отступить от x
sub -?
bt.высота - переменная
2 - сколько надо отступить от y
sub – ?
drawborder - рисуем границы
 window.current .color.fg get setcolor  
добавляем ещё одну переменную
 moveto bt.x.textofs bt.y.textofs rmoveto bt.text show  
В данном случае это рисуем текст

Это и будет домашнее задание
Разобраться вот тут
 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Press button.
%
% ( button ) ==> ( )
%
/button.press {
  /bt.x over 0 get def
  /bt.y over 1 get def
  /bt.width over 2 get def
  /bt.height exch 3 get def

  bt.x 3 add bt.y 3 add moveto
  bt.width 7 sub bt.height 7 sub savescreen
  1 1 rmoveto dup restorescreen free

  bt.x 1 add bt.y 1 add moveto black white bt.width 2 sub bt.height 2 sub drawborder
} def 
Ответить на вопрос что это что означает 
 bt.x 1 add bt.y 1 add moveto black white bt.width 2 sub bt.height 2 sub drawborder