Мегаобучалка Главная | О нас | Обратная связь  


Звуки видео. Проект «Плеер»




Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

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

Свой голос вы можете записать в звуковой файл, если у вас есть микрофон. Делается это стандартным приложением Windows «Звукозапись», до которого добираются так: В среде Windows нажмите Пуск ® Программы ® Стандартные ® Развлечения ® Звукозапись.

Вы можете прекрасно прослушивать и просматривать с помощью VB файлы самых разных форматов.

Звук и видео в Windows. Для воспроизведения звуковых и видеофайлов нужна специальная программа. Работая в Windows, вы наверняка для этого пользовались медиаплеером. Возможно, вы просто щелкали по значку звукового или видеофайла, после чего слушали и смотрели, не обращая внимания, что проигрывает вам эти файлы именно программа «Медиаплеер» (Windows Media Player). Медиаплеер входит в стандартный состав Windows последних версий. Если вы никогда им не пользовались, вам сейчас полезно чуть-чуть потренироваться в его использовании. Откройте его: Пуск ® Программы ® Стандартные ® Развлечения ® Windows Media Player. Приблизительный внешний вид медиаплеера вы можете видеть на Рис. 3.23. Правда, в последних версиях Windows он перенастраивается и может быть весьма причудливым.



Рис. 3.23

Дальнейшие ваши действия интуитивно ясны. При помощи File ® Open(затем, возможно,Browse)вы ищете и открываете на жестком или компакт-диске или в сети звуковой или видеофайл. Затем воспроизводите его при помощи привычных кнопок и регуляторов в нижней части медиаплеера: «Воспроизведение», «Пауза», «Стоп», «Громкость» и т.д.

Если вы не можете найти ни одного файла, подскажу, что несколько звуков и мелодий находятся на жестком диске вашего компьютера по адресу Windows\Media, а несколько простейших коротеньких видеоклипов – по адресу

Program Files\Microsoft Visual Studio .NET\Common7\Graphics\videos

Если звука не слышно, проверьте настройки вашей звуковой карты в приложении Микшер. Для этого в среде Windows нажмите Пуск ® Программы ® Стандартные ® Развлечения ® Регулятор громкости. В возникшем окне снимите флажки (галочки) выключения канала и установите максимальный уровень у каналов Wave (для WAV-файлов и MP3-файлов) и MIDI (для MID-файлов и RMI-файлов). Если вы сначала хотите записать звуковой файл с микрофона, зайдите в «Свойства», затем в закладку «Запись», установите флажок включения канала «Микрофон» и установите достаточно большой уровень канала «Микрофон».

Звук и видео в VB. Медиаплеер может быть вставлен в ваш VB проект, где вы имеете возможность свободно им пользоваться, управлять и настраивать, причем как в режиме проектирования, так и в режиме работы. Чтобы воспользоваться медиаплеером в VB, вам нужно расположить на форме специальный элемент управления Windows Media Player, который является «копией» медиаплеера в вашем проекте. Но его нет в стандартном наборе на панели Toolbox. Сначала его нужно туда поместить. Для этого: Tools ® Customize Toolbox ® COM Components ®вы находите Windows Media Player в длинном списке и ставите против него галочку ® OK. Он появился в Toolbox. Теперь его можно размещать на форме обычным образом. Подробнее процесс добавления нового элемента управления в Toolbox рассмотрен в 4.2.3.

Постановка задачи. Давайте на основе медиаплеера создадим собственный небольшой проигрыватель примерно такого вида, как на Рис. 3.24.

Рис. 3.24

Мы видим его в момент воспроизведения видеофайла. В центре расположен элемент управления Windows Media Player в виде экрана с инструментами управления сразу под ним. Кроме этого на форме мы видим 12 кнопок: по бокам 6 белых и внизу 6 серых. Слева – 3 белые кнопки с названиями звуковых клипов. Справа – 3 белые кнопки с названиями видеоклипов. Я сделал только по 3, но их может быть, сами понимаете, хоть сотня. В дальнейшем, чтобы не связываться с кнопками, мы научимся пользоваться списком (18.5) или просто просматривать диск (20.2).

Пользоваться нашим проигрывателем просто. Сначала щелчком по белой кнопке выбираем, что будем проигрывать. Затем запускаем воспроизведение щелчком по кнопке «Старт». Щелчком по кнопке «Стоп» – останавливаем. Мы можем пользоваться и собственными инструментами управления медиаплеера, которые видны сразу под экраном.. А вот 4 кнопки в центре внизу убеждают нас, что средствами VB вы можете управлять медиаплеером тоньше и удобнее, чем в Windows.

Проектируем проигрыватель. Создадим новый проект. Поместим Windows Media Player в Toolbox, а оттуда – на форму. Там он будет иметь примерно такой вид, как на Рис. 3.23, только без меню. В окне свойств мы видим большое количество его свойств. Не нужно менять значения тех свойств, которые вы не понимаете.

Проделайте следующее:

· Дайте ему имя (например, Плеер).

· Установите свойство AutoRewind (автоперемотка) в True, чтобы после окончания воспроизведения плеер устанавливался на начало клипа.

· Установите свойство AutoStart в False, чтобы плеер не начинал воспроизводить файл сразу после открытия его щелчком по белой кнопке, а ждал нажатия на кнопку воспроизведения (хотя, можно и не делать этого).

 

Щелкните правой клавишей мыши по плееру и выберите в контекстном меню Properties. Здесь вы тоже можете настроить кое-какие его свойства.

Поместим на форму 2 метки и 12 кнопок. Дадим кнопкам подходящие имена (лучше всего, если они будут похожи на текст кнопок).

Пишем программу. Для того, чтобы конкретный файл начал воспроизводиться, нужно выполнить всего два оператора. Первый должен указать плееру адрес этого файла на диске, чтобы плеер знал, «что играть». Второй должен непосредственно отдать плееру команду начать воспроизведение. Вот пример записи этих двух операторов:

Плеер.FileName= "E:\WINNT\Media\Windows Logon Sound.wav"

Плеер.Play()

 

Здесь:

· Плеер – это наш объект плеер.

· FileName – это его свойство (имя, адрес файла). В кавычках указывается полный адрес файла.

· Play – это метод объекта Плеер – приказ начать воспроизведение.

 

Двойными щелчками по кнопками переходим в окно кода и заполняем заготовки процедур. Не забывайте, что после ввода очередной процедуры проект нужно запускать и результаты работы процедуры проверять. Вот что у нас должно получиться (пояснения ниже):

Private Sub Звук_загрузки_Windows_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles Звук_загрузки_Windows.Click

Плеер.FileName = "D:\WINNT\Media\Windows Logon Sound.wav"

End Sub

 

Private Sub Каньон_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Каньон.Click

Плеер.FileName = "D:\WINNT\Media\canyon.mid"

End Sub

 

Private Sub В_пещере_горного_короля_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles В_пещере_горного_короля.Click

Плеер.FileName = "D:\WINNT\Media\In the Hall of the Mountain King.RMI"

End Sub

 

Private Sub Штопор_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Штопор.Click

Плеер.FileName = "D:\Program Files\Microsoft Visual Studio .NET\Common7\Graphics\videos\DRILLRLE.AVI"

End Sub

 

Private Sub Счетчик_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Счетчик.Click

Плеер.FileName = "D:\Program Files\Microsoft Visual Studio .NET\Common7\Graphics\videos\COUNT24.AVI"

End Sub

 

Private Sub Notre_Dame_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Notre_Dame.Click

Плеер.FileName = "D:\Documents and Settings\d\My Documents\Visual Studio Projects\Разное\Notre2.avi"

End Sub

 

Private Sub Старт_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Старт.Click

Плеер.Play()

End Sub

 

Private Sub Стоп_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Стоп.Click

Плеер.Stop()

End Sub

 

Private Sub Играть_непрерывно_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles Играть_непрерывно.Click

Плеер.PlayCount = 0

End Sub

 

Private Sub Играть_1_раз_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Играть_1_раз.Click

Плеер.PlayCount = 1

End Sub

 

Private Sub Быстрее_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Быстрее.Click

Плеер.Rate = 2

End Sub

 

Private Sub В_обычном_темпе_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles В_обычном_темпе.Click

Плеер.Rate = 1

End Sub

Пояснения. Прежде всего, некоторые операторы из-за их длины я перенес на следующую строку при помощи «знака переноса», состоящего из пробела и знака подчеркивания. Подробнее об этом – в 3.12.2

Первые 6 процедур соответствуют 6 белым кнопкам. Вы легко их различите по именам кнопок в заголовках процедур. Все они делают одно и то же дело – подготавливают для последующего воспроизведения конкретный файл. Конечно, адреса файлов на вашем компьютере будут совершенно другими.

Смысл остальных 6 процедур ясен после следующих пояснений:

· Stop– это метод объекта Плеер – приказ остановить воспроизведение. При следующем нажатии на кнопку «Старт» воспроизведение продолжится с того места, на котором оно было остановлено.

· PlayCount– это свойство объекта Плеер (сколько раз подряд проигрывать файл). Если установить его в 0, то воспроизведение будет повторяться бесконечно.

· Rate– это свойство объекта Плеер (темп воспроизведения). Если установить его, например, в 2, то воспроизведение будет осуществляться в 2 раза быстрее нормального, то есть люди на экране будут бегать, как сумасшедшие, и разговаривать голосом Буратино. А если в 0,5 – будут ползать, как вареные, и рычать.

 

Запустите проект. Проверьте, как работают все кнопки. Потаскайте влево-вправо указатель текущей позиции воспроизведения, подвигайте регулятор громкости.

Дополнительные замечания. Если вы установите свойство Visible плеера в False, то плеер вместе со своими инструментами управления не будет виден на форме, но вы все равно сможете им управлять, так как на форме останутся кнопки, созданные вами. Таким образом, вы сможете прослушивать звуковые клипы даже при «отсутствии» плеера на форме. Правда, когда вы попытаетесь просмотреть видеоклип, он все же появится.

Скопируйте папку с проектом и поэкспериментируйте над ней. Вот простые методы и свойства, с которыми можно поэкспериментировать:

AboutBox Метод, показывающий окно с краткими сведениями о медиаплеере.
Duration Свойство – общая продолжительность выбранного клипа в секундах.
CurrentPosition Свойство – на какой секунде находится в данный момент воспроизведение клипа.
Volume Свойство – громкость. Отрицательное число -10000 означает самую маленькую громкость – полную тишину. Число 0 (ноль) – самую большую громкость. промежуточные числа – промежуточную громкость.
Show… Несколько свойств, начинающиеся на Show, управляют тем, какие части медиаплеера показывать на экране.

Многие свойства объектов, такие как Rate или FileName, позволяют в программе устанавливать и менять их значение, как это мы только что и делали (скажем, Плеер.Rate = 1). К ним относятся также Volume и CurrentPosition. Но существуют свойства, которые этого не позволяют. Они называются свойствами только для чтения (ReadOnly). К ним относится Duration. Какая же от них тогда польза? Польза от них хотя бы та, что мы можем посмотреть, чему равно их значение, пусть даже задаем его не мы. Сделать это можно, например, поместив на форму текстовое поле и применив оператор такого вида:

TextBox1.Text = Плеер.Duration

Он означает, что значение свойства Text текстового поля TextBox1 становится равным значению свойства Duration объекта Плеер.

Множество остальных свойств и методов медиаплеера позволят вам пользоваться всем богатством его возможностей, включая выбор клипов из списка, проигрывание DVD и аудиодисков. Но на них я останавливаться не буду.

Microsoft Multimedia Control 6.0. В Visual Basic 6.0 есть собственный проигрыватель звуковых и видеофайлов – Microsoft Multimedia Control 6.0. Если у вас на компьютере установлен не только VB, но и Visual Basic 6.0, вы можете им воспользоваться и в VB. Но методы и свойства там другие. Описаны они в моей книжке (см. Список литературы).

Задание 4.

Усовершенствуйте ваш проигрыватель:

· Добавьте кнопку для замедленного воспроизведения. В будущем вы сможете вместо кнопок организовать плавный регулятор темпа воспроизведения.

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

· Добавьте большую метку. Когда вы щелкнете по белой кнопке, на метке должны появиться несколько слов или предложений, описывающих ваше впечатление от выбранного клипа.

· Добавьте кнопку и текстовое поле для определения продолжительности клипа. Когда вы щелкнете по кнопке, в поле должно появляться значение общей продолжительности выбранного клипа.

· Добавьте кнопку и два текстовых поля для определения текущей позиции воспроизведения. Когда вы щелкнете по кнопке, в одном поле должно появляться число секунд, прошедших с начала воспроизведения, в другом – число секунд, оставшихся до конца воспроизведения. В будущем вы сможете сделать так, чтобы цифры в этих полях менялись автоматически.

· Добавьте кнопку и текстовое поле для задания текущей позиции воспроизведения. При щелчке по кнопке текущая позиция воспроизведения должна устанавливаться в то значение в секундах, которое вы ввели в текстовое поле.

Задание 5.

«Музыка в кнопках калькулятора». Пусть при нажатии на калькуляторе каждой из четырех кнопок арифметических действий раздается какой-нибудь короткий мелодичный звук, причем для каждой кнопки свой. Таких звуков много на диске по адресу Windows\Media. Там они записаны в файлах, имеющих расширение wav. Указание: Установите свойство AutoStart в True.

Событияи их обработка

Разные события. Напомню, что объекты обладают свойствами, методами и событиями. Мы с вами уже познакомились с несколькими свойствами и методами. Но вот о событиях говорили мало. Фактически нам знаком лишь один сорт событий – щелчки мышкой по кнопке и пункту меню. Но у объектов VB (в частности – у формы и элементов управления) имеется большое количество и других событий. Так, у кнопки есть следующие события: щелчок мышкой по кнопке, появление мыши над кнопкой, нажатие клавиши мыши над кнопкой, отпускание клавиши мыши над кнопкой, изменение цвета кнопки, изменение размеров кнопки и несколько десятков других. У текстового поля есть следующие события: двойной щелчок мышкой по текстовому полю, изменение текста в текстовом поле и несколько десятков других. У формы есть следующие события: движение мыши над формой, изменение размеров формы, загрузка формы (например, появление при запуске проекта), закрытие формы (например, щелчком по крестику в правом верхнем углу) и несколько десятков других.

Обработка событий. Каждый раз, когда в предыдущих проектах мы щелкали мышкой по кнопке Button1 (то есть наступало событие – щелчок мышкой по кнопке Button1), компьютер делал то, что мы ему приказали: красил, показывал текст, играл мелодию и т.п. Делал он это только потому, что мы в окне кода заранее написали процедуру, в которой объяснили компьютеру, что ему в этом случае делать. Например:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

HScrollBar1.Width = 100

RadioButton2.Hide()

End Sub

Посмотрим в заголовок процедуры. Где в нем сказано, что процедуру эту надо выполнять именно при щелчке мышью и именно по кнопке Button1? Ответ: в правой части заголовка после скобок:

Handles Button1.Click

Здесь Click– щелчок мышью (событие), Button1 – объект, с которым происходит это событие, Handles– по-русски «обрабатывает». Полностью заголовок процедуры можно перевести так: Процедура, которая обрабатывает щелчок мышью по кнопке Button1, или по-другому – указывает, что нужно сделать при щелчке мышью по кнопке Button1.

Нечто похожее написано и в левой части заголовка процедуры:

Button1_Click

Но это всего лишь имя процедуры. Вы можете его как угодно изменить, процедура все равно будет работать.

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

Как получить заготовку процедуры для обработки любого события? Чтобы получить заготовку процедуры для обработки щелчка мышью по кнопке или пункту меню, мы в режиме проектирования просто делали двойной щелчок по кнопке или пункту меню. И в окне кода получали заготовку:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

End Sub

Почему появлялась заготовка именно для щелчка мышью, а не для какого-нибудь другого события? Потому что так удобней программисту, ведь щелчок мышью – самое популярное событие, когда речь идет о кнопке или пункте меню. А как нам получить заготовку для обработки какого-нибудь другого события? Разберем на примере.

Создайте проект с двумя текстовыми полями и кнопкой (Рис. 3.25).

Рис. 3.25

Поставим такую задачу: Пусть при появлении мышки над кнопкой Button1 в текстовом поле TextBox1 появляется текст «Мышь появилась над кнопкой».

Зайдите в окно кода. В его верхней части вы увидите два белых поля. Щелкните по черной треугольной стрелке в левом поле. Откроется список. В нем вы увидите имена всех элементов управления на форме и самой формы (Рис. 3.26).

Рис. 3.26

Поскольку нас интересует кнопка Button1, выберем в списке именно ее. Теперь наш путь – в правое поле. Щелкните по черной стрелке в правом поле. Откроется список. В нем вы увидите имена событий, связанных с кнопкой Button1 (Рис. 3.27).

Рис. 3.27

Выберите событие MouseEnter, которое в данном случае можно перевести так: «Появление мыши над». В окне кода появляется заготовка

Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.MouseEnter

 

End Sub

Завершающий фрагмент заголовка (Handles Button1.MouseEnter) говорит, что эта процедура обрабатывает (Handles) появление мыши (MouseEnter) над кнопкой Button1 .

Запишем внутрь процедуры нужный оператор. Получим:

Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.MouseEnter

TextBox1.Text = "Мышь появилась над кнопкой"

End Sub

 

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

Private Sub Button1_MouseUp(ByVal sender As System.Object, ByVal e _

As System.Windows.Forms.MouseEventArgs)Handles Button1.MouseUp

можно безнаказанно выбросить пространства имен, которые я выделил полужирным шрифтом. Получится гораздо компактнее:

Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)Handles Button1.MouseUp

В дальнейшем я часто так и буду поступать.

Примеры обработки событий. Ниже приведена программа из нескольких процедур для обработки в нашем проекте нескольких популярных событий формы и элементов управления. Введите программу в окно кода. Для этого добейтесь описанным выше способом, чтобы в окне кода появились заготовки процедур для каждого события. Для обработки событий формы выберите, если вы работаете в Visual Studio .NET 2003, в левом поле Form1 Events, а если в Visual Studio .NET – Base Class Events. Не забывайте, что после ввода очередной процедуры проект рекомендуется запускать и результаты работы процедуры проверять. Пояснения приведены ниже.

Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.MouseEnter

TextBox1.Text = "Мышь появилась над кнопкой"

End Sub

 

Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _

Handles Button1.MouseDown

TextBox1.Text = "Нажата клавиша мыши над кнопкой"

End Sub

 

Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Button1.MouseUp

TextBox1.Text = "Отпущена клавиша мыши над кнопкой"

End Sub

 

Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) _

Handles TextBox2.TextChanged

TextBox1.Text = "Текст в нижнем текстовом поле изменился"

Beep()

End Sub

 

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

MsgBox("Выполняется процедура Form1_Load. Форма еще не видна.")

TextBox1.Text = "Форма загружена"

End Sub

 

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed

MsgBox("Форма закрыается")

End Sub

 

Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize

TextBox1.Text = "Форма изменила размер"

End Sub

 

Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _

Handles MyBase.MouseMove

TextBox1.Text = "Мышь сдвинулась над формой"

End Sub

Пояснения.

· Событие TextChanged. Изменения текста отслеживаются в поле TextBox2, а не TextBox1, которое нам нужно только для выдачи сообщений. Не путайте. Проверяется это событие просто – попробуйте изменить текст в нижнем поле – сразу же в верхнем поле появится сообщение и вы услышите звук. Кстати, вы услышите его и при запуске проекта, потому что при запуске проекта VB записывает в поля их текст. А вот почему тогда мы не видим при запуске в верхнем поле сообщения "Текст в нижнем текстовом поле изменился", это загадка. Которую чуть позже попробуйте отгадать сами.

· Форма Form1 в правой части заголовка обработчика обозначается MyBase.

· Событие Loadформы – загрузка формы – происходит при запуске проекта. Это очень важное и широко используемое событие. Пока процедура Form1_Load выполняется, форму на экране вы ее еще не видите. Поэтому и все действия, которые вы запрограммировали в этой процедуре, выполняются до появления формы на экране. Тем не менее, как сама форма, так и элементы управления к этому моменту уже незримо присутствуют в проекте и с ними можно работать. Некоторые события успели произойти и быть обработаны до выполнения процедуры Form1_Load, о чем свидетельствовал звук перед появлением сообщения «Выполняется процедура Form1_Load. Форма еще не видна».

· Событие Closedформы – закрытие формы – происходит, когда вы закрываете форму, например, крестиком в ее правом верхнем углу. Раз форма закрыта, она исчезла из поля зрения вместе со своими текстовыми полями. Поэтому сообщение об этом факте я доверил не текстовому полю, а окну MsgBox.

· Когда вы водите мышью над формой, событие MouseMove возникает много раз в секунду.

Список событий объекта с пояснениями вы можете найти и в системе помощи (см. 4.4.9), поставив текстовый курсор на имя объекта и нажав F1. В открывшемся окне помощи вы найдете события по заголовку (Events) и по значкам молнии.

С остальными популярными событиями мы будем знакомиться по мере изучения книжки.




Читайте также:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...



©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (520)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.049 сек.)
Поможем в написании
> Курсовые, контрольные, дипломные и другие работы со скидкой до 25%
3 569 лучших специалисов, готовы оказать помощь 24/7