Учебник Visual Basic .NET Выражения, операторы Классы и объекты Наследование и интерфейсы Обработка событий и делегаты Обработка ошибок Формы Windows Ввод-вывод Многопоточные приложения Поддержка баз данных Обзор ASP .NET

Имена функций вводят нас в заблуждение, так как на самом деле эти функции ничего не задают и не определяют. Работая в паре, они дают способ задания двух вещественных коэффициентов растяжения (сжатия) путем задания четырех целых чисел. Параметры функций должны быть целыми или объектами класса csize, которые тоже создаются из двух целых. Значительно проще было бы задать два вещественных числа и использовать их в качестве коэффициентов. Объяснение наблюдаемой реальности, видимо, кроется в истории разработки функций API (сложности с floating point-арифметикой).

Интерфейс IComparer

.NET Framework позволяет выполнять сортировку по нескольким критериям. Например, чтобы упорядочить массив работников сначала по заработной плате, а затем по имени (в группах с одинаковой зарплатой) следует реализовать интерфейс IComparer, содержащий единственный метод СотрагеТо. При этом вы сможете воспользоваться одной из перегруженных версий Array. Sort (или ArrayList. Sort), которая имеет следующую сигнатуру:

Public Shared Sub Sort(ByVal array As Array. ByVal comparer As IComparer)

Обычно в программе создается отдельный класс, реализующий IComparer, и экземпляр этого класса передается методу Sort. Пример такого класса приведен ниже. Обратите внимание на выделенную строку — в ней имена работников передаются в виде строк методу Compare класса String:

Public Class SortByName

Implements IComparer

Public Function CompareTo(ByVal firstEmp As Object.ByVal

secondEmp=As Object) As Integer Implements IComparer.Compare

Dim temp1 As Employee = CType(firstEmp,Employee)

Dim temp2 As Employee = CType(secondEmp.Employee)

Return

String.Compare(templ.TheName. temp2.TheName)

End Function

End Class

Пример процедуры Sub Main с использованием этого класса:

SubMain()

Dim torn As New Employee("Tom", 50000)

Dim sally As New Employee("Sally". 60000)

Dim sam As New Employee("Sam". 60000)

Dim ted As New Employee("Ted". 50000)

Dim theEmployees() As Employee = _

{torn.sally,sam.ted}

Array.Sort(theEmployees)

Dim SortingByName As SortByName = New SortByName()

Array.Sort(theEmployees,SortingByName)

Dim aEmployee As Employee

For Each aEmployee In theEmployees

Console.WriteLine(aEmployee.TheName & "has yearly salary $" &

FormatNumberCaEmployee.Salary))

Next

Console. ReadLine() End Sub .

Результат показан на рис. 5.10,

Рис. 5.10. Сортировка по нескольким критериям с использованием IComparer

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

Если мы зададимся целью масштабировать изображение, то есть дать пилы-юним-;-лю возможность изменять его размеры, то нам следует научиться управлять режимами и параметрами отображения логической системы координат в физическую. Вы уже знаете, что Win32 API использует четыре координатных пространства (spaces): World space, Page space, Device space, и Physical Device space. Однако большая часть документации и книг но MFC оперируют только двумя терминами: логическая и физическая системы координат. Мы будем использовать термин, логическая система координат, имея в виду Page space.