При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Использование библиотек кода в windows-формах
Динамик компьютера. Библиотека Kernel32.dll
При включении компьютера и загрузке операционной системы раздается сигнал из динамика на системном блоке. Режим залипания клавиш, включаемый при пятикратном нажатии клавиши Shift, также сопровождается звуковым сигналом. Этот простейший динамик не может воспроизводить сложные звуки, но его иногда можно использовать, когда необходимо обратить внимание пользователя на какое-либо событие, не будучи уверенным в том, что на его компьютере имеются звуковые колонки.
Создайте новое Windows-приложение и назовите его EasySound. Располагаем на форме семь кнопок и устанавливаем следующие свойства формы и кнопок:
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).
На языке С метод в обработчике будет выглядеть следующим образом:
BOOL Beep(DWORD dwFreq, DWORD dwDuration);
На диске, прилагаемом к книге, вы найдете приложение EasySound (Code\Glava5\EasySound).
Проявление окна
Обычная Windows-форма тоже может быть анимирована, что иногда используется для создания заставки автозагрузочных дисков (рис. 5.4). К сожалению, возможное отсутствие библиотеки .NET Framework на компьютере пользователя делает ненадежным использование такого рода приложений, написанных на C#. Остается надеяться, что выход новой версии – Microsoft Windows Longhorn — изменит ситуацию в лучшую сторону (подробнее о распространении приложений — в "Создание пакетов установки" ).
Создайте новое приложение и назовите его AnimatedWindow. Расположите на форме три кнопки и установите следующие свойства формы и кнопок:
Button2, свойство | Значение |
---|---|
Name | btnHOR_AW_SLIDE |
Location | 30; 118 |
Size | 232; 23 |
Text | Горизонтальное появление |
Button3, свойство | Значение |
---|---|
Name | btnCenter_AW_SLIDE |
Location | 30; 182 |
Size | 232; 23 |
Text | Появление из центра |
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).