Васильев А.Н. Основы программирования на C#. Васильев А. Н. Программирование
Скачать 5.54 Mb.
|
434 // Ⱦɨɛɚɜɥɟɧɢɟ ɦɟɬɤɢ ɜ ɨɤɧɨ: this.Controls.Add(lbl); // Ɉɛɴɟɤɬ ɬɟɤɫɬɨɜɨɝɨ ɩɨɥɹ: tb=new TextBox(); // ɒɢɪɢɧɚ ɩɨɥɹ: tb.Width=this.Width-30; // Ʉɨɨɪɞɢɧɚɬɵ ɩɨɥɹ: tb.Left=lbl.Left; tb.Top=lbl.Bottom+5; // Ⱦɨɛɚɜɥɟɧɢɟ ɩɨɥɹ ɜ ɨɤɧɨ: this.Controls.Add(tb); // Ɉɛɴɟɤɬ ɨɩɰɢɢ: option=new CheckBox(); // ɉɨɞɩɢɫɶ ɞɥɹ ɨɩɰɢɢ: option.Text= Ǝɇɟ ɭɱɢɬɵɜɚɬɶ ɪɟɝɢɫɬɪƎ; // Ʉɨɨɪɞɢɧɚɬɵ ɨɩɰɢɢ: option.Left=tb.Left; option.Top=tb.Bottom+5; // Ɋɚɡɦɟɪɵ ɨɩɰɢɢ: option.Height=30; option.Width=tb.Width; // ɋɨɫɬɨɹɧɢɟ ɨɩɰɢɢ (ɩɨ ɭɦɨɥɱɚɧɢɸ - ɭɫɬɚɧɨɜɥɟɧɚ): option.Checked=true; // Ⱦɨɛɚɜɥɟɧɢɟ ɨɩɰɢɢ ɜ ɨɤɧɨ: this.Controls.Add(option); // Ɉɛɴɟɤɬ ɤɧɨɩɤɢ: ok=new Button(); // Ɍɟɤɫɬ ɞɥɹ ɤɧɨɩɤɢ: ok.Text= ƎOKƎ; // Ɋɚɡɦɟɪɵ ɤɧɨɩɤɢ: ok.Width=this.Width/2-20; ok.Height=30; Приложения с графическим интерфейсом // Ʉɨɨɪɞɢɧɚɬɵ ɤɧɨɩɤɢ: ok.Left=tb.Left; ok.Top=option.Bottom+5; // Ɉɛɪɚɛɨɬɱɢɤ ɞɥɹ ɫɨɛɵɬɢɹ, ɫɜɹɡɚɧɧɨɝɨ ɫɨ ɳɟɥɱɤɨɦ // ɩɨ ɤɧɨɩɤɟ: ok.Click+=OnBtnsClick; // Ɉɛɴɟɤɬ ɤɧɨɩɤɢ: cancel=new Button(); // Ɍɟɤɫɬ ɞɥɹ ɤɧɨɩɤɢ: cancel.Text= ƎɈɬɦɟɧɚƎ; // Ɋɚɡɦɟɪɵ ɤɧɨɩɤɢ: cancel.Size=ok.Size; // Ʉɨɨɪɞɢɧɚɬɵ ɤɧɨɩɤɢ: cancel.Top=ok.Top; cancel.Left=tb.Right-cancel.Width; // Ɉɛɪɚɛɨɬɱɢɤ ɞɥɹ ɫɨɛɵɬɢɹ, ɫɜɹɡɚɧɧɨɝɨ ɫɨ ɳɟɥɱɤɨɦ // ɩɨ ɤɧɨɩɤɟ: cancel.Click+=OnBtnsClick; // Ⱦɨɛɚɜɥɟɧɢɟ ɤɧɨɩɨɤ ɜ ɨɤɧɨ: this.Controls.Add(ok); this.Controls.Add(cancel); } // Ɉɬɤɪɵɬɵɣ ɦɟɬɨɞ (ɜɧɟɲɧɟɝɨ ɤɥɚɫɫɚ) ɞɥɹ ɨɬɨɛɪɚɠɟɧɢɹ // ɨɤɧɚ ɫ ɩɨɥɟɦ ɜɜɨɞɚ: public static void ShowInputBox(){ // ɋɨɡɞɚɧɢɟ ɢ ɨɬɨɛɪɚɠɟɧɢɟ ɨɤɧɚ: Application.Run(new MyInputBox()); } // Ɂɚɤɪɵɬɵɣ ɦɟɬɨɞ (ɜɧɟɲɧɟɝɨ ɤɥɚɫɫɚ), ɢɫɩɨɥɶɡɭɟɦɵɣ ɞɥɹ // ɨɛɪɚɛɨɬɤɢ ɫɨɛɵɬɢɣ, ɫɜɹɡɚɧɧɵɯ ɫɨ ɳɟɥɱɤɚɦɢ ɩɨ ɤɧɨɩɤɚɦ: private void OnBtnsClick(object obj,EventArgs ea){ // ɋɫɵɥɤɚ ɧɚ ɨɛɴɟɤɬ ɤɧɨɩɤɢ, ɜɵɡɜɚɜɲɟɣ ɫɨɛɵɬɢɟ: Глава 8 436 Button btn=(Button)obj; // ɂɞɟɧɬɢɮɢɤɚɰɢɹ ɤɧɨɩɤɢ: if(btn==ok){ // ȿɫɥɢ ɩɟɪɜɚɹ ɤɧɨɩɤɚ // Ɉɤɧɨ ɭɛɢɪɚɟɬɫɹ ɫ ɷɤɪɚɧɚ: this.Visible=false; // ɋɨɡɞɚɟɬɫɹ ɢ ɨɬɨɛɪɚɠɚɟɬɫɹ ɨɤɧɨ ɫ ɢɡɨɛɪɚɠɟɧɢɟɦ: new MyForm(tb.Text,option.Checked).ShowDialog(); }else{ // ȿɫɥɢ ɜɬɨɪɚɹ ɤɧɨɩɤɚ // Ɂɚɜɟɪɲɟɧɢɟ ɪɚɛɨɬɵ ɩɪɨɝɪɚɦɦɵ: Application.Exit(); } } } // Ƚɥɚɜɧɵɣ ɤɥɚɫɫ: class TextBoxAndCheckBoxDemo{ [STAThread] // Ƚɥɚɜɧɵɣ ɦɟɬɨɞ: static void Main(){ // Ɉɬɨɛɪɚɠɟɧɢɟ ɨɤɧɚ ɫ ɩɨɥɟɦ ɜɜɨɞɚ: MyInputBox.ShowInputBox(); Класс MyInputBox для окна с полем ввода создается путем наследования класса Form. В классе есть закрытое поле option класса CheckBox. Это ссылка на объект опции. Закрытые поля ok и cancel класса Button являются ссылками на объекты кнопок OK и Отмена, которые отображаются в окне. Еще в классе есть закрытое поле tb класса TextBox ссылка на объект текстового поля). В конструкторе внешнего класса задаются размеры и положение окна, заголовок окна, тип рамки и шрифт. Также создается метка, которая содержит текст, размещаемый над полем ввода Приложения с графическим интерфейсом 437 Объект текстового поля создается командой tb=new TextBox(). Мы задаем ширину поля (команда tb.Width=this.Width-30) и координаты поля (команды tb.Left=lbl.Left и tb.Top=lbl.Bottom+5), после чего поле добавляется в окно (команда this.Controls.Add(tb)). { i НАЗ А МЕТКУ Таким образом, ширина поляна пикселей меньше ширины окна. Горизонтальная координата поля такая же, как и у метки. Поверти- кали поле смещено на 5 пикселей вниз по сравнению с нижней границей метки. Высота поля определяется размером шрифта, заданным для поля. Объект опции создается командой option=new CheckBox(). Подпись для опции определяем командой option.Text= Ǝɇɟ ɭɱɢɬɵ- ɜɚɬɶ ɪɟɝɢɫɬɪƎ. Координаты и размеры опции задаем командами option.Left=tb.Left (горизонтальная координата опции совпадает с горизонтальной координатой текстового поля, option.Top= tb.Bottom+5 (по вертикали опция сдвинута на 5 пикселей вниз по отношению к нижней границе текстового поля, option.Height=30 (высота опции в пикселях равна 30) и option.Width=tb.Width (ширина опции равна ширине текстового поля. Состояние опции определяется командой option.Checked=true, что означает наличие флажка у опции (опция установлена. В окно опция добавляется командой Объект ok для кнопки OK и объект cancel для кнопки Отмена создаются на основе класса Button. Задается текст кнопок, их размеры и положение НАЗ А МЕТКУ Чтобы размер второй кнопки был таким же, как и первой, используем команду cancel.Size=ok.Size . Для выравнивания второй кнопки по правому краю текстового поля используем команду cancel. Left=tb.Right-cancel.Width . Здесь горизонтальная координата кнопки вычисляется как разность правой координаты поля и ширины кнопки. Достоин внимания тот факт, что для обеих кнопок в качестве обработчика события, связанного со щелчком по кнопке, зарегистрирован метод Глава 8 438 OnBtnsClick() (команды ok.Click+=OnBtnsClick и cancel. Click+=OnBtnsClick ). { i НАЗ А МЕТКУ В классе MyInputBox описан открытый статический метод ShowInputBox() . При вызове этого метода выполняется команда. Командой создается объект класса MyInputBox для окна с полем ввода, и окно отображается на экране. В главном методе программы для отображения окна с полем ввода из класса MyInputBox запускается метод Закрытый метод OnBtnsClick() внешнего класса MyInputBox, используемый для обработки событий, связанных со щелчками по кнопкам, получает два аргумента. Нас интересует первый аргумент obj класса object), являющийся ссылкой на объект компонента, на котором произошло событие НАЗ А МЕТКУ Проблема в том, что кнопки две, а метод-обработчик один. Поэтому при вызове метода необходимо определить, по какой из двух кнопок сделан щелчок. Ссылка obj на объект, на котором произошло событие, передается как ссылка класса object. Мы знаем, что событие произошло на кнопке (объект класса Button). Поэтому выполняется команда Button btn=(Button)obj, которой ссылка на вызвавший событие объект преобразуется к типу Button (то есть мы получаем возможность работать с объектом как с объектом кнопки. Идентификация кнопки выполняется в условном операторе. Там проверяется условие btn==ok. Истинность условия означает, что событие произошло на кнопке ok. Если так, то командой this.Visible=false окно с полем ввода становится невидимым (убирается с экрана, а командой new MyForm(tb. Text,option.Checked).ShowDialog() создается анонимный объект внутреннего класса MyForm, и из этого объекта вызывается метод ShowDialog() . В результате вызова этого метода окно с изображением животного появляется на экране. Аргументами конструктору передаются текст из текстового поля (выражение tb.Text) и состояние опции логическое значение option.Checked). Приложения с графическим интерфейсом ПОДРОБНОСТИ bМетод ShowDialog() наследуется из класса Form . При вызове метода отображается окно, из объекта которого вызывается метод. Метод из класса Application в данном случае не используется, поскольку этот метод вызывается только один раз. Если условие btn==ok ложно, то, рассуждая методом исключения, получаем, что событие произошло на кнопке cancel. В этом случае командой) завершается выполнение программы. Осталось расставить все точки на «i» в отношении внутреннего закрытого класса MyForm (создается наследованием класса Form). Напомним, что это класс используется для создания объекта окна с изображением животного. Большинство команд должны быть знакомы читателю. Мы, как и ранее, имеем дело с текстовыми массивами, содержащими названия животных и названия файлов с изображениями, и полем с путем к каталогу с изображениями. Конструктору класса передается два аргумента текст название животного, которое ввел пользователь в текстовое поле) и логическое значение (состояние опции в окне с полем ввода. В теле метода текстовой переменной txt присваивается значение ƎɀɢɪɚɮƎ, а текстовой переменной file присваивается значение Ǝgiraffe.pngƎ. Это название животного и файл сего изображением — такие значения используются, если пользователь ввел некорректное имя для животного. Далее перебираются элементы массива animals, в котором хранятся названия животных. Элементы из массива сравниваются с текстовым значением t, переданным аргументом конструктору. В условном операторе проверяется условие (t==animals[k])||((t.ToLower()==animals[k]. ToLower())&state) . Это сложное условие, которое истинно, если истинно хотя бы одно из двух условий t==animals[k] (текстовые значения равны) или (t.ToLower()==animals[k].ToLower())&state. Второе условие истинно, если одновременно истинны условия t.ToLower()==animals[k].ToLower() и state. Истинность условия) означает, что тексты равны без учета состояния регистра букв. Значение true для переменной означает, что установлен флажок опции в окне с полем ввода НАЗ А МЕТКУ Напомним, что вторым аргументом конструктору класса MyForm при создании объекта передается значение свойства Checked объекта Глава опции. Поэтому значение аргумента state отождествляется со значением свойства Значение выражения t.ToLower()==animals[k].ToLower() вычисляется так два текстовых значения (из аргумента t и элемента animals[k] ) переводятся в нижний регистр, и полученные значения сравниваются на предмет равенства. Таким образом, условие в условном операторе истинно, если текстовые значения из аргумента t и элемента animals[k] полностью совпадают или если они совпадают без учета состояния регистра букв, но при этом установлена опция в окне с полем ввода. Если для какого-то индекса k условие истинно, то командой txt=animals[k] в переменную txt записывается название выбранного животного, командой file=files[k] в переменную file записывается название соответствующего файла, а командой break завершается выполнение оператора цикла. После завершения оператора цикла определяется заголовок окна команда this.Text=txt). Это название животного. Также задаются другие параметры окна (шрифт и рамка. Командой Image img=Image. FromFile(path+file) создается объект изображения (с учетом определенного названия файла с изображением. Это изображение используется как изображение для метки lbl (команда lbl.Image=img). Мы определяем высоту (инструкция img.Height) и ширину (инструкция img.Width ) изображения. Эти параметры используются при определении размеров метки, а также кнопки, используемой для завершения работы приложения. Выполняются и другие операции определяются размеры окна, начальное положение окна, а также добавляются компоненты (метка и кнопка) в окно. В главном методе из класса MyInputBox вызывается статический метод ShowInputBox(), в результате чего отображается первое окно с полем ввода и опцией. Меню и панель инструментов Это же вам не лезгинка, а твист! из к/ф Кавказская пленница» Далее описывается еще одна программа, при выполнении которой появляется окно с изображением животных. Но теперь мы для выбора Приложения с графическим интерфейсом 441 изображения будем использовать главное меню и панель инструментов. Как выглядит в этом случае окно, показано на рис. Рис. 8.29. Окно с главным меню и панелью инструментов Окно в этом случае содержит изображение в центральной части. Под изображением есть кнопка с названием животного. Над изображением размещена панель инструментов из четырех кнопок. Каждая кнопка содержит миниатюрное изображение животного, а при наведении курсора мыши на кнопку появляется подсказка с названием животного (см. рис. 8.29). В окне также есть главное меню из трех пунктов Программа, Красивые и Сильные. Изображение в окне меняется при щелчке по кнопке на панели инструментов или при выборе команды изменю. Вместе с изображением меняется и название кнопки. При щелчке по кнопке окно закрывается. На рис. 8.30 показано окно с изображением лисы. Также в окне раскрыт пункт меню Программа. В этом пункте всего одна команда Выход, при выборе которой завершается работа программы. Рис. 8.30. Содержимое пункта меню Программа Глава На рис. 8.31 показано окно программы с изображением енота. В окне открыт пункт меню Красивые. В этом пункте меню содержатся команды Лиса и Енот. Команды предназначены для выбора животного, изображение которого будет показано в окне. Рис. 8.31. Содержимое пункта меню Красивые На рис. 8.32 окно содержит изображение медведя, и при этом открыт пункт меню Сильные. В этом пункте меню есть две команды Волки Медведь, предназначенные для выбора животного. Рис. 8.32. Содержимое пункта меню Сильные Теперь рассмотрим программный код в листинге 8.8, выполнение которого приводит к появлению описанного выше окна. Листинг 8.8. Использование меню и панели инструментов System; using System.Drawing; Приложения с графическим интерфейсом System.Windows.Forms; // Ʉɥɚɫɫ ɨɤɧɚ: class MyForm:Form{ // ɉɭɬɶ ɤ ɤɚɬɚɥɨɝɭ ɫ ɢɡɨɛɪɚɠɟɧɢɹɦɢ: private string path= ƎD:/Books/pictures/csharp/Ǝ; // ɋɫɵɥɤɚ ɧɚ ɨɛɴɟɤɬ ɦɟɬɤɢ: private Label pict; // ɋɫɵɥɤɚ ɧɚ ɨɛɴɟɤɬ ɤɧɨɩɤɢ: private Button btn; // Ʉɨɧɫɬɪɭɤɬɨɪ: public MyForm():base(){ // Ɋɚɡɦɟɪɵ ɨɤɧɚ: this.Size=new Size(240,230); // ɇɚɱɚɥɶɧɨɟ ɩɨɥɨɠɟɧɢɟ ɨɤɧɚ: this.StartPosition=FormStartPosition.CenterScreen; // Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ: this.Text= Ǝȼ ɦɢɪɟ ɠɢɜɨɬɧɵɯƎ; // Ɉɤɧɨ ɩɨɫɬɨɹɧɧɵɯ ɪɚɡɦɟɪɨɜ: this.FormBorderStyle=FormBorderStyle.FixedSingle; // Ɉɤɧɨ ɧɟɥɶɡɹ ɪɚɡɜɟɪɧɭɬɶ ɧɚ ɜɟɫɶ ɷɤɪɚɧ: this.MaximizeBox=false; // Ɉɛɴɟɤɬ ɞɥɹ ɝɥɚɜɧɨɝɨ ɦɟɧɸ: MainMenu menu=new MainMenu(); // Ɉɛɴɟɤɬ ɞɥɹ ɩɭɧɤɬɚ ɦɟɧɸ ƎɉɪɨɝɪɚɦɦɚƎ: MenuItem prog=new MenuItem( ƎɉɪɨɝɪɚɦɦɚƎ); // Ⱦɨɛɚɜɥɟɧɢɟ ɤɨɦɚɧɞɵ ɜ ɩɭɧɤɬ ɦɟɧɸ ƎɉɪɨɝɪɚɦɦɚƎ: prog.MenuItems.Add( ƎȼɵɯɨɞƎ,OnButtonClick); // Ɉɛɴɟɤɬ ɞɥɹ ɩɭɧɤɬɚ ɦɟɧɸ ƎɄɪɚɫɢɜɵɟƎ: MenuItem beautiful=new MenuItem( ƎɄɪɚɫɢɜɵɟƎ); // Ɉɛɴɟɤɬ ɞɥɹ ɤɨɦɚɧɞɵ ƎɅɢɫɚƎ: MenuItem fox=new MenuItem( ƎɅɢɫɚƎ); // Ɉɛɪɚɛɨɬɱɢɤ ɞɥɹ ɤɨɦɚɧɞɵ ƎɅɢɫɚƎ: Глава 8 444 fox.Click+=(x,y)=>{ set( ƎɅɢɫɚƎ,Ǝfox.jpgƎ); }; // Ɉɛɴɟɤɬ ɞɥɹ ɤɨɦɚɧɞɵ ƎȿɧɨɬƎ: MenuItem raccoon=new MenuItem( ƎȿɧɨɬƎ); // Ɉɛɪɚɛɨɬɱɢɤ ɞɥɹ ɤɨɦɚɧɞɵ ƎȿɧɨɬƎ: raccoon.Click+=(x,y)=>{ set( ƎȿɧɨɬƎ,Ǝraccoon.jpgƎ); }; // Ⱦɨɛɚɜɥɟɧɢɟ ɤɨɦɚɧɞ ɜ ɦɟɧɸ ƎɄɪɚɫɢɜɵɟƎ: beautiful.MenuItems.Add(fox); beautiful.MenuItems.Add(raccoon); // Ɉɛɴɟɤɬ ɞɥɹ ɩɭɧɤɬɚ ɦɟɧɸ ƎɋɢɥɶɧɵɟƎ: MenuItem strong=new MenuItem( ƎɋɢɥɶɧɵɟƎ); // Ɉɛɴɟɤɬ ɞɥɹ ɤɨɦɚɧɞɵ ƎɆɟɞɜɟɞɶƎ: MenuItem bear=new MenuItem( ƎɆɟɞɜɟɞɶƎ); // Ɉɛɪɚɛɨɬɱɢɤ ɞɥɹ ɤɨɦɚɧɞɵ ƎɆɟɞɜɟɞɶƎ: bear.Click+=(x,y)=>{ set( ƎɆɟɞɜɟɞɶƎ,Ǝbear.jpgƎ); }; // Ɉɛɴɟɤɬ ɞɥɹ ɤɨɦɚɧɞɵ ƎȼɨɥɤƎ: MenuItem wolf=new MenuItem( ƎȼɨɥɤƎ); // Ɉɛɪɚɛɨɬɱɢɤ ɞɥɹ ɤɨɦɚɧɞɵ ƎȼɨɥɤƎ: wolf.Click+=(x,y)=>{ set( ƎȼɨɥɤƎ,Ǝwolf.jpgƎ); }; // Ⱦɨɛɚɜɥɟɧɢɟ ɤɨɦɚɧɞ ɜ ɦɟɧɸ ƎɋɢɥɶɧɵɟƎ: strong.MenuItems.Add(wolf); strong.MenuItems.Add(bear); // Ⱦɨɛɚɜɥɟɧɢɟ ɩɭɧɤɬɨɜ ɜ ɝɥɚɜɧɨɟ ɦɟɧɸ: menu.MenuItems.Add(prog); menu.MenuItems.Add(beautiful); Приложения с графическим интерфейсом menu.MenuItems.Add(strong); // ɇɚɡɧɚɱɟɧɢɟ ɝɥɚɜɧɨɝɨ ɦɟɧɸ ɞɥɹ ɨɤɧɚ: this.Menu=menu; // Ɉɛɴɟɤɬ ɞɥɹ ɩɚɧɟɥɢ ɢɧɫɬɪɭɦɟɧɬɨɜ: ToolStrip ts=new ToolStrip(); // Ʉɧɨɩɤɢ ɞɥɹ ɩɚɧɟɥɢ ɢɧɫɬɪɭɦɟɧɬɨɜ: ToolStripButton tsbA=new ToolStripButton(Image.FromFile(path+ Ǝfox.jpgƎ)); ToolStripButton tsbB=new ToolStripButton(Image.FromFile(path+ Ǝraccoon.jpgƎ)); ToolStripButton tsbC=new ToolStripButton(Image.FromFile(path+ Ǝwolf.jpgƎ)); ToolStripButton tsbD=new ToolStripButton(Image.FromFile(path+ Ǝbear.jpgƎ)); // ȼɫɩɥɵɜɚɸɳɢɟ ɩɨɞɫɤɚɡɤɢ ɞɥɹ ɤɧɨɩɨɤ // ɧɚ ɩɚɧɟɥɢ ɢɧɫɬɪɭɦɟɧɬɨɜ: tsbA.ToolTipText= ƎɅɢɫɚƎ; tsbB.ToolTipText= ƎȿɧɨɬƎ; tsbC.ToolTipText= ƎȼɨɥɤƎ; tsbD.ToolTipText= ƎɆɟɞɜɟɞɶƎ; // Ɉɛɪɚɛɨɬɱɢɤɢ ɞɥɹ ɫɨɛɵɬɢɣ, ɫɜɹɡɚɧɧɵɯ ɫɨ ɳɟɥɱɤɨɦ // ɩɨ ɤɧɨɩɤɚɦ ɧɚ ɩɚɧɟɥɢ ɢɧɫɬɪɭɦɟɧɬɨɜ: tsbA.Click+=(x,y)=>fox.PerformClick(); tsbB.Click+=(x,y)=>raccoon.PerformClick(); tsbC.Click+=(x,y)=>wolf.PerformClick(); tsbD.Click+=(x,y)=>bear.PerformClick(); // Ⱦɨɛɚɜɥɟɧɢɟ ɤɧɨɩɨɤ ɧɚ ɩɚɧɟɥɶ ɢɧɫɬɪɭɦɟɧɬɨɜ: ts.Items.Add(tsbA); ts.Items.Add(tsbB); ts.Items.Add(tsbC); ts.Items.Add(tsbD); // Ⱦɨɛɚɜɥɟɧɢɟ ɩɚɧɟɥɢ ɢɧɫɬɪɭɦɟɧɬɨɜ ɜ ɨɤɧɨ: this.Controls.Add(ts); // Ɉɛɴɟɤɬ ɦɟɬɤɢ: pict=new Label(); // Ʉɨɨɪɞɢɧɚɬɵ ɢ ɪɚɡɦɟɪɵ ɦɟɬɤɢ: Глава 8 446 pict.SetBounds(35,25,154,104); // Ɋɚɦɤɚ ɞɥɹ ɦɟɬɤɢ: pict.BorderStyle=BorderStyle.FixedSingle; // Ⱦɨɛɚɜɥɟɧɢɟ ɦɟɬɤɢ ɜ ɨɤɧɨ: this.Controls.Add(pict); // Ɉɛɴɟɤɬ ɤɧɨɩɤɢ: btn=new Button(); // Ʉɨɨɪɞɢɧɚɬɵ ɤɧɨɩɤɢ: btn.Left=pict.Left+20; btn.Top=pict.Bottom+10; // Ɋɚɡɦɟɪɵ ɤɧɨɩɤɢ: btn.Width=pict.Width-40; btn.Height=30; // ɒɪɢɮɬ ɞɥɹ ɤɧɨɩɤɢ: btn.Font=new Font( ƎCourier NewƎ,12,FontStyle.Bold); // Ɉɛɪɚɛɨɬɤɚ ɫɨɛɵɬɢɹ, ɫɜɹɡɚɧɧɨɝɨ ɫɨ ɳɟɥɱɤɨɦ // ɩɨ ɤɧɨɩɤɟ ɜ ɨɤɧɟ: btn.Click+=OnButtonClick; // Ⱦɨɛɚɜɥɟɧɢɟ ɤɧɨɩɤɢ ɜ ɨɤɧɨ: this.Controls.Add(btn); // ɉɪɨɝɪɚɦɦɧɵɣ ɳɟɥɱɨɤ ɧɚ ɤɨɦɚɧɞɟ ƎȼɨɥɤƎ: wolf.PerformClick(); } // Ɂɚɤɪɵɬɵɣ ɦɟɬɨɞ (ɜɵɡɵɜɚɟɬɫɹ ɩɪɢ ɳɟɥɱɤɟ // ɧɚ ɤɨɦɚɧɞɟ ɢɡ ɦɟɧɸ): private void set(string name,string file){ // ɇɚɡɜɚɧɢɟ ɞɥɹ ɤɧɨɩɤɢ: btn.Text=name; // ɂɡɨɛɪɚɠɟɧɢɟ ɞɥɹ ɦɟɬɤɢ: pict.Image=Image.FromFile(path+file); } // Ɂɚɤɪɵɬɵɣ ɦɟɬɨɞ (ɜɵɡɵɜɚɟɬɫɹ ɩɪɢ ɳɟɥɱɤɟ Приложения с графическим интерфейсом // ɩɨ ɤɧɨɩɤɟ ɜ ɨɤɧɟ): private void OnButtonClick(object obj,EventArgs ea){ Application.Exit(); } } // Ƚɥɚɜɧɵɣ ɤɥɚɫɫ: class MainMenuDemo{ [STAThread] // Ƚɥɚɜɧɵɣ ɦɟɬɨɞ: static void Main(){ // Ɉɬɨɛɪɚɠɟɧɢɟ ɨɤɧɚ: Application.Run(new MyForm()); Класс окна MyForm создается наследованием класса Form. В классе есть несколько закрытых полей. Текстовое поле path содержит полный путь к каталогу с файлами изображений. Поле pict является объектной ссылкой класса Label и предназначено для запоминания ссылки на объект метки с изображением. Также мы используем поле btn. Это ссылка на объект кнопки (создается на основе класса В конструкторе класса MyForm() задаются размеры окна (команда this.Size=new Size(240,230)), его начальное положение команда, заголовок окна (команда this.Text= Ǝȼ ɦɢɪɟ ɠɢɜɨɬɧɵɯƎ). Также мы используем окно постоянных размеров без пиктограммы максимиза- ции окна (команды this.FormBorderStyle=FormBorderStyle. FixedSingle и Объект для главного меню menu создается командой MainMenu menu= new MainMenu() на основе класса MainMenu. В главное меню будут добавляться пункты, и для каждого из них нужно создать объект. Объекты для пунктов меню создаются на основе класса MenuItem. Название для пункта меню указывается в качестве аргумента конструктора. Соответственно, объекты для пунктов главного меню создаются командами MenuItem prog=new MenuItem( Ǝɉɪɨ- ɝɪɚɦɦɚƎ), MenuItem beautiful=new MenuItem(ƎɄɪɚɫɢɜɵɟƎ) Глава и MenuItem strong=new MenuItem( ƎɋɢɥɶɧɵɟƎ). Для добавления пунктов в главное меню используется метод Add(). Метод вызывается из свойства MenuItems объекта главного меню. Аргументом методу передается ссылка на объект пункта меню. Речь идет о командах menu.MenuItems.Add(prog) , menu.MenuItems.Add(beautiful) и menu.MenuItems.Add(strong). Правда здесь есть еще один момент. Мы создали объект menu, который может быть главным меню. Но этого мало. Нужно зарегистрировать данный объект как главное меню окна. Для этого свойству Menu объекта окна в качестве значения присваивается ссылка на объект menu (команда В пункты главного меню добавляются команды. Для добавления команды в пункт меню можно из его свойства MenuItems (ссылка на коллекцию элементов из пункта меню) вызывать метод Add(). Аргументами методу передают название команды и название метода, который будет вызываться при выборе команды. Так мы поступаем, когда инструкцией) в пункт меню Программа добавляем команду Выход. В итоге в пункте меню Программа появляется команда Выход, при выборе которой будет вызываться метод OnButtonClick() (закрытый метод класса MyForm). В теле метода всего одна команда Application.Exit(), которой завершается работа приложения. Добавлять команду в пункт меню можно другим способом. В этом случае на основе класса MenuItem создается объект команды. Так происходит при выполнении инструкций MenuItem fox=new MenuItem( ƎɅɢ- ɫɚƎ), MenuItem raccoon=new MenuItem(ƎȿɧɨɬƎ), MenuItem bear= new MenuItem( ƎɆɟɞɜɟɞɶƎ) и MenuItem wolf=new MenuItem(ƎȼɨɥɤƎ). Для добавления команд в пункты меню используется уже знакомый нам метод Add(), который вызывается из объекта пункта меню, а аргументом методу передается ссылка на объект команды. Примером являются инструкции beautiful.MenuItems.Add(fox), beautiful. MenuItems.Add(raccoon) , strong.MenuItems.Add(wolf) и Для определения обработчиков для команд, добавленных в пункты меню Красивые и Сильные, используются лямбда-выражения. Ссылка на анонимный метод, определенный с помощью лямбда-выражения, добавляется в список обработчиков события Click объекта команды меню. В теле анонимного метода вызывается закрытый метод set(). Метод set() получает два аргумента текстовое значение name с названием для Приложения с графическим интерфейсом |