|
Программирование >> Вывод графики
static void Main(string[] args) Point topLeft = new Point(10,10); Size rectangleSize = new Size(50,50); Point bottomRight = topLeft + rectangleSize; Console.WriteLine( topLeft = + topLeft); Console.WriteLine( bottomRight = + bottomRight); Console.WriteLine( Size = + rectangleSize); Запуск этого кода, как простого консольного приложения по имени PointsAndSizes, приведет к выводу, показанному на рис. 33.4. Рис. 33.4. Результат выполнения простого консольного приложения PointsAndSizes Обратите внимание, что этот вывод также показывает, как переопределен метод ToString() для структур Point и Size с целью отображения значения в формате {X,Y}. Можно также вычитать Size из Point, получая в результате структуру Point, а также складывать вместе две структуры Size, получая новую Size. Однако невозможно прибавить Point к другой структуре Point. Проектировщики из Microsoft решили, что сложение структур Point концептуально не имеет смысла, а потому не стали перегружать операцию +, которая позволила бы это делать. Можно также выполнять явные приведения Point к Size и наоборот: Point topLeft = new Point(10,10); Size s1 = (Size)topLeft; Point p1 = (Point)s1; С этим приведением s1.Width присваивается значение topLeft.X, а s1.Height - значение topLeft.Y. Таким образом, s1 будет содержать (10,10), а p1 - то же самое, что и topLeft. Rectangle и RectangleF Эти структуры представляют прямоугольные области (обычно на экране). Так же, как Point и Size, здесь мы рассмотрим только Rectangle. Структура RectangleF в основном идентична, с тем отличием, что ее свойства имеют тип float вместо int. Структуру Rectangle можно представить как составную, которая включает в себя структуру Point, представляющую левый верхний угол, и структуру Size, представляющую размер. Один из ее конструкторов действительно принимает в качестве параметров пару структур - Point и Size. Убедимся в этом, переписав код, рисующий прямоугольник, из примера DrawShapes: Graphics dc = e.Graphics; Pen bluePen = new Pen(Color.Blue, 3); Point topLeft = new Point(0,0); Size howBig = new Size(50,50); Rectangle rectangleArea = new Rectangle(topLeft, howBig); dc.DrawRectangle(bluePen, rectangleArea); Здесь также используется альтернативная перегрузка Graphics.DrawRectangle(), принимающая в параметрах Pen и Rectangle. Можно также сконструировать структуру Rectangle, применив координаты верхнего левого угла, ширину и высоту раздельно как отдельные числа: Rectangle rectangleArea = new Rectangle(0, 0, 50, 50); Rectangle содержит ряд свойств, доступных для чтения и записи, которые позволяют устанавливать и извлекать ее размеры в разных комбинациях. Подробности можно найти в табл. 33.3. Таблица 33.3. Свойства структуры Rectangle
Следует отметить, что не все эти свойства независимы. Например, установка значения Width также влияет на значение Right. Region Region представляет область на экране, имеющую сложную форму. Например, затененная область на рис. 33.5 может быть представлена как Region. Как следовало ожидать, процесс инициализации экземпляра Region достаточно сложен. Говоря кратко, это можно сделать либо указанием набора компонентов простой формы, образующих область, либо указав путь прохождения по ее границам. Если вам необходимо работать с подобными областями, стоит изучить класс Region в документации SDK. Рис. 33.5. Пример Region Замечания по поводу отладки Теперь мы готовы к тому, чтобы разработать более сложный пример рисования. Однако сначала следует сказать пару слов об отладке. Если вы попытаетесь установить точки прерывания в коде примеров этой главы, то обнаружите, что отладка процедур рисования не так проста, как отладка прочих частей ваших программ. Дело в том, что вход в отладчик и выход из него часто сам по себе вызывает отправку сообщения Paint вашему приложению. В результате установки точки прерывания внутри OnPaint() может получиться так, что приложение будет вновь и вновь пытаться перерисовать себя, так что станет невозможным делать что-либо еще. Типичный сценарий выглядит следующим образом. Вы хотите понять, почему ваше приложение отображает что-то неправильно, потому помещаете точку прерывания внутрь обработчика события OnPaint() . Как ожидалось, в этой точке выполнение программы прерывается, и вы оказываетесь в отладчике, т.е. на передний план попадает окно из MDI-среды разработки. Очень часто разработчики настраивают эту среду на полноэкранное представление, чтобы легко видеть сразу всю отладочную информацию, а это значит, что она полностью накрывает отлаживаемое приложение. Продвигаясь дальше, вы исследуете значения некоторых переменных, надеясь обнаружить что-то полезное. Затем нажимаете клавишу <f5>, чтобы продолжить работу приложения и увидеть, что случается, когда приложение отображает что-то еще после обработки. К сожалению, первое, что происходит - приложение перемещается на передний план, Windows обнаруживает, что форма опять стала видимой и сразу же посылает ей событие Paint. И, конечно же, вы снова попадаете в свою точку прерывания. Хорошо, если это то, что вам нужно. Но обычно на самом деле вы хотели бы попасть в точку прерывания позже, когда приложение нарисует что-то более интересное - возможно, после выбора какой-то команды меню для чтения файла, либо после чего-то другого, что изменит отображение. Ситуация выглядит тупиковой. Либо вам вовсе не нужно ставить точку прерывания в OnPaint() , либо приложение никогда не попадет в точку, находящуюся за моментом отображения начального окна запуска. Тем не менее, эту проблему можно обойти. Если у вас большой экран, то проще всего уменьшить окно среды разработки до половины экрана вместо того, чтобы держать его полностью развернутым. Кроме того, его нужно поместить в стороне от окна вашего приложения, чтобы оно никогда не перекрывалось. К сожалению, в большинстве случаев это решение не практично, поскольку приходится делать окно среды разработки слишком маленьким (можно также подключить еще один монитор). Альтернативой, использующей тот же принцип, может быть объявление вашего приложения на время отладки приложением верхнего уровня . Это делается установкой свойства TopMost класса Form, что легко можно сделать в методе InitializeComponent(): private void InitializeComponent() this.TopMost = true; Это свойство также можно установить в окне свойств Visual Studio 2008. Имея свойство TopMost, равное true, ваше приложение никогда не будет перекрыто другими окнами (за исключением другого окна с тем же свойством). Оно всегда остается поверх остальных окон, даже когда фокус получает другое приложение. Так работает системный диспетчер задач (Task Manager). Но, даже пользуясь таким приемом, нужно быть осторожным, потому что нельзя предсказать, когда Windows по какой-то причине решит сгенерировать событие Paint. Если вы действительно хотите отловить некоторую проблему, которая проявляется в
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |