Как видите, перемещение изображения круга реализуется э-л-е-м-е-н-т-а-р-н-о. А как сделать так, чтобы круг летал по экрану или как шарик отскакивал от краев клиентской области окна? Щас зробімо.
Шаг 7. Создаем контекстное меню. Для инициирования и перемещения некоторого изображения по экрану в соответствии с некоторым алгоритмом можно использовать разные приемы. В качестве инициатора перемещения удобно использовать таймер, который с заданной периодичностью будет выполнять некоторые действия. В то же время требуется иметь средство, которое будет запускать таймер и его останавливать. В качестве такого средства можно использовать команды меню, обработчики шлепков по кнопкам, нажатия клавиш, истошные вопли и т.д. Мы для этой цели, в качестве тренажа, используем контекстное меню, то бишь управляющий элемент ContextMenuStrip из группы Menus & Toolbars.
Итак, затащите на форму упомянутый элемент ContextMenuStrip и бросьте его там. Когда он свалится с окна вниз, выделите его там, внизу, и далее с помощью интуитивно понятных действий добавьте в него две команды: Start и Stop. Не рекомендую вводить имена кириллицей на этапе создания команд меню, так как вы получите имена команд и их обработчиков, в которых будут присутствовать эти самые символы кириллицы. Когда вы создадите команды меню, вызовите их свойства и в поле Text введите имена команд кириллицей или на любом другом доступном языке.
Далее привычным двойным щелчком по ЛКМ сгенерируйте обработчики этих самых команд меню. Как известно, контекстное меню вызывается по умолчанию путем нажатия ПКМ в окне. Запустите приложение на выполнение и щелкните ПКМ в окне. Выскочило меню? Если нет, то доберитесь до свойств окна, найдите там свойство ContextMenuStrip и выпадающем списке выберите имя contextMenuStrip1. Еще раз запустите приложение на выполнение и убедитесь в том, что контекстное меню выскакивает как черт из коробочки.
Шаг 8. А теперь – таймер и полетели! Отыщите в ToolBox элемент Timer (группа Components) и каким-нибудь хитрым способом заманите его на форму. Он с нее, конечно, сбежит, но вы его найдите и хорошенько шлепните, чтобы он родил обработчик события timer1_Tick. Если вы посмотрите на свойства таймера timer1, то обнаружите там свойство Interval. Значение этого свойства задает промежуток времени в миллисекундах, через который будет вызываться обработчик timer1_Tick. Таймер начнет «работать», когда будет вызван его метод Start (не путать с командой нашего контекстного меню!) и закончит свою работу, когда будет вызван метод Stop.
Итак, в самой дебильной реализации обработчики событий можно сделать такими:
Если теперь запустить программу на выполнение, вызвать контекстное меню (ПКМ) и выбрать команду Старт, то шарик должен начать двигаться вверх и вправо. Остановить его можно с помощью команды Стоп контекстного меню.
Поздравляю, вот теперь вы готовы к выполнению настоящего задания!
Индивидуальные задания
Во всех вариантах задания должны быть соблюдены следующие условия:
Ø использование таймера;
Ø возможность настройки пользователем интервала инициирования таймера;
Ø использование контекстного меню или других диалоговых средств для запуска визуализации и ее остановки;
Ø приложение должно быть работоспособно при изменении размеров его окна (в разумных пределах).
Таблица 1
Варианты заданий
№ бриг.
Задание
Светофор. Изобразить работающий светофор (красный, желтый и зеленый). Предоставить пользователю программы возможность задавать время «работы» каждого из цветов
Молекула газа. Изобразить «шарик», который должен начать свой полет с нижнего края окна в произвольном направлении. Шарик должен отскакивать от краев окна и угол отскока должен быть равен углу удара, как в реальном мире. Можно также предполагать, что это движение молекулы в сосуде (cм. Модель 1 в [1])
Вспышка сверхновой звезды. Изначально это должен быть небольшой круг в центре окна, который будет постепенно увеличиться в размерах и изменять, плавно, свой цвет. Очевидно, что фон экрана при этом должен быть черным и на нем должны быть видны другие звезды, как в реальном космосе.
Черная дыра. Изобразите черную дыру, которая затягивает и поглощает несколько звезд. Звезды должны двигаться из разных направлений в сторону дыры и исчезать в ней. Вместо звезд можно использовать планеты, космические корабли, кометы и т.п. космические сущности
Мыльный пузырь. Где-то в центральной части окна изображен шарик – мыльный пузырь. От произвольного края окна (выбирать случайным образом) вылетает нечто, под случайным углом. Если оно попадает в мыльный пузырь, то пузырь исчезает, а если нет, то это нечто просто исчезает, долетев до какого-либо края окна, и появляется новое нечто. Можно решать облегченную задачу: нечто появляется только по команде пользователя
Прыжки футбольного мяча (cм. Модель 5 в [1])
Солнце, Земля и Луна (cм. Модель 6 в [1])
Экспериментальное определение числа π (cм. Модель 7 в [1]). Показать квадрат, вписанный круг. В процессе генерации случайных чисел показывать их как точки (например, окружности малого радиуса) в соответствующих координатах. Кроме того, выводить текущее значение числа π, число точек в круге, за ним и общее число точек
Восход и закат Солнца. Солнце должно появляться в левой нижней части окна, двигаться в окне по некоторому радиусу и садиться в правой нижней части окна. В процессе движения оно должно максимально правдоподобно изменять цвет и размер
Собачья кривая. В верхней части окна, по горизонтали, бежит Заяц. Из нижней части экрана его начинает преследовать Собака. Вектор скорости собаки все время направлен на текущую позицию Зайца (см. рис. 4). Изобразить все это красиво. Само собой разумеется, что скорости и интервал таймера должны выбираться пользователем. Для вычислений вполне достаточно знания геометрии в школьном объеме
Мыльный пузырь. Где-то в центральной части окна изображен шарик – мыльный пузырь. От произвольного края окна (выбирать случайным образом) вылетает нечто, под случайным углом. Если оно попадает в мыльный пузырь, то пузырь исчезает, а если нет, то это нечто просто исчезает, долетев до какого-либо края окна, и появляется новое нечто. Можно решать облегченную задачу: нечто появляется только по команде пользователя
Прыжки футбольного мяча (cм. Модель 5 в [1])
Солнце, Земля и Луна (cм. Модель 6 в [1])
Рис. 4. Собачья кривая
7. Классы C++/CLI
Меня два раза спрашивали [члены Парламента]: «Скажите на милость, мистер Бэббидж, что случится, если вы введете в машину неверные цифры? Сможем ли мы получить правильный ответ?» Я не могу себе даже представить, какая путаница в голове может привести к подобному вопросу
Charles Babbage
Цель работы – освоить разработку приложений Windows на основе каркаса WinForms на языке C++/CLI, которые используют классы, компоненты DataGridView и файлы (4 час.).
Задание
Разработайте приложение на основе каркаса Windows Forms, которое бы загружало некоторые данные из текстового файла, сохраняло их в объектах класса, выполняло над ними заданные операции и отображало исходные данные и результат их обработки в таблицах DataGridView.
Приложение должно иметь меню для открытия файла и выхода из программы, а также управляющие элементы (поля ввода TextBox, кнопки и т.д.), необходимые для ввода требуемых данных в соответствии с индивидуальным заданием.
Необходимо разработать класс, который должен содержать данные и функции в соответствии с вашим вариантом задания.
Прочитанные из файла данные должны сохраняться в массиве (array) объектов разработанного вами класса и далее отображаться в компоненте DataGridView. Число записей файла должно быть достаточным для проверки корректности приложения, но не менее 20. Данные должны быть близкими к реальным, а не просто случайными наборами символов.
Результат обработки данных должен отображаться в другом компоненте DataGridView, который может располагаться на той же форме, где и таблица с исходными данными, или на другой форме.
Таблица 1
Легкие варианты заданий
№
Описание
В фитнесс-клубе хранится такая информация по клиенткам: ФИО, вес клиентки в момент вступления в клуб В1, дата вступления клуб, дата выхода из членов клуба (текущая дата, если клиентка до сих пор в клубе), вес на дату выхода из членов клуба В2, еженедельная сумма потраченных клиенткой средств за членство в клубе. На заданную дату вычислить для каждой клиентки коэффициент К и вывести всех клиенток, попадающих в указанный период времени, в порядке возрастания коэффициента К. К=(сумма потраченных клиенткой средств за указанный период времени) / (В1-В2). Клиенток с отрицательными значениями К разместить в конце списка
Дана ведомость абитуриентов, сдавших вступительные экзамены в институт. В каждой строке данной ведомости записаны фамилия и имя абитуриента, его постоянное местожительство (наименование города), пол и полученные им оценки по отдельным дисциплинам (например: физике, математике, литературе). Необходимо определить количество абитуриентов, проживающих в определённом городе и сдавших экзамены со средним баллом не ниже заданного. В качестве результата вывести все данные по абитуриентам, включая вычисленный средний балл, отсортировав их по фамилиям
В справочной аэропорта хранится расписание вылета самолетов по суткам. Для каждого рейса указаны его номер, тип самолета, пункт назначения, дата (день и месяц) и время (часы и минуты) вылета. Определить все номера рейсов, типы самолетов и времена их вылета для заданного пункта назначения на определённые сутки
В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиоприемник и т.п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Необходимо выдать информацию начальнику ателье о состоянии заказов на текущие сутки по группам изделий
Допустим, имеется ведомость об успеваемости студентов с такими записями: номер группы (по принятому в ХАИ порядку), фамилия и имя студента, оценки на экзаменах (5 штук). Рассчитать средний балл каждого студента. Необходимо вывести списки студентов, упорядоченные по факультетам, далее по курсам, по группам и внутри группы в порядке убывания среднего балла.
Задание из недалекого прошлого. В СССР был дефицит на все, начиная от туалетной бумаги и заканчивая автомобилями. Анекдот тех времен. Идет мужик с рулонами туалетной бумаги на шее, у него прохожие спрашивают «Где, где вы достали бумагу?!» – Да это из химчистки...
В магазине имеется список лиц, записавшихся на покупку мебельного гарнитура. Каждая запись этого списка содержит порядковый номер, фамилию, домашний адрес покупателя и дату (день, месяц, год) постановки на учет. Предполагается, что список упорядочен в порядке возрастания даты постановки на учет. Требуется удалить в нем все повторные записи (проверку осуществлять по фамилии и домашнему адресу). Вывести всех заказчиков, проживающих на заданной пользователем улице
В больнице имеется общий список больных: ФИО, номер палаты, диагноз, группа крови, резус-фактор. Требуется вывести перечень больных по каждой палате (число мест в палате до 5) и отдельно по каждому диагнозу. Разместить больных по палатам так, чтобы больные с одинаковым диагнозом располагались по возможности вместе.
Имеется список учета нуждающихся в улучшении жилищных условий. Каждая запись этого списка содержит данные по одному гражданину: ФИО, адрес, место работы, льготы и дату постановки на учет. Список упорядочить по дате постановки на учет. Ввести число квартир, выделяемых по данному списку в течение года. Рассчитать, какое количество лет в среднем необходимо ожидать получения квартиры, и вывести весь список, с указанием ожидаемого года получения квартиры
В предвыборной кампании проводится регистрация кандидатов в депутаты. Каждый кандидат, подавая заявление на регистрацию, указывает: ФИО, номер округа, в котором он собирается баллотироваться, наименование партии, которую он представляет, свой возраст и профессию. Пресс-служба центральной избирательной комиссии выдает информационный бюллетень, в котором приводит следующую информацию: число поданных заявлений на регистрацию кандидатов каждой политической партии; средний возраст кандидатов от каждой политической партии; наиболее часто встречающаяся профессия для кандидатов по каждой партии. Вывести эти данные в отдельную таблицу
В библиотеке имеется список книг. Каждая запись этого списка содержит шифр, литературное направление, фамилии авторов, название книги, издательство, год издания. Определить, имеются ли в данном списке книги, в названии которых встречается некоторое слово, заданное пользователем. Вывести в отдельную таблицу фамилии авторов, название и год издания всех книг, в названии которых встречается это слово
В магазине имеется список поступивших в продажу автомобилей. Каждая запись этого списка содержит марку автомобиля и его параметры: стоимость, расход бензина на 100 км, надежность (число лет безотказной работы), комфортность (отличная, хорошая, удовлетворительная). Покупатель в свою очередь имеет ряд требований по каждому из этих параметров. Эти требования задаются в виде некоторого интервала (например, стоимость – 10…30 тыс. долл.; расход бензина – 4…10 л на 100 км). Вывести в таблицу перечень автомобилей, удовлетворяющих требованиям покупателя
В бюро по занятости населения (трудовой бирже) ведется список вакантных рабочих мест на предприятиях города. Каждая запись такого списка содержит следующую информацию: наименование организации, местоположение организации (расстояние в км от центра города), наименование должности, требуемая квалификация (разряд или образование), требуемый стаж работы по специальности, заработная плата в месяц, наличие социального страхования (да или нет), продолжительность ежегодного оплачиваемого отпуска. Клиент бюро вводит информацию о своей квалификации и максимальную удаленность потенциального места трудоустройства от центра города. Вывести список рабочих мест в соответствии с данными и требованиями клиента
В базе данных по учёту продажи яблок хранится такая информация: ФИО продавца, дата продажи (день, месяц, год), сорт, цена, вес проданных яблок, выручка. Подсчитать для каждого продавца сумму, на которую он осуществил продажи за заданный период времени. Период времени водить в форме начальной и конечной дат
Имеется информация по автоперевозкам дальнобойщиков: ФИО дальнобойщика, начальный пункт, конечный пункт, дата отбытия, дата прибытия, километраж, наименование груза и его вес. Найти и вывести на чистую воду дальнобойщиков, которые находились в пути в заданный период времени. Список должен быть отсортирован в порядке убывания произведения веса груза на километраж. Период времени водить в форме начальной и конечной дат