лекция надежность. А. ОсиповРазработка Windows приложенийна C#
Скачать 0.74 Mb.
|
TestStandartDialog, чтобы дать пользователям возможность открыть текстовый файл. 1. Задайте в меню Файл новую команду Открыть… 2. Перетащите в форму компонент OpenFileDialog. В области компонентов появился компонент openFileDialog1. 35 3. Дважды щелкните команду Открыть…, чтобы создать в редакторе кода обработчик событий по умолчанию. 4. В обработчик событий добавьте следующий код для отображения диалогового окна открытия файла: Stream myStream = null; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.InitialDirectory = @"c:\"; openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; openFileDialog1.FilterIndex = 2; if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { if ((myStream = openFileDialog1.OpenFile()) != null) { using (myStream) { richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); } } } catch (Exception ex) { MessageBox.Show("Error: Could not read file from disk: " + ex.Message); } } 5. Постройте и протестируйте приложение. Лабораторнаяработа 5. Взаимодействиеуправляемогои неуправляемогокода Цельработы Изучение способов использования возможностей объединения старого кода с кодом, управляемым средой CLR и получение навыков по работе со службами взаимодействия управляемого кода с неуправляемым. Упражнение 1. Использование COM-компонентадлясоздания PDF-приложения При создании приложений, использующих платформу Microsoft .NET, возникает задача применения в собственных проектах уже готовых библиотек кода, написанных на других языках. Сжатые сроки разработки и уже имеющиеся программные блоки не позволяют отказаться от готовых решений, поэтому их приходится использовать, встраивая в структуру собственных проектов. Код, выполняющийся под управлением среды выполнения (в случае платформы .NET — среды Common Language Runtime), называется управляемым 36 Код, запускаемый не под управлением среды, называется неуправляемым . Примером неуправляемого кода могут служить COM- компоненты, Microsoft ActiveX интерфейсы и функции API Win32. Microsoft .NET Framework позволяет взаимодействовать с COM- компонентами, COM+-службами, внешними типами библиотек и разными службами операционной системы. Платформа .NET Framework предлагает две службы взаимодействия управляемого кода с неуправляемым — Platform Invoke и COM interoperability, которые используют реальные возможности проекта. 1. Создайте новое Windows-приложение и назовите его PDF Reader. 2. Добавьте на форму элементы OpenFileDialog и MenuStrip. 3. Установите следующие свойства формы Form1: Свойство Значение Text Обозреватель документов в формате PDF WindowState Maximized 4. Свойство FileName элемента OpenFileDialog сделайте пустым. 5. Добавьте пункт меню верхнего уровня File c командами Open и Exit. 6. Выберите Tools | Choose Toolbox Items… 7. На вкладке COM Components выберите Adobe Acrobat (PDF) Reader (этот компонент появляется после установки программы Adobe Acrobat Reader)и нажмите OK. Убедитесь, что на панели Toolbox этот ЭУ действительно появился. 8. Перенесите Adobe Acrobat Reader на форму и установите свойству Dock значение Fill, а свойству (Name) – axAcroPDF1 (от имени объекта будет вызываться нужные нам методы, в принципе имя может быть любым). 9. Добавьте обработчик пункта меню Open: private void openToolStripMenuItem_Click (object sender, System.EventArgs e) { openFileDialog1.Filter = "Файлы pdf|*.pdf"; openFileDialog1.ShowDialog(); axAcroPDF1.LoadFile(openFileDialog1.FileName); } 10. Реализуйте обработчик события Click для пункта меню Exit. 11. Постройте и запустите приложение. При открытии документа в формате pdf происходит, по сути, встраивание в форму интерфейса программы Adobe Acrobat Reader. Упражнение 2. Вызовфункции API Службы Platform Invoke позволяют управляемому коду запускать функции неуправляемого кода, которые находятся в файлах библиотек динамической компоновки (DLL). 37 Эти службы предоставляют механизмы обнаружения и запуска неуправляемых функций и преобразование типов данных входящих и исходящих аргументов функции. Когда управляемый код запускает функцию неуправляемого кода, локализованную в DLL-файле, службы Platform Invoke находят этот DLL файл, загружают его в оперативную память и находят адрес функции в памяти. После этого службы передают входящие аргументы функции в стек, преобразовывают данные, которые необходимо перевести, эмулируют сборку мусора и передают управление по адресу неуправляемой функции в памяти. Первым шагом в запуске неуправляемой функции является объявление функции. Функция должна быть статической (static) и внешней (extern). Далее следует импорт библиотеки, содержащей эту функцию. Импортировать библиотеку нужно, используя атрибут DllImport, который находится в пространстве имен System.Runtime.InteropServices. 1. Создайте новое приложение и назовите его WinAnim. 2. Расположите на форме три кнопки и установите следующие свойства формы и кнопок: СвойствоЗначение 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 Появление из центра 3. Добавьте класс WinAPIClass: using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace AnimatedWindow { public class WinAPIClass { #region Анимация окна 38 /// /// Тип анимации окна. Перечисление возвращает тип int /// после приведения. Каждому элементу присвоено /// свое значение типа int. /// [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 }; /// /// Анимация окна. /// /// Окно. /// Время. /// Тип анимации. Если в /// неуправляемом коде используется перечисление, то его /// нужно конвертировать в тип данных int. /// [DllImportAttribute("user32.dll",EntryPoint="AnimateWindow",Set LastError=true)] public static extern bool AnimateWindow(IntPtr hwnd,int dwTime,int dwFlags); /// /// Анимация окна. /// /// Окно. /// Время. /// Флаги. /// AnimateWindowFlags Flags) { return AnimateWindow(ctrl.Handle,dwTime,(int)Flags); } #endregion } } 4. Создайте обработчики кнопок: private void btnAW_BLEND_Click(object sender, System.EventArgs e) { // Скрываем окно this.Hide(); // Запускаем анимацию. // Второй параметр в скобках — время анимации в // миллисекундах. 39 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. Постройте и запустите приложение. Протестируйте три вида анимации. Лабораторнаяработа 6. Организацияпечативформах windows Цельработы Изучение классов, реализующих задачу программирования печати и получение навыков по работе в программе с диалоговыми окнами. Упражнение 1. Использованиедиалоговыхокондляпечати При печати различных документов пользователям часто приходится изменять параметры печати. Обычно они ограничиваются заданием таких параметров, как ориентация страницы, ширина полей и размер бумаги. .NET Framework содержит классы, которые предоставляют пользователям возможность осуществлять и более сложные настройки. В ходе выполнения данного упражнения будет создано простое приложение, дающее пользователю возможность использовать PageSetupDialog, PrintDialog и PrintPreviewDialog для управления печатью пробного документа. Добавлениекомпонентовпечати 1. Создайте новый проект Windows Forms. Назовите его WinPrint. 40 2. Из Toolbox перенесите на форму элемент PrintDocument. 3. С помощью окна Properties для компонента printDocument1 добавьте обработчик события PrintPage и внутри него добавьте следующий код: Font myFont = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.Pixel); string Hello = "Hello World!"; e.Graphics.DrawString(Hello, myFont, Brushes.Black, 20, 20); 4. Откройте Form1 в режиме конструктора. 5. Из Toolbox перетащите три элемента Buttonна форму. 6. Укажите последовательно для кнопок значения свойства Text: Page Setup, Print, Print Preview. 7. При необходимости увеличьте размеры кнопок. 8. Из Toolbox перетащите в форму компоненты PageSetupDialog, PrintDialogи PrintPreviewDialog. 9. В окне Properties укажите свойству Documentкаждого компонента диалогового окна значение PrintDocumentl. 10. Для элемента PrintDialog присвойте свойству AllowSomePagesв значение True. Реализациявызовадиалоговыхокон 11. В конструкторе дважды щелкните кнопку Page Setupи добавьте следующий код: pageSetupDialog1.ShowDialog(); 12. В конструкторе дважды щелкните Printи добавьте следующий код: if (printDialog1.ShowDialog() == DialogResult.OK) printDocument1.Print(); 13. В конструкторе дважды щелкните Print Previewи добавьте следующий код: printPreviewDialog1.ShowDialog(); 14. Постройте и запустите приложение. Выберите каждую из кнопок, чтобы проверить открытие различных диалоговых окон печати. Упражнение 2. Созданиедокументапечати Выполнив это упражнение, вы дополните решение, разработанное в упражнении 1, и создадите приложение, разрешающее пользователю открывать текстовый файл и печатать его содержимое. 1. Откройте решение, выполненное в упражнении 1. 2. Из Toolbox перетащите элемент - диалоговое окно OpenFileDialog на форму. 3. В диалоговом окне Properties присвойте свойству Filterэлемента openFileDialog1значение Text Files | *.txt, и очистите поле свойства FileName. 4. На форму добавьте новую кнопку с названием Open File. 41 5. Дважды щелкните Open File, чтобы открыть редактор кода в об- работчике события Clickи выше обработчика события добавьте код: string s; string[] strings; int ArrayCounter = 0; 6. Внутри этого обработчика события добавьте код: System.Windows.Forms.DialogResult aResult; aResult = openFileDialog1.ShowDialog(); if (aResult == System.Windows.Forms.DialogResult.OK) { System.IO.StreamReader aReader = new System.IO.StreamReader(openFileDialog1.FileName); s = aReader.ReadToEnd(); aReader.Close(); strings = s.Split(‘\n’); 7. В обработчике события printDocument1_PrintPage замените существующий код следующим: float LeftMargin = e.MarginBounds.Left; float TopMargin = e.MarginBounds.Top; float MyLines = 0; float YPosition = 0; int Counter = 0; string CurrentLine; MyLines = e.MarginBounds.Height / this.Font.GetHeight(e.Graphics); while (Counter < MyLines && ArrayCounter <= strings.Length - 1) { CurrentLine = strings[ArrayCounter]; YPosition = TopMargin + Counter * this.Font.GetHeight(e.Graphics); e.Graphics.DrawString(CurrentLine, this.Font, Brushes.Black, LeftMargin, YPosition, new StringFormat()); Counter++; ArrayCounter++; } if (!(ArrayCounter >= strings.GetLength(0) - 1)) e.HasMorePages = true; else e.HasMorePages = false; 8. Постройте и запустите приложение. Выберите Open File и откройте текстовый файл на своем компьютере. Выберите Print Preview для просмотра файла в диалоговом окне Print Preview. Напечатайте файл (если принтер подключен). Попробуйте с другой страницей и параметрами печати. Упражнение 3. Созданиеспециализированнойформыпредварительного просмотра Хотя компонент PrintPreviewDialogявляется простым, удобным в работе способом предоставить в ваших приложениях функциональность предварительного просмотра, его трудно настроить. Для приложений со специализированным предварительным просмотром можно для создания 42 специализированного компонента предварительного просмотра использовать элемент управления PrintPreviewControl. Выполнив данное упражнение, вы создадите специализированную форму предварительного просмотра и добавите ее к решению, созданному в упражнении 2. Добавите к форме PrintPreviewControl элементы управления, дающие пользователю возможность указывать масштаб, количество строк и столбцов, а также переключать режим сглаживания. 1. Откройте решение, выполненное в упражнении 2. 2. Добавьте к проекту новую форму. 3. Из Toolbox перетащите SplitContainerв форму. В свойстве Orientationдолжна быть задана вертикаль. 4. Из Toolbox перетащите PrintPreviewControlв Рапе12 и присвойте свойству Dockзначение Fill. 5. Для printPreviewControl1присвойте свойству Modifiersзначение Internal. 6. Из Toolbox добавьте в Рапеl1 три элемента управления Label, три NumericUpDown (надпись Label определяет назначение соответствующего элемента NumericUpDown), один Checkboxи один Button. Свяжите надписи с элементами управления NumericUpDownи установите свойства, как показано в следующей таблице: Элемент управления Свойство Значение Labell Text Rows Label2 Text Columns Label3 Text Magnification NumericUpDown 1 Minimum 1 NumericUpDown2 Minimum 1 NumericUpDown3 Minimum 25 NumericUpDown 1 Maximum 8 NumericUpDown2 Maximum 8 NumericUpDown3 Maximum 500 NumericUpDown3 Increment 25 CheckBoxl Text AntiAlias Buttonl Text 7. Дважды щелкните NumericUpDown1и добавьте к обработчику события numericUpDown1_ValueChangedследующий код: printPreviewControl1.Rows = (int)numericUpDown1.Value; 8. В конструкторе дважды щелкните NumericUpDown2и добавьте к обработчику события numericUpDown2_ValueChanged следующий код: printPreviewControl1.Columns = (int)numericUpDown2.Value; Свойство Columns указывает количество отображаемых страниц по горизонтали, а свойство Rows – по вертикали. 9. В конструкторе дважды щелкните NumericUpDown3и добавьте к обработчику события numericUpDown3_ValueChanged следующий код printPreviewControl1.Zoom = (double)numericUpDown3.Value / 100; 43 10. В конструкторе дважды щелкните CheckBox1и добавьте к обработчику события checkBox1_CheckedChanged следующий код: printPreviewControl1.UseAntiAlias = checkBox1.Checked; 11. В конструкторе дважды щелкните Button1 и добавьте к обработчику события button1_Clickследующий код this.DialogResult = System.Windows.Forms.DialogResult.OK; 12. В редакторе кода формы Form1закомментируйте код, существующий в обработчике события PrintPreviewToolStripMenuItemClick, и добавьте следующий: Form2 aForm = new Form2(); System.Windows.Forms.DialogResult aResult; aForm.printPreviewControl1.Document = printDocument1; aResult = aForm.ShowDialog(); if (aResult == System.Windows.Forms.DialogResult.OK) printDocument1.Print(); 13. Постройте и выполните приложение. С помощью команды Open меню File откройте текстовый файл и затем щелкните Print Preview для проверки вашей новой формы предварительного просмотра. 14. Сохраните Ваше приложение и закройте Visual Studio .NET. Лабораторнаяработа 7. Асинхронноепрограммирование Цельработы Изучение возможностей, реализующих асинхронное программирование и получение навыков по работе в программе с потоками. Упражнение 1. Работаскомпонентом BackgroundWorker Класс BackgroundWorker позволяет выполнить операцию в отдельном, выделенном потоке. Операции, требующие много времени, такие как загрузка и транзакции базы данных, могут создавать впечатление, что пользовательский интерфейс перестал отвечать на действия пользователя. Если необходимо обеспечить быстрое реагирование пользовательского интерфейса, а подобные операции приводят к длительным задержкам, эффективным решением может стать класс BackgroundWorker. Чтобы запустить занимающую много времени операцию в фоновом режиме, следует создать экземпляр |