Как из консольного приложения сделать оконное c
Все программы условно можно подразделить на две категории: консольные и оконные.
Консольные программы — это наследие старых операционных систем типа MS DOS, работавших в текстовом режиме. Полной аналогии здесь нет, но создатели систем разработки пытаются сделать всё, чтобы было максимальное сходство. Для консольной программы операционная система или система разработки предоставляет специальное окно (обычно — черного цвета), в котором виден ход выполнения программы.
Оконное приложение всегда имеет своё собственное окно (обычно его называют главным окном приложения). Кроме главного окна в приложении могут использоваться множество других окон.
При разработке оконного приложения используются различные элементы управления: командные кнопки, окна ввода, надписи, меню и т.д.
Порядок создания оконного приложения
Создание оконного приложения начинается с создания проекта соответствующего типа. Порядок работы следующий:
Запускаем SharpDevelop, в Стартовой странице ( Start Page ) выбираем New solution ( Новое решение ). Если Стартовая страница закрыта, то выбираем пункт меню File/New/Solution.
В открывшемся окне диалога New Project ( Новый проект ) выбираем тип шаблона Windows Application ( Оконное приложение ), задаём имя проекта ( Name ), например: Primer_Windows1 , каталог ( Location ), в котором будет хранится программа и все необходимые для её работы файлы — пусть это C:\stud\2202 .
Нажимаем кнопку Create ( Создать ). Всё. Минимальное оконное приложение создано.
Что из себя представляет минимальное оконное приложение? В отличие от минимального консольного приложения оконное состоит уже из двух классов:
в файле Program.cs содержится текст класса Program , а в нём один единственный метод Main() ;
в файлах MainForm.cs и MainForm.Designer.cs находится текст класса MainForm , наследующий от класса Form . Это класс главного окна приложения.
Информация о классе главного окна программы MainForm , как сказано выше, хранится в двух файлах:
в файл MainForm.cs программист сам вносит тот код, который необходим для выполнения решаемой задачи;
файл MainForm.Designer.cs находится в безраздельном распоряжении специальной программы — Дизайнера кода . Текст этого файла лучше не открывать, чтобы ничего не испортить из того, что создал Дизайнер.
Когда в окне редактора открыт файл MainForm.cs , то в нижней части этого окна есть две вкладки:
Source — нажатие на эту вкладку открывает текст файла MainForm.cs , в котором можно набирать необходимый код программы;
Design — нажатие на эту вкладку открывает графическое представление главного окна: так называемую форму. На форме можно размещать различные элементы управления.
Рис.1. Открыта вкладка Source
Рис.2. Открыта вкладка Design
Когда открыта вкладка Design , то становится доступно окно Tools (на рис. 2 оно расположено слева) — это окно с панелями инструментов, т.е. готовых элементов управления, которые можно размещать на форме.
Также станет доступно окно Properties ( Свойства ). В этом окне в выпадающем списке вверху можно выбирать тот объект на форме, который нужен, и изменять его свойства на этапе проектирования внешнего вида программы.
Порядок разработки оконного приложения
Разработка оконного приложения состоит из двух основных этапов:
проектирование внешнего вида приложения;
Рассмотрим оба этапа на простом примере.
Пример 1 . Даны основание a и высота h треугольника. Вычислить его площадь s .
Задача сводится к вводу исходных данных ( a и h ), вычислению площади и выводу полученного результата.
Вначале на форме разместим два объекта типа TextBox , предназначенные для ввода данных ( TextBox – простой текстовый редактор, используется для ввода или вывода данных). Объекты по-умолчанию получат имена textBox1 и textBox2 . Первый будем использовать для ввода a , второй — для ввода h .
Слева от текстовых редакторов расположим два объекта типа Label ( Label — надпись, используется для вывода каких либо поясняющих текстов). Их имена будут label1 и label2 . В свойствах Text этих объектов (находим их в окне Properties ) напишем строки « a= » и « h= », чтобы было понятно, что будет вводится в текстовых редакторах.
Ниже расположим ещё один объект типа Label ( label3 ), напишем в его свойстве Text строку « s=? ». Этот объект будем использовать для вывода результатов вычисления, т.е. площади треугольника.
Ещё ниже разместим две кнопки — объекты типа Button . Они получат имена button1 и button 2 . В свойстве Text для этих кнопок напишем строки « Вычислить » и « Выход ». Основное назначение объектов этого типа — выполнение каких-либо действий по щелчку. Т.е. пользователь программы щёлкает мышью по кнопке, и программа в ответ выполняет какое-то действие. Но чтобы это произошло, необходимо написать обработчики событий. Так в нашем случае первая кнопка предназначена для вычисления площади, а вторая — для завершения работы программы.
В свойстве Text самой формы ( MainForm ) напишем что-нибудь соответствующее решаемой задачи, например: « Площадь ».
Всё, этап проектирования внешнего вида программы закончен. Вот так будет выглядеть наша форма:
Рис. 3. Форма
Если сейчас запустить программу на исполнение, то можно будет вводит данные в поля ввода, щёлкать по кнопкам, но программа ни на что не будет реагировать.
Приступаем ко второй части разработки программы — написанию обработчиков событий.
Обработчик событий — это метод особого вида со стандартным перечнем параметров. Используется для реакции программы на те или иные действия пользователя. Обработчик не вызывается непосредственно в тексте программы. Он вызывается средой выполнения. Каждый обработчик связан с каким-либо объектом.
Создать обработчики событий для наших кнопок очень просто. Если открыта вкладка Design , то выполните двойной щелчок мышью по каждой из кнопок. Сразу же после двойного щелчка мыши по первой кнопке (« Вычислить ») открывается вкладка Source и в ней можно увидеть добавленный Дизайнером код заготовки метода Button1Click() . Снова перейдите во вкладку Design и выполните двойной щелчок по второй кнопке (« Выход »). Дизайнер добавит ещё один обработчик — метод Button2Click() .
Внутри полученных таким способом заготовок методов (обработчиков событий) напишем необходимый код. Вот текст файла MainForm (для краткости убраны все комментарии, которые были добавлены системой разработки):
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.
Закрыт 5 лет назад .
Хотелось бы перейти из консольных приложений на оконные, но сколько ни смотрю на эти api функции, у меня одни квадратные глаза. Я вообще не могу втянуть, что делать с этой функцией, куда ее вписать, хотя когда писал для консоли, с функциями проблем не было. Может поможете, кто чем может: сайтом, справочником, или так можно объяснить. В общем спасибо сразу. )
Попробуйте Qt, это не winapi, возможно вам подойдет
1,065 1 1 золотой знак 10 10 серебряных знаков 21 21 бронзовый знакЕсли на C++ если кроссплатформенные фреймворки: посмотрите на Qt, wxWidget (я как раз сейчас немного изучаю этот фреймворк), GTK+.
361 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков 2,009 5 5 золотых знаков 25 25 серебряных знаков 41 41 бронзовый знак Может хватит уже советовать WinForms?:) Есть же WPF, который пропагандирует намного более "правильный" подход к построению гуя. WinForms же фактически является оберткой над WinAPI WinForms просто значительно проще WPF. Для обучения пойдет. Хотя лучше сразу учиться правильным вещам. WinForms значительно хуже WPF в том, что (1) на нём тяжело писать приложения с нормальной архитектурой, (2) в нём много специфических для WinAPI-программирования деталей, учить которые нормальному программисту нафиг не упало, особенно в свете уже пришедшего к нам WinRT. Лучше начинать сразу с концептуально чистого WPF. Или сразу смотреть в сторону WinRT, несмотря на всё то, чем его поливают, API довольно чист и красив, нет тяжелого наследия и костылей обратной совместимости, как в WPF или WinAPIНедавно наткнулся на эту страничку, все описано довольно доступным языком: Основы программирования для Win32 API
37.9k 10 10 золотых знаков 43 43 серебряных знака 79 79 бронзовых знаковПопробуйте библиотеки: Qt или GTK+
WinAPI это конечно мощный и быстрый инструмент, но не кроссплатформенный, да и скорость разработки на нем оставляет желать лучшего.
Если речь о WinAPI, то по своему опыту, могу сказать - функции и правда по началу кажутся очень страшнми, но все начинается, как ни странно с классов и велосипедов, о которых ни кто не говорит, ибо стесняются, но все поголовно пишут. ))
И по-моему, тут нет ничего удивительного - в WinAPI есть сразу много чего, а для решения основных задач достаточно только некоторой доли от этого всего, поэтому можно увидеть как в нескольких различных классах-обертках используются одни и те же API-функции.
Некоторые пишут подсматривая в готовые фреймворки, типа MFC, WTL, я подсматривал тогда в Delphi.
Для облегчения жизни, советую брать курс на интегрированную работу с каким-нибудь готовым набором примитивов, типа STL и в обязательном порядке научиться работать в MSDN
Изучив это руководство, вы:
- Добавите второй проект.
- Ссылка на библиотеки и добавление пакетов
- Выполните дополнительную отладку.
- Проверите готовый код.
Предварительные условия
Для работы с этой статьей можно использовать любое из следующих приложений калькулятора.
Добавление еще одного проекта
Реальный код связан с проектами, которые объединены в решение. Вы можете добавить проект библиотеки классов в приложение калькулятора, предоставляющее некоторые функции калькулятора.
В Visual Studio выберите Файл > Добавить > Новый проект, чтобы добавить новый проект. В Обозревателе решений щелкните решение правой кнопкой мыши, чтобы добавить проект из контекстного меню.
В Обозревателе решений щелкните узел решения правой кнопкой мыши и выберите пункты Добавить > Новый проект.
В диалоговом окне Настройка нового проекта введите имя проекта CalculatorLibrary и нажмите кнопку Далее.
Переименуйте файл Class1.cs в CalculatorLibrary.cs. Чтобы переименовать файл, щелкните правой кнопкой мыши имя в Обозревателе решений и выберите команду Переименовать, затем выберите имя и нажмите клавишу F2 либо выберите имя и щелкните еще раз, чтобы ввести его.
Теперь необходимо добавить ссылку на проект, чтобы первый проект мог использовать API, предоставляемые новой библиотекой классов. Правой кнопкой мыши щелкните узел Зависимости в проекте Калькулятор и выберите Добавить ссылку на проект.
Откроется диалоговое окно Диспетчер ссылок. Это диалоговое окно позволяет добавлять ссылки на другие проекты, а также сборки и библиотеки DLL COM, необходимые вашим проектам.
В диалоговом окне Диспетчер ссылок установите флажок для проекта CalculatorLibrary и выберите OK.
Ссылка на проект отображается в узле Проекты в обозревателе решений.
В файле Program.cs выберите класс Calculator и весь его код и нажмите CTRL+X, чтобы вырезать его. Затем в CalculatorLibrary.cs вставьте код в пространство имен CalculatorLibrary .
Добавьте public до класса калькулятора, чтобы предоставить его за пределами библиотеки.
Теперь код в CalculatorLibrary.cs должен выглядеть следующим образом.
Или попробуйте добавить директиву using в начало файла.
Добавление директивы using позволяет удалить пространство имен CalculatorLibrary из места вызова, но это приводит к неоднозначности. Является ли Calculator классом в CalculatorLibrary или Calculator — это пространство имен?
Чтобы устранить неоднозначность, измените имя пространства имен Calculator на CalculatorProgram в файле Program.cs.
В Обозревателе решений щелкните узел решения правой кнопкой мыши и выберите пункты Добавить > Новый проект.
В диалоговом окне Настройка нового проекта введите имя проекта CalculatorLibrary и нажмите кнопку Далее.
Visual Studio создаст новый проект и добавит его в решение.
Переименуйте файл Class1.cs в CalculatorLibrary.cs. Чтобы переименовать файл, щелкните правой кнопкой мыши имя в Обозревателе решений и выберите команду Переименовать, затем выберите имя и нажмите клавишу F2 либо выберите имя и щелкните еще раз, чтобы ввести его.
Теперь необходимо добавить ссылку на проект, чтобы первый проект мог использовать API, предоставляемые новой библиотекой классов. Правой кнопкой мыши щелкните узел Зависимости в проекте Калькулятор и выберите Добавить ссылку на проект.
Откроется диалоговое окно Диспетчер ссылок. Это диалоговое окно позволяет добавлять ссылки на другие проекты, а также сборки и библиотеки DLL COM, необходимые вашим проектам.
В диалоговом окне Диспетчер ссылок установите флажок для проекта CalculatorLibrary и выберите OK.
Ссылка на проект отображается в узле Проекты в обозревателе решений.
В файле Program.cs выберите класс Calculator и весь его код и нажмите CTRL+X, чтобы вырезать его. Затем в CalculatorLibrary.cs вставьте код в пространство имен CalculatorLibrary .
Добавьте public до класса калькулятора, чтобы предоставить его за пределами библиотеки.
Теперь код в CalculatorLibrary.cs должен выглядеть следующим образом.
Или попробуйте добавить директиву using в начало файла.
Добавление директивы using позволяет удалить пространство имен CalculatorLibrary из места вызова, но это приводит к неоднозначности. Является ли Calculator классом в CalculatorLibrary или Calculator — это пространство имен?
Чтобы устранить неоднозначность, переименуйте пространство имен из Calculator в CalculatorProgram в Program.cs и в CalculatorLibrary.cs.
Начните с добавления директив using в начало файла CalculatorLibrary.cs.
Это использование класса Trace должно подразумевать ссылку на класс, который он связывает с файловым потоком. Это требование означает, что калькулятор будет работать лучше в качестве объекта, поэтому добавьте конструктор в начало класса Calculator в CalculatorLibrary.cs.
Также удалите ключевое слово static , чтобы изменить статический метод DoOperation на метод-член.
Добавьте выходные данные журнала для каждого вычисления. DoOperation будет иметь следующий вид.
Также измените место вызова DoOperation , чтобы оно ссылалось на объект с именем calculator в нижнем регистре. Теперь код является вызовом члена, а не вызовом статического метода.
Снова запустите приложение. Когда все будет готово, щелкните правой кнопкой мыши узел проекта Калькулятор и выберите Открыть папку в проводнике.
В проводнике перейдите в папку выходных данных в разделе bin/Debug/ и откройте файл calculator.log. Результат должен выглядеть следующим образом.
Сейчас файл CalculatorLibrary.cs должен выглядеть следующим образом.
Файл Program.cs должен выглядеть как следующий фрагмент кода.
Добавление пакета NuGet: запись в JSON-файл
В Обозревателе решений щелкните правой кнопкой мыши узел Зависимости для проекта CalculatorLibrary и выберите Управление пакетами NuGet.
Откроется диспетчер пакетов NuGet.
Найдите и выберите пакет Newtonsoft.Json и нажмите кнопку Установить.
Visual Studio скачивает пакет и добавляет его в проект. Новая запись отображается в узле "Ссылки" в Обозревателе решений.
Если появится запрос на принятие изменений, нажмите кнопку OK.
Visual Studio скачивает пакет и добавляет его в проект. Новая запись отображается в узле Пакеты в Обозревателе решений.
Добавьте директиву using для Newtonsoft.Json в начало файла CalculatorLibrary.cs.
Создайте объект члена JsonWriter и замените конструктор Calculator следующим кодом.
Измените метод DoOperation , чтобы добавить код JSON writer .
Добавьте метод для завершения синтаксиса JSON после ввода пользователем всех данных для операции.
В конце файла Program.cs перед return; добавьте вызов к Finish .
Выполните сборку приложения и запустите его. Попробуйте выполнить несколько операций и закройте приложение, используя команду n.
Откройте файл calculatorlog.json в проводнике. Выходные данные должны быть примерно следующими.
Отладка. Установка точки останова и попадание в нее
Отладчик Visual Studio — очень эффективное средство. Отладчик может пошагово пройти код, чтобы найти точку, в которой есть ошибка программирования. Затем можно понять, какие исправления необходимо внести, и внести временные изменения, чтобы можно было продолжить работу приложения.
В файле Program.cs щелкните поле слева от следующей строки кода. Можно также выбрать строку и нажать клавишу F9 или щелкнуть правой кнопкой мыши и выбрать Точка останова > Вставить точку останова.
Красная точка указывает на точку останова. Для приостановки приложения и проверки кода можно использовать точки останова. Вы можете установить точку останова в любой исполняемой строке кода.
Выполните сборку и запуск приложения. Введите следующие значения для вычисления.
- Для первого числа введите 8.
- Для второго числа введите 0.
- Давайте поэкспериментируем с оператором. Введите d.
Приложение приостанавливается в созданной точке останова, которая обозначается желтым указателем слева и выделенным кодом. Выделенный код еще не выполнен.
Теперь, когда приложение приостановлено, вы можете проверить его состояние.
Отладка. Просмотр переменных
В выделенном коде наведите указатель мыши на переменные, такие как cleanNum1 и op . Текущие значения этих переменных, 8 и d соответственно, отображаются в подсказках по данным.
При отладке очень важно выполнить проверку переменных на соответствующие значения для устранения проблем.
В нижней области просмотрите окно Локальные. Если оно закрыто, выберите Отладка > Окна > Локальные, чтобы открыть его.
В окне Локальные отображаются все переменные, находящиеся в области, а также их значения и типы.
Взгляните на окно Видимые.
Окно "Видимые" аналогично окну Локальные, но отображает переменную непосредственно перед текущей строкой кода и после строки, в которой приостановлено приложение.
Далее можно поочередно выполнить код в отладчике по одной инструкции за раз. Это называется пошаговым выполнением.
Отладка. Пошаговое прохождение кода
Нажмите клавишу F11 или выберите Отладка > Выполнять по шагам.
С помощью команды "Выполнять по шагам" приложение выполняет текущий оператор и переходит к следующему исполняемому оператору. Как правило, это следующая строка кода. Желтый указатель слева всегда указывает на текущий оператор.
Вы только что выполнили по шагам метод DoOperation в классе Calculator .
Чтобы получить иерархический обзор выполнения программы, просмотрите окно Стек вызовов. Если оно закрыто, выберите Отладка > Окна > Стек вызовов, чтобы открыть его.
В этом представлении показан текущий метод Calculator.DoOperation , обозначенный желтым указателем. Во второй строке показана функция, которая вызвала метод из метода Main в Program.cs.
В окне Стек вызовов показан порядок вызова методов и функций. Это окно предоставляет доступ ко многим функциям отладчика, таким как Перейти к исходному коду, из контекстного меню.
Нажмите клавишу F10 или выберите Отладка > Шаг с обходом несколько раз, пока приложение не остановится в операторе switch .
Команда "Шаг с обходом" аналогична команде "Выполнять по шагам", за исключением того, что если текущий оператор вызывает функцию, то отладчик выполняет код в вызываемой функции и не приостанавливает выполнение до возврата функции. Команда "Шаг с обходом" выполняется быстрее, чем "Выполнять по шагам", если вас не интересует определенная функция.
Нажмите клавишу F10 еще раз, чтобы приложение приостанавливалось на следующей строке кода.
Этот код проверяет деление на нуль. Если приложение продолжит работать, оно вызовет общее исключение (ошибку), но вы можете выполнить другое действие, например просмотреть фактическое возвращаемое значение в консоли. Один из вариантов — использовать функцию отладчика Изменить и продолжить, чтобы внести изменения в код и продолжить отладку. Тем не менее мы покажем другой метод для временного изменения потока выполнения.
Отладка. Тестирование временного изменения
Выберите желтый указатель, который в данный момент приостановлен на операторе if (num2 != 0) , и перетащите его в следующий оператор.
Если перевести указатель сюда, приложение полностью пропускает оператор if , чтобы вы могли увидеть, что происходит при делении на ноль.
Нажмите клавишу F10, чтобы выполнить строку кода.
Нажмите клавишу F5 или выберите Отладка > Продолжить отладку.
Символ бесконечности отображается в консоли как результат математической операции.
Закройте приложение должным образом с помощью команды n.
Полный код
Ниже приведен полный код для файла CalculatorLibrary.cs после выполнения всех шагов.
А вот код для файла Program.cs:
Следующие шаги
Поздравляем с завершением этого учебника! Для получения дополнительных сведений изучите следующие ресурсы.
- Окно Toolbox (Панель элементов управления) - элементы управления вы можете разместить на создаваемой форме.
- Окно Solution Explorer (Обозреватель решений) - здесь вы сможете увидеть следующие узлы: Properties - настройки проекта, Links (Ссылки) - подключенные к проекту библиотеки, а также созданные и подключенные к проекту файлы исходных кодов (с расширением .cs) и подключенные к проекту формы (например, Form1).
- Окно Class View (Окно классов) - здесь представлены все созданные в программе классы.
- Окно Properties (Свойства) - выбрав любой элемент управления или даже форму, вы сможете увидеть все параметры данного объекта, а также изменить значения, установленные в них по умолчанию.
Создание оконных приложений сводится к созданию всех необходимых диалоговых окон, а также к размещению на них необходимых элементов. В дальнейшем мы настраиваем обработку событий, создаваемых пользователем, и настраиваем технические аспекты работы программы. В нашем случае сначала разместим все необходимые элементы управления на главной форме, после чего добавим обработчик события перемещения мыши и обработку нажатия кнопок.
Добавление новых элементов управления на форму
Итак, после того как вы ввели имя проекта, установили необходимый шаблон и нажали кнопку ОК, MS Visual Studio автоматически создаст каркас оконного приложения, после чего мы сможем добавить на него новые оконные элементы.
Для этого необходимо перетащить необходимый оконный элемент из окна инструментов (ToolBox).
Нашему окну потребуется 2 элемента поля для ввода, в которые мы будем выводить координаты указателя мыши, что облегчит нам понимание работы программы.
В центре окна будет находиться надпись, которую мы создадим с помощью элемента Label.
Снизу будут расположены 2 кнопки.
Перейдите в свойства строки Label1, где измените текст на «Вы стремитесь сделать мир лучше?». Также измените тип шрифта, для этого найдите свойство Font (рис. 5).
Рисунок 5. Свойство Font элемента Label.
После чего установите тип шрифта Tahoma, ширину шрифта Bold и размер равный 16 (рис. 6).
Рисунок 6. Установки шрифта.
Далее измените текст на кнопках, используя свойство Text.
Техническая часть работы программы
- Сначала мы добавим обработчик события перемещения мыши и реализуем вывод ее координат x и y в два созданных поля ввода.
- Далее мы создадим функции обработчики щелчка по каждой из клавиш мыши (особенно усердные пользователи все же смогут попасть по кнопке «Да, конечно!»).
- Далее мы добавим код, реализующий случайное перемещение окна в том случае, если курсор приблизиться к кнопке «Да, конечно!».
Определение перемещения указателя мыши по форме
Щелкните непосредственно на части формы создаваемого приложения (НЕ на одном из элементов).
Теперь перейдите к свойствам формы с помощью щелчка правой кнопки мыши -> контекстное меню свойства.
Данная функция, обрабатывающая событие перемещения указателя мыши над формой, получает 2 параметра: объект отправитель и экземпляр класса MouseEventsArgs, содержащий информацию о координатах указателя мыши и других текущих свойствах.
textBox1 и textBox2 это экземпляры класса textbox, реализующие управление нашими элементами поля для ввода.
Член данных экземпляров Text позволяет установить текст в данных полях.
Таким образом, если теперь откомпилировать программу (F5), при перемещении указателя мыши по форме окна мы будем видеть координаты указателя (внутри формы), которые будут непрерывно изменяться.
Добавьте следующие строки кода:
Теперь снова вернитесь к конструктору и добавьте вторую кнопку, также с помощью двойного щелчка по ней.
Она будет содержать следующий код:
Теперь нам осталось только реализовать перемещение окна в тот момент, когда мышь приближается к кнопке «Да, конечно».
Для этого мы добавим код в функцию:
private void Form1_MouseMove(object sender, MouseEventArgs)
Принцип очень прост: получая координаты движения мыши, мы проверяем не входят ли они в квадрат, очерчивающий нашу кнопку с небольшим запасом. Если да, то мы генерируем 2 случайных числа, которые будут использованы для перемещения окна.
Также нам понадобится объявить несколько "рабочих" переменных, которые мы будем в дальнейшем использовать.
Генерация случайных чисел
Random rnd = new Random();
Здесь мы объявили экземпляр класса Random (rnd), с помощью которого мы будем генерировать случайные числа. В дальнейшем мы будем использовать код, вида rnd.Next (диапазон_генерации) или rnd.Next (от, до -1) для генерации случайного числа.
Также мы объявим еще несколько переменных, часть из которых сразу будет инициализирована.
tmp_location объявляется для того, чтобы в будущем временно хранить текущее положение окна.
Также нам следует подумать о том, что при случайном перемещении, наше окно может выйти далеко за пределы экрана.
_h и _w будут хранить в себе размеры экрана пользователя, которые определяются при их инициализации.
Теперь код этой функции будет выглядеть следующим образом:
Вот, собственно, и все. Откомпеллировав приложение, можете попробовать нажать на кнопку "Да, конечно". Это будет крайне трудно.
Читайте также: