Опубликован: 11.09.2006 | Доступ: свободный | Студентов: 7648 / 473 | Оценка: 4.26 / 3.45 | Длительность: 30:46:00
ISBN: 978-5-9556-0080-2
Лекция 5:

Использование библиотек кода в windows-формах

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

Динамик компьютера. Библиотека Kernel32.dll

При включении компьютера и загрузке операционной системы раздается сигнал из динамика на системном блоке. Режим залипания клавиш, включаемый при пятикратном нажатии клавиши Shift, также сопровождается звуковым сигналом. Этот простейший динамик не может воспроизводить сложные звуки, но его иногда можно использовать, когда необходимо обратить внимание пользователя на какое-либо событие, не будучи уверенным в том, что на его компьютере имеются звуковые колонки.

Создайте новое Windows-приложение и назовите его EasySound. Располагаем на форме семь кнопок и устанавливаем следующие свойства формы и кнопок:

Form1, форма, свойство Значение
Size 344; 264
Text Easy Sound
Button1, свойство Значение
Name btnDo
Location 0; 0
Size 48; 232
Text До
Button2, свойство Значение
Name btnRe
Location 48; 0
Size 48; 232
Text Ре
Button3, свойство Значение
Name btnMi
Location 96; 0
Size 48; 232
Text Ми
Button4, свойство Значение
Name btnFa
Location 144; 0
Size 48; 232
Text Фа
Button5, свойство Значение
Name btnSol
Location 192; 0
Size 48; 232
Text Соль
Button6, свойство Значение
Name btnLya
Location 240; 0
Size 48; 232
Text Ля
Button7, свойство Значение
Name btnС
Location 288; 0
Size 48; 232
Text Си

Добавляем класс WinAPIClass:

using System;
using System.Runtime.InteropServices;
namespace EasySound
{

 public class WinAPIClass
  {
    #region Вызов сигнала
	/// <summary>
	/// Вызов сигнала.
	/// </summary>
	/// <param name="frequency">Частота сигнала в герцах. Диапазон от 37 до 32767 Гц.</param>
	/// <param name="duration">Продолжительность сигнала в миллисекундах.</param>			
	/// <returns></returns>		
	[DllImport("Kernel32.dll")]
	public static extern bool Beep (int frequency, int duration);
	#endregion
		
	}
}
Листинг 5.4.

Создаем обработчики для кнопок:

private void btnDo_Click(object sender, System.EventArgs e)
		{
//В скобках: первый параметр — частота, второй — продолжительность сигнала
		WinAPIClass.Beep(1000, 100);
		}

		private void btnRe_Click(object sender, System.EventArgs e)
		{
		WinAPIClass.Beep(3000, 100);
		}

		private void btnMi_Click(object sender, System.EventArgs e)
		{
		WinAPIClass.Beep(5000, 100);
		}

		private void btnFa_Click(object sender, System.EventArgs e)
		{
		WinAPIClass.Beep(7000, 100);
		}

		private void btnSol_Click(object sender, System.EventArgs e)
		{
		WinAPIClass.Beep(9000, 100);
		}

		private void btnLya_Click(object sender, System.EventArgs e)
		{
		WinAPIClass.Beep(11000, 100);
		}

		private void btnC_Click(object sender, System.EventArgs e)
		{
		WinAPIClass.Beep(13000, 100);
		}
Листинг 5.5.

Запускаем приложение. Я не уверен, что в музыкальном смысле создаваемые сигналы в точности идентичны своим названиям, но тем не менее определенное сходство наверняка есть (рис. 5.3).

Приложение Easy Sound

Рис. 5.3. Приложение Easy Sound

На языке С метод в обработчике будет выглядеть следующим образом:

BOOL Beep(DWORD dwFreq, DWORD dwDuration);

На диске, прилагаемом к книге, вы найдете приложение EasySound (Code\Glava5\EasySound).

Проявление окна

Обычная Windows-форма тоже может быть анимирована, что иногда используется для создания заставки автозагрузочных дисков (рис. 5.4). К сожалению, возможное отсутствие библиотеки .NET Framework на компьютере пользователя делает ненадежным использование такого рода приложений, написанных на C#. Остается надеяться, что выход новой версии – Microsoft Windows Longhorn — изменит ситуацию в лучшую сторону (подробнее о распространении приложений — в "Создание пакетов установки" ).

Анимированная форма — заставка автозагрузочного диска

увеличить изображение
Рис. 5.4. Анимированная форма — заставка автозагрузочного диска

Создайте новое приложение и назовите его AnimatedWindow. Расположите на форме три кнопки и установите следующие свойства формы и кнопок:

Form1, форма, свойство Значение
Text Анимация формы
Button1, свойство Значение
Name btnAW_BLEND
Location 30; 62
Size 232; 23
Text Проявление
Button2, свойство Значение
Name btnHOR_AW_SLIDE
Location 30; 118
Size 232; 23
Text Горизонтальное появление
Button3, свойство Значение
Name btnCenter_AW_SLIDE
Location 30; 182
Size 232; 23
Text Появление из центра

Добавляем класс WinAPIClass:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace AnimatedWindow
{
	
	public class WinAPIClass
	{
		#region Анимация окна
		/// <summary>
		/// Тип анимации окна. Перечисление возвращает тип данных int
		/// после приведения. Каждому элементу перечисления присвоено 
		/// свое значение типа int.
		/// </summary>	
		[Flags]
			public enum AnimateWindowFlags:int
		{
			AW_HOR_POSITIVE = 1,
			AW_HOR_NEGATIVE = 2,
			AW_VER_POSITIVE = 4,
			AW_VER_NEGATIVE = 8,
			AW_CENTER = 16,
			AW_HIDE = 65536,
			AW_ACTIVATE = 131072,
			AW_SLIDE = 262144,
			AW_BLEND = 524288
		};
		
		/// <summary>
		/// Анимация окна.
		/// </summary>
		/// <param name="hwnd">Окно.</param>
		/// <param name="dwTime">Время.</param>
		/// <param name="dwFlags">Тип анимации. Если в неуправляемом 
		/// коде используется перечисление, то его нужно конвертировать
		/// в тип данных int. </param>			
		/// <returns></returns>
		[DllImportAttribute("user32.dll",EntryPoint="AnimateWindow",SetLastError=true)]
		public static extern bool AnimateWindow(IntPtr hwnd,int dwTime,int dwFlags);
		
		/// <summary>
		/// Анимация окна.
		/// </summary>
		/// <param name="ctrl">Окно.</param>
		/// <param name="dwTime">Время.</param>
		/// <param name="Flags">Флаги.</param>		
		/// <returns></returns>
		public static bool AnimateWindow(Control ctrl,int dwTime, AnimateWindowFlags Flags)
		{
			return AnimateWindow(ctrl.Handle,dwTime,(int)Flags);
		}
		#endregion
	}
}
Листинг 5.6.

Создаем обработчики кнопок:

private void btnAW_BLEND_Click(object sender, System.EventArgs e)
		{
			
				// Скрываем окно
				this.Hide();
				// Запускаем анимацию. Второй параметр в скобках — время анимации в миллисекундах.
				WinAPIClass.AnimateWindow(this, 3000, WinAPIClass.AnimateWindowFlags.AW_ACTIVATE|WinAPIClass.AnimateWindowFlags.AW_BLEND);
				// Отображаем кнопки после анимации
				this.btnAW_BLEND.Invalidate();
				this.btnHOR_AW_SLIDE.Invalidate();
				this.btnCenter_AW_SLIDE.Invalidate();

		}

		private void btnHOR_AW_SLIDE_Click(object sender, System.EventArgs e)
		{
			
			this.Hide();
			WinAPIClass.AnimateWindow(this, 3000, WinAPIClass.AnimateWindowFlags.AW_HOR_POSITIVE|WinAPIClass.AnimateWindowFlags.AW_SLIDE);
			this.btnAW_BLEND.Invalidate();
			this.btnHOR_AW_SLIDE.Invalidate();
			this.btnCenter_AW_SLIDE.Invalidate();
		}

		private void btnCenter_AW_SLIDE_Click(object sender, System.EventArgs e)
		{
			this.Hide();
			WinAPIClass.AnimateWindow(this, 3000, WinAPIClass.AnimateWindowFlags.AW_CENTER|WinAPIClass.AnimateWindowFlags.AW_SLIDE);
			this.btnAW_BLEND.Invalidate();
			this.btnHOR_AW_SLIDE.Invalidate();
			this.btnCenter_AW_SLIDE.Invalidate();
		
		}
Листинг 5.7.

При запуске приложения доступны три вида анимации (рис. 5.5). Добавьте кнопок на форму и попробуйте вызвать другие эффекты перечисления AnimateWindowFlags.

Анимация формы. А — готовое приложение, Б — проявление (изменение прозрачности), В — горизонтальное появление справа, Г — появление из центра (расширение)

увеличить изображение
Рис. 5.5. Анимация формы. А — готовое приложение, Б — проявление (изменение прозрачности), В — горизонтальное появление справа, Г — появление из центра (расширение)

На языке С метод в обработчике будет выглядеть следующим образом:

BOOL AnimateWindow(HWND hwnd, DWORD dwTime, DWORD dwFlags);

На диске, прилагаемом к книге, вы найдете приложение AnimatedWindow (Code\Glava5\ AnimatedWindow).

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/