Содержание сайта
Главная Новичку Цитаты Реализации Статьи Документация
Компании Программы Ссылки Обсуждение Обсуждение 2 Гостевая

Эксперименты с простым окном

Перевод Дмитрия Замоткина

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

Открытие окна и рисование на его поверхности

В Dolphin Smalltalk окна представлены подклассами View. Например, окно верхнего уровня является экземпляром класса ShellView. Давайте откроем ShellView и поиграем с ним.

w := ShellView new show.

Выполните это на Workspace. Будет создана новая переменная Workspace, ссылающаяся на новое окно ShellView.

Окно появится на Вашем рабочем столе и мы можем использовать переменную w для общения с этим окном. Откройте Class Hierarchy Browser (Браузер Классов) и найдите класс View, используя при этом команду Class/Find. В фильтре категорий выберите geometry, тем самым Вы получите методы, связанные с изменением геометрии окна. Вы увидите методы, связанные с изменением позиции окна и его размеров. Попробуйте поочередности выполнить данные строчки:

w position: 0@0.
w extent: 250@150.
w height: 200.
w x: 60.

Для того, чтобы нарисовать на окне, Вы должны запросить его поверхность. Все операции по рисованию осуществляются на поверхности, если Вы -- Windows Programmer, Вы поймете, что поверхность эквивалентна Device Context. Пошлите сообщение #canvas любому View для того, чтобы получить поверхность, доступную для рисования. Этот метод вернет экземпляр класса Canvas. Если Вы найдете этот класс с помощью Браузера Классов, Вы сможете увидеть операции доступные для рисования на поверхности. Попробуйте выполнить:

w canvas ellipse: (Rectangle origin: 0@0 extent: 250@150).
w canvas text: 'Hello from Dolphin' at: 50@50.

Не расстраивайтесь, если ничего не отобразилось, пока мы не стремились действительно нарисовать что-то, мы сделаем это чуть позже.

Попробуйте нарисовать эллипс снова, но на этот раз смените его контур и цвет заливки. Этого можно достичь установкой аспектов pen и brush. Выполните следующую каскадную последовательность:

w canvas 
	pen: Pen red; 
	brush: Brush gray; 
	ellipse: (Rectangle origin: 0@0 extent: 250@150)

Если Вы продолжите дальнейшее исследование классов Pen и Brush в Браузере, то сможете увидеть как создать экземпляры с другими цветами, шириной, стилями заливки и т.д.

Заметим, что если вы свернете и восстановите окно или оно будет перерисовано по другой какой-то причине, все наши тяжкие труды пропадут. Вы увидите как добавить постоянство изображения буквально через несколько строк.

Создание нового подкласса View

Мы хотим создать новый тип окна с некоторым дополнительным поведением: отображение в нем эллипса и приветствия "Hello". В Smalltalk, для создания нового поведения Вы должны создать новый подкласс существующего класса. Мы хоти создать наше окно опять же как окно верхнего уровня. Поэтому мы должны наследовать поведение от класса ShellView. Давайте создадим подкласс ShellView.

ShellView subclass: #Greeting
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''

Подсказка: Вы можете исполнить данное выражение напрямую для создания класса, или, что более просто, используя команду Class/New в Браузере Классов. Во втором случае введите имя класса (Greeting) в появившемся окне и данное определение будет автоматически создано.

После создания класса Вы сразу же можете создать экземпляр этого класса.

w := Greeting new show.

Очевидно, окно выглядит идентично стандартному ShellView. Сейчас мы должны добавить дополнительное поведение.

Каждый раз, когда заново отображается часть окна, Windows посылает сообщение WM_PAINT окну, требующему перерисовки. Dolphin Smalltalk пересылает данное сообщение в метод #onPaintRequired:, который может быть перекрыт любым подклассом View. Давайте скопируем нижеприведенный код в метод #onPaintRequired: для класса Greeting.

Подсказка: Используйте команду Method/New в Браузере Классов для создания нового метода. Наберите (или скопируйте) данный код и выберите команду Workspace/Accept для его компиляции.

onPaintRequired: aPaintEvent

	| canvas |
	canvas := aPaintEvent canvas.
	canvas 
		pen: Pen red; 
		brush: Brush gray;
		ellipse: (Rectangle origin: 0@0 extent: 250@150);
		text: 'Hello from Dolphin' at: 50@50.

Если компиляция прошла успешно, код немедленно станет активным без рестарта приложения. Как только окно Greeting потребует перерисовки исполнится метод #onPaintRequired:.

Мы можем также улучшить поведение нашего окна на тот случай, если его размер изменится. Для этого мы должны также перехватывать сообщение Windows WM_WINDOWPOSCHANGED, которое Dolphin роутит в метод #onPositionChanged:.

onPositionChanged: aPositionEvent

	self invalidate.
	^super onPositionChanged: aPositionEvent.

Изменим метод #onPaintRequired: для того, чтобы эллипс и текст всегда оставались в центре окна.

onPaintRequired: aPaintEvent

	| canvas box textbox |
	box := self clientRectangle.
	canvas := aPaintEvent canvas.
	canvas 
		pen: Pen red; 
		brush: Brush gray;
		ellipse: box;
		font: (Font name: 'Arial' pointSize: 24);
		setTextAlign: TA_CENTER | TA_BASELINE;
		setBkMode: TRANSPARENT;
		setTextColor: Color red;
		text: 'Hello from Dolphin' at: box center.

И если все сделано правильно, окно должно выглядеть следующим образом:

Оригинальная статья располагается на сайте Object Arts.




Есть комментарии? Пишите.