Cоздать программу самому? Это очень просто! Не верите? Давайте сделаем небольшую программу, которая станет вашей отправной точкой в мир программирования.
Многие из нас постоянно работают с программами, сложными и попроще, но многие не задумываются, а что-же на самом деле есть программа. Если описать коротко, то программа — это набор инструкций, которые отдаются компьютеру в соответствии с логикой, которую в программу заложил программист.
Не буду рассуждать на тему зачем может потребоваться писать самостоятельно программу, у каждого свои причины. Оговорюсь сразу, что в данной статье будет использоваться язык программирования C# и среда разработки Microsoft Visual Studio, у которой имеется бесплатная редакция, возможностей которой хватит «за глаза» любому.
Писать программу ради написания программы является не совсем хорошей идеей. Целью написания программы должно быть решение определенной задачи, с которой написанная программа должна помочь вам справиться.
Из выше сказанного, написание программы можно разделить на следующие этапы:
- Определение цели, какую задачу ваша программа помочь вам решить
- Разработка алгоритма работы программы.
- Дизайн пользовательского интерфейса.
-
Написание логики программы. На этом этапе вдыхается жизнь в вашу програму. Это и есть наиболее важный этап создания программы, для успешной реализации которого понадобится много знаний и умений.
Где взять знания и умения? Книги, профильные сайты, курсы. Сейчас в интернете можно найти бесчисленное множество обучающих материалов, посвященных данной теме.
Отдельно хочется упомянуть ресурсы для освоения C#:- бесплатную книгу Fundamentals of Computer Programming with C#
- сайт METANIT.COM
- Документация по C# на сайте Microsoft
Так как большинство из нас не гениальные мальчики и девочки, родившиеся с клавиатурой в руках и не впитали языки программирования с молоком матери, нам понадобится текстовый редактор более функциональный и наглядный чем блокнот.
Да, в блокноте вполне реально создать программу, но на это у вас уйдет гораздо больше времени и такими «извращениями» могут заниматься реально крутые программисты. Для остальных-же Microsoft Visual Studio — это именно тот инструмент, который будет помогать создавать новые и управлять существующими проэктами.
Из ключевых возможностей Visual Studio хочется отметить:
- Разработка для популярных платформ Windows, Linux, MacOS
- Веб разработка: ASP.NET, Node.js, Python, JavaScript, and TypeScript
- Популярные языки программирования: C#, C++, Visual Basic, Python, JavaScript
- Визуальное редактирование пользовательского интерфейса
- IntelliSense — интеректуальный помощник при написании кода
- Управление версиями. Интеграция с GitHub
- Совместная разработка
- Расширение возможностей путем установки дополнений.
Поэтому Microsoft Visual Studio — это именно то, с чего стоит начать свою карьеру программиста.
Примечание.
Ранее, когда Visual Studio не была бесплатной, как альтернативу можно было рассматривать SharpDevelop, бесплатную IDE с открытым исходным кодом, которая предоставляла функционал сходный с Visual Studio и в некоторых случаях его было достаточно для создания проэктов любой сложности. Но теперь, в виду стагнации процесса разработки SharpDevelop, и стремительного развития Visual Studio, альтернативы продукту от Microsoft просто нет.
Загрузите и установите последнюю версию, которая доступна для загрузки на сайте разработчика. С этим не должно возникнуть сложностей. После установки запустите среду разработки.
Давайте создадим программу — калькулятор. Почему-бы и нет? Изобретать велосипед — это-же так весело! А если серъезно, то ничего зазорного в этом нет, ведь клепают-же хелловорлды во всех учебниках и не стесняются. Мы в этом плане даже чем-то лучше.
Как уже оговаривалось выше, язык программирования будет использован C#,
- Нажимаем кнопку Create a new project.
-
Шаг Create new project:
-
Выбираем фильтр:
- Язык программирования: C#
- Платформа: Windows
- Тип проекта: Desktop
- Выбираем Windows Forms App (Net. Framework) — нажимаем Next
-
Выбираем фильтр:
-
Шаг Configure your project:
Название проэкта: CalculatorApp
Название решения: Calculator.
Framework: Оставляем по умолчанию, на данном этапе не важно какая версия Net. Framework - Нажимаем Create
Открылось главное окно Visual Studio,
Перетащите кнопку Button на форму главного окна, только что созданного проекта.
Эта кнопка не делает ничего связанного с вычислениями — при её нажатии будет закрываться программа. На примере этой кнопки вы увидите насколько просто наполнять окно программы необходимыми элементами пользовательского интерфейса.
Настройте только что добавленную кнопку в панели свойств:
- Свойство Text, меняем значение на Close
- Name меняем на bnClose
- Anchor: Bottom,Right
Добавьте обработчик события нажатия кнопки: делаем двойное нажатие на кнопке, программа автоматически создаст необходимый метод bnClose_Click. Внутри метода пишем: this.Close();
private void bnClose_Click(object sender, EventArgs e)
{
this.Close();
}
Запускаем программу:
При нажатии кнопки Close, окно программы закроется, в след за этим завершит работу и сама программа.
Примечание
За всеми проделанными выше действиями с созданием конпки и редактирования ее свойств, лежит создание кода программы средой разработки VisualStudio.
Откойте файл Form1.Designer.cs. Как видите, все те действия, что вы делали в настройках, отображены здесь в виде кода программы:
//
// bnClose
//
this.bnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnClose.Location = new System.Drawing.Point(750, 350);
this.bnClose.Name = "bnClose";
this.bnClose.Size = new System.Drawing.Size(75, 23);
this.bnClose.TabIndex = 0;
this.bnClose.Text = "Close";
this.bnClose.UseVisualStyleBackColor = true;
this.bnClose.Click += new System.EventHandler(this.bnClose_Click);
То-есть для среды разработки, элементы управления окна выглядят в виде кода, но для удобства, настройки графического интерфейса создаваемой программы в VisualStudio можно делать в наглядном визуальном представлении.
Примечание
Если вы поставили Visual Studio и хотите изменить язык интерфейса на другой язык, то это можно сделать в настройках программы Tools — Options — Internetional Settings. Если языка, который вам нужен нет в списке, доустановите его через Microsoft Visual Studio Installer. После этого опять откройте Tools — Options — Internetional Settings, и измените язык интерфейса.
Сделаем что-нибудь посложнее, чем просто вывод текста на экран
В большинстве учебников для начинающих программистов первая программа выводит простое сообщение «Hello world!». Мне кажется это немного тупо, так как для того, чтоб заинтересовать начинающего программиста, нужно показать нечто большее и полезное, нежели просто окно с текстом.
Для того чтоб оценить возможности языка программирования C# и .Net Framework, давайте в нашей программе реализуем возможность выполнения простейших арифметических операций. Мне кажется это будет гораздо полезней.
Итак, давайте создадим следующие элементы интерфейса программы
-
Четыре кнопки:
-
Сложение
- Text: «+»
- Name: bnPlus
-
Вычитание
- Text: «-«
- Name: bnMinus
-
Умножение
- Text: «*»
- Name: bnMult
-
Деление
- Text: «/»
- Name: bnDiv
-
Сложение
-
Три текстовых поля: два для выполнения арифметических операций и один для результата.
-
Оператор 1
- Name: tbOperand1
-
Оператор 2
- Name: tbOperand2
-
Результат
- Name: tbResult
-
Оператор 1
-
Надписи (Labels) для них имя не важно, так как к ним мы обращаться не будем, но лучше имя все-таки дать:
- Name: lblOperand1
- Name: lblOperand2
- Кнопка закрытия окна осталась из примера, рассмотренного ранее
Примечание: Очень удобно использовать копирование элементов пользовательского интерфейса. Для того, чтоб это сделать, нужно выделить элементы, которые нужно скопировать и при нажатой кнопке Ctrl, потянуть мышью выделенные элементы в сторону.
Как видите, добавлять элементы интерфейса программы весьма просто — перетягиваем их из панели инструментов (или создаем копии уже существующих) в то место окна, где должен находиться элемент, изменяем размер, свойства и положение.
Попробуйте закончить настройку внешнего вида программы, чтоб она стала выглядеть так:
Высота текстового поля tbResult регулируется за счет изменения размера шрифта.
Обратите внимание, что имя элементов назначаются автоматически и, если не давать им осмысленные имена, и при достаточно большом их количестве, очень легко потеряться в хаосе, состоящем из элементов с названиями button1, button2, button3, textBox1, textBox2, textBox3 и так далее. Сразу после создания элементов, не ленитесь, давайте им осмысленые имена — дальше, при создании обработчиков событий, имена методов будут генерироваться автоматически на основании имени элемента управления. Думаю никто не сомневается в том, что имя метода ButtonAdd_Click() гораздо более осмысленно, чем Button1Click()
Назначим обработчики событий нажатия кнопок
Выбираем по очереди каждую кнопку.Даблкликом создаем обработчик нажатия кнопки(Click). Если нужно добавить обработчик другого события, или выбрать уже существующий метод — следует открыть вкладку События (значок в виде молнии) и там уже выбрать необходимое событие.
Пишем код обработчика
private void bnAdd_Click(object sender, EventArgs e)
{
tbResult.Text = (float.Parse(tbOperand1.Text) + float.Parse(tbOperand2.Text)).ToString();
}
private void bnSubstr_Click(object sender, EventArgs e)
{
tbResult.Text = (float.Parse(tbOperand1.Text) - float.Parse(tbOperand2.Text)).ToString();
}
private void bnMultiply_Click(object sender, EventArgs e)
{
tbResult.Text = (float.Parse(tbOperand1.Text) * float.Parse(tbOperand2.Text)).ToString();
}
private void bnDivide_Click(object sender, EventArgs e)
{
tbResult.Text = (float.Parse(tbOperand1.Text) / float.Parse(tbOperand2.Text)).ToString();
}
Как видите, все методы-обработчики отличаются только одним символом. Это не есть красиво, но наведением порядка в коде мы займемся немножко позже. Сейчас для наглядности путь обработчики событий нажатия кнопки остаются как есть.
Давайте на примере операции сложения разберем как работает наша программа.
tbResult.Text = (float.Parse(tbOperand1.Text) + float.Parse(tbOperand2.Text)).ToString();
Из курса школьной программы математики мы знаем, что действия, заключенные в скобки выполняются в первую очередь. В программировании то-же самое:
- float.Parse(tbOperand1.Text) — Извлекается значение свойства Text переменной tbOperand1 и передается в качестве параметра статичскому методу Parse() типа System.Single результат записывается в промежуточную переменную A
- float.Parse(tbOperand2.Text) — то-же самое, результат записывается в промежуточную переменную B
- Производится сложение промежуточных переменных (A + B) в промежуточную переменную C
- C.ToString() — Преобразовуется переменная C в строку. Так как любая переменная в C# это объект, то путем обращения к методу ToString() этого объекта мы можем получить его строковое представление.
Более сложные типы, такие как DateTime, могут иметь несколько мeтодов ToString().
Проверяем работу программы
Нажмите кнопку Пуск на панели инструментов, или нажмите клавишу F5
Программа работает и делает то, что от нее требовалось:
Обратите внимание, что я пока не реализовал проверку вводимого значения в текстовое поле. Если ввести в него некорректное значение — программа выдаст сообщение об ошибке, в которой сообщается, что вы пытаетесь преобразовать в числовое значение неправильную строку:
Давайте теперь перепишем программу, чтоб она могла выводить предупреждение, в случае, если было введено некорректное значение одного из операторов. Скопируйте следующий метод к себе в файл Form1.cs, там где находятся остальные обработчики *_Click:
private void bnMathAction_Click(object sender, EventArgs e)
{
// эти переменные нужны для out параметров float.TryParse(string s, out v)
float A, B;
// Эта строковая переменная хранит имя кнопки,
// будет использована для определения того, какая кнопка нажата
string senderName = ((Button)sender).Name;
// if(bool && bool)
// оба метода должны вернуть истину
if (float.TryParse(tbOperand1.Text, out A) && float.TryParse(tbOperand2.Text, out B))
{
// Проверяем по имени какая кнопка нажата и в соответствии с выбором
// вызываем требуемую арифметическую операцию
switch (senderName)
{
case "bnAdd":
tbResult.Text = (A + B).ToString();
break;
case "bnSubstr":
tbResult.Text = (A - B).ToString();
break;
case "bnMultiply":
tbResult.Text = (A * B).ToString();
break;
case "bnDivide":
tbResult.Text = (A / B).ToString();
break;
}
}
else
{
MessageBox.Show("Неправильно введено значение оператора!");
}
}
Этот метод принимает параметр object sender, который используется для определения того, какая кнопка была нажата. Здесь использован основополагающий принцип ООП — Полиморфизм. Объект типа Button можно абстрагировать до типа object, но при этом информация, специфичная для типа Button никуда не пропала — для того, чтоб к ней обратиться, нужно sender привести к типу Button. Например:
Button btn = new Button(); // Объект типа Button
object obj = new object(); // Объект типа object
// Объект типа Button является наследником типа object, поэтому возможно неявное преобразование типа
object obj2 = btn;
object obj3 = new Button() { Name = "bnTest", Text = "Test"};
//obj3.Text = "Test 1"; // Ошибка. Нельзя напрямую обратиться к полю Text
((Button)obj3).Text = "Test 1"; // А вот так обратиться к полю Text вполне даже можно
// Тип object не может стать типом Button. Рожденный ползать летать не может
//Button btn2 = obj; // Ошибка.
//Button btn2 = (Button)obj; // Ошибка.
Теперь перейдите в конструктор формы (Shift + F7) и для каждой кнопки, в качестве обработчика события Click выберите метод bnMathAction_Click.
Если перейти к коду, то можно увидеть, что ссылок на этот метод стало четыре, а на остальные методы обработчики теперь никто не ссылается — ссылок ноль. Их можно спокойно удалить.
В итоге вы должны получить файл Form1.cs следующего вида:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CalculatorApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void bnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void bnMathAction_Click(object sender, EventArgs e)
{
// эти переменные нужны для out параметров float.TryParse(string s, out v)
float A, B;
// Эта строковая переменная хранит имя кнопки,
// будет использована для определения того, какая кнопка нажата
string senderName = ((Button)sender).Name;
// if(bool && bool)
// оба метода должны вернуть истину
if (float.TryParse(tbOperand1.Text, out A) && float.TryParse(tbOperand2.Text, out B))
{
// Проверяем по имени какая кнопка нажата и в соответствии с выбором
// вызываем требуемую арифметическую операцию
switch (senderName)
{
case "bnAdd":
tbResult.Text = (A + B).ToString();
break;
case "bnSubstr":
tbResult.Text = (A - B).ToString();
break;
case "bnMultiply":
tbResult.Text = (A * B).ToString();
break;
case "bnDivide":
tbResult.Text = (A / B).ToString();
break;
}
}
else
{
MessageBox.Show("Неправильно введено значение оператора!");
}
}
}
}
Код проекта доступен на GitHub.
Загрузить PDF
Загрузить PDF
Из этой статьи вы узнаете, как написать программу в стандартном приложении «Блокнот» для Windows. Если коротко, то вам нужно будет построчно ввести код программы в Блокнот, а затем сохранить файл в формате необходимого языка программирования.
-
1
Ознакомьтесь с ограничениями Блокнота. Формально в Блокноте можно написать программу на любом языке программирования, но чтобы ее запустить, программу нужно сохранить в правильном формате.
- Файлы Блокнота по умолчанию сохраняются в виде текстовых документов.
-
2
Найдите и запустите Блокнот. Наиболее простой способ запустить Блокнот — открыть меню «Пуск»
, ввести блокнот, а затем нажать на синюю иконку Блокнота в верхней части меню «Пуск».
-
3
Выберите язык программирования. Блокнот не имеет ограничений в языках программирования, но для корректной работы программы вам придется использовать один и тот же язык во всем документе.
- Если вы не знаете ни одного языка программирования, воспользуйтесь одним из примеров, указанных в статье.
-
4
Завершив строку кода, нажмите ↵ Enter. Как и в большинстве редакторов кода, отдельные строки кода должны располагаться на разных строках Блокнота.
-
5
Закройте все открытые фигурные и квадратные скобки. Если вы открыли квадратную или фигурную скобки (
{
или[
), ее обязательно нужно закрыть, чтобы завершить строку кода. Несоблюдение этого правила приведет к ошибкам в коде. -
6
Подумайте об использовании специальной программы для редактирования кода. Хотя в Блокноте, безусловно, можно писать целые программы, на деле же все не так просто. Поскольку в Блокноте нет подсветки синтаксиса и автоматической разметки, он плохо подходит для написания крупных фрагментов кода.
- Notepad ++ — бесплатный и более удобный вариант для работы с кодом.
Реклама
-
1
Запустите Блокнот. Блокнот позволяет создавать и сохранять любую программу, независимо от используемого языка программирования.
-
2
Введите код программы. Убедитесь, что во всем документе используется один и тот же язык программирования.
-
3
Нажмите на Файл в верхнем левом углу окна «Блокнот», чтобы раскрыть выпадающее меню.
-
4
Нажмите на Сохранить как… в верхней части выпадающего меню, чтобы открыть окно «Сохранение».
-
5
Укажите папку для сохранения. Нажмите на папку (например, «Рабочий стол») в левой части окна «Сохранение», чтобы выбрать ее в качестве места расположения программы.
-
6
Нажмите на поле «Тип файла» в нижней части окна «Сохранение», чтобы раскрыть выпадающее меню.
-
7
Выберите пункт Все файлы в выпадающем меню. Это позволит вам сохранить файл Блокнота в виде любого типа программ.
-
8
Введите имя будущей программы. Нажмите на текстовое поле «Имя файла» и введите имя для своей программы.
-
9
Добавьте расширение к имени программы. Чтобы правильно сохранить программу, добавьте точку и метку расширения языка программирования сразу после имени программы. Вот перечень наиболее распространенных языков программирования и их расширений:
- пакетный файл (BAT) — .bat;
- HTML — .htm;
- Python — .py;
- C++ — .cpp.
- К примеру, чтобы сохранить пакетный файл с именем «арбузы», введите арбузы.bat в поле «Имя файла».
-
10
Нажмите на Сохранить в нижнем правом углу окна, чтобы сохранить программу в указанном формате. Чтобы запустить программу, щелкните по ней дважды (возможно, вас попросят выбрать программу для открытия файла).
Реклама
-
1
Запустите Блокнот. Попробуйте создать программу, которая бы запускала другую программу на компьютере, используя скриптовый язык (BAT).
-
2
Введите имя исполняющего файла для выведения Командной строки. Введите cmd.exe в Блокнот.
-
3
Сохраните программу. Убедитесь, что в конце имени файла указано расширение .bat.
-
4
Дважды щелкните по пакетному файлу. Так вы откроете окно командной строки.
Реклама
-
1
Запустите Блокнот. Если вы хотите создать веб-страницу, отличным языком для этой работы будет HTML.
-
2
Укажите, что вы будете использовать именно язык HTML. Введите
!DOCTYPE html
и нажмите ↵ Enter. -
3
Добавьте метку HTML. Введите в Блокнот
html
и нажмите ↵ Enter. -
4
Определите текстовый раздел программы. Введите в Блокнот
body
и нажмите ↵ Enter. Эта строка указывает, что далее в документе будет идти раздел информации (в данном случае текст). -
5
Добавьте заголовок страницы. Введите в Блокнот
<h1>Текст</h1>
и нажмите ↵ Enter, заменив слово «Текст» заголовком страницы.- К примеру, чтобы создать страницу с заголовком «Привет!», введите в Блокнот
<h1>Привет!</h1>
.
- К примеру, чтобы создать страницу с заголовком «Привет!», введите в Блокнот
-
6
Добавьте текст на свою страницу. Введите
<p>текст</p>
и нажмите ↵ Enter, заменив слово «текст» текстовыми данными.- К примеру, если вы введете в Блокнот
<p>Как дела?</p>
, сразу после заголовка появится фраза «Как дела?».
- К примеру, если вы введете в Блокнот
-
7
Закройте текстовый раздел. Введите
</body>
и нажмите ↵ Enter. -
8
Укажите конец HTML программы. Введите
</html>
. -
9
Просмотрите код своей программы. Он должен выглядеть следующим образом:
<!DOCTYPE html>
<html>
<body>
<h1>Привет!</h1>
<p>Как дела?</p>
</body>
</html>
-
10
Сохраните программу. При сохранении убедитесь, что выбрали расширение .htm.
-
11
Дважды щелкните по HTML-файлу, чтобы открыть его в браузере по умолчанию. Возможно, сначала вам будет предложено выбрать программу. Заголовок и текст программы появятся в новой вкладке браузера.
Реклама
-
1
Запустите Блокнот. С помощью команды «print» в Python можно отобразить любой желаемый текст.
-
2
Введите команду «print». Введите в Блокнот
print("
. Убедитесь, что между символами нет пробелов. -
3
Добавьте текст, который хотите отобразить. Введите Привет!.
-
4
Закройте команду «print». Введите
")
, чтобы закрыть команду. -
5
Ваш код должен выглядеть следующим образом:
print("Привет!")
-
6
Сохраните программу. При сохранении убедитесь, что выбрали расширение .py. Теперь программу можно будет открыть в любом редакторе Python.
Реклама
-
1
Запустите Блокнот. В данном примере мы рассмотрим создание простой программы на C++, которая при запуске будет отображать на экране фразу «Hello World!».
-
2
Добавьте название программы. Введите
//
, а затем название программы (например, «Моя первая программа»). Любой текст в строке, идущий после двух косых черт, отобразится как обычный текст (не являясь частью программы).- К примеру, чтобы обозначить свою программу как «Программа 1», введите в Блокнот:
//Программа 1
.
- К примеру, чтобы обозначить свою программу как «Программа 1», введите в Блокнот:
-
3
Введите директиву препроцессора. Введите
# include <iostream>
и нажмите ↵ Enter. Эта команда сообщает C++, что следующие строки кода нужно запускать в виде программы. -
4
Объявите функцию программы. Введите
int main ()
и нажмите ↵ Enter. -
5
Добавьте открытую скобку. Введите в Блокнот
{
и нажмите ↵ Enter. Основной код программы будет заключен между этой открытой скобкой и ее закрывающей парой. -
6
Введите исполняющий код программы. Введите
std::cout << "Hello World!";
и нажмите ↵ Enter. -
7
Добавьте закрывающую скобку. Введите
}
, чтобы завершить исполняющий код программы. -
8
Просмотрите свою программу. Она должна выглядеть следующим образом:
//Название программы
#include <iostream>
int main ()
{
std::cout << "Hello World!";
}
Реклама
-
Сохраните программу. При этом не забудьте указать расширение .cpp. Сохраненную программу можно будет запустить в любом компиляторе C++.
9
Советы
- C++ и HTML — два из наиболее часто используемых языка программирования.
- Большинство программ можно написать практически на любом языке программирования, хотя некоторые языки лучше подходят для определенных задач (например, язык HTML идеально подходит для создания веб-страниц).
Предупреждения
- Всегда проверяйте код перед тем, как его сохранить. Сохранение неисправной программы может привести к проблемам со стандартным компилятором.
Об этой статье
Эту страницу просматривали 189 968 раз.
Была ли эта статья полезной?
{lang: ‘ru’}
В этом посте мне хочется рассказать, как создать простейшее приложение с использованием WinAPI и языка программирования C++. Обычное, пустое окошко Windows. Причины, побудившие меня к этому, очень просты: источники, которые я читал до определенного момента не давали мне полного представления о том, что и как работает в приложении Win32. Понимать я это стал, как ни удивительно, только после того, как тот же материал был освещен на лекциях в универе. Почему-то в том виде, в каком преподносилась информация на лекциях, она лучше откладывалась в памяти, нежели “книжные” записи, пусть даже совсем неплохие. Еще одно обстоятельство, способствовавшее идее освящения данной темы – желание лучше закрепить материал, излагая его в письменной форме и, возможно, даже расширить свои знания, заглянув лишний раз в MSDN, чтобы дополнить что-то.
Как, думаю, стало понятно из вступления, материал этого поста и, вероятно, последующих постов на тему WinAPI и программирования под ОС Windows будут основываться на универских лекциях + MSDN с добавлением чего-то от себя (по делу :)).
Наверное, в начале стоит сказать, что Windows API (Application Programming Interface) – это набор готовых классов, функций, структур и констант, при помощи которых любое приложение может взаимодействовать с операционной системой (ОС) Windows.
Также отмечу, что основные функции Windows API появились еще в Win16 и с каждой версией Windows их набор расширяется, утрачивая, однако, при этом поддержку некоторых других функций. Схематично, это можно представить так:
Итак, для любого Windows приложения требуется написать как минимум 2 функции:
Точка входа в приложение, в которой необходимо:
- зарегистрировать класс окна
- создать окно
- запустить цикл обработки сообщений
Сама точка выглядит примерно так:
// точка входа в программу #include <windows.h> //добавляем к проекту заголовочный файл с основными функциями и макросами Windows API int WINAPI WinMain(HINSTANCE hInst, //хендл на это приложение HINSTANCE hPrev, //оставлен для совместимости с Win16, всегда = 0 LPSTR szCmdLine, //командная строка этого приложения int nShowCmd) //параметры, указывающие, как надо запускать приложение { //здесь будет текст программы } |
Вопрос №1: Что значит LPSTR? В ответе представлю небольшой список “особенностей” строковых типов WINAPI.
char работает с ASCII
wchar_t – с Unicode
Они оба используются в макросе TCHAR, который позволяет их “перещелкивать” в зависимости от настроек проекта (компилируется под ASCII или под Unicode)
Также, в WinAPI зачастую есть 2 по сути одинаковые функции:
FuncNameA – для работы с ASCII
FuncNameW – для работы с Unicode
Строковые типы в WinAPI:
LPSTR – char* LOWSTR – wchar_t* LPISTR – TCHAR* LPCSTR – const char* LPCWSTR – const wchar_t* LPCTSTR – const TCHAR* |
об остальных можно посмотреть в MSDN
Вопрос №2: Что значит WinAPI? Ответ: WinAPI скрывает под собой используемое соглашение вызова — __stdcall, по которому параметры заносятся в стек справа налево (что позволяет вызывать функции с переменным числом параметров), а очищается он вызываемой функцией. Подробнее о различных соглашениях вызова можно почитать в Википедии.
2. Обработчик сообщений.
Начнем по порядку.
Регистрация окна осуществляется в два этапа:
заполнение структуры окна
передача структуры на регистрацию
Когда выглядит примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
// 1й этап // регистрируется класс WNDCLASSEX wcx = {0};//обнуляем сразу все поля структуры, чтобы ничего не забыть, т.к. понадобятся нам пока не все// я же говорил что WNDCLASSEX можно не юзать, но MSDN ругается wcx.cbSize = sizeof(WNDCLASSEX); //по размеру структуры Windows определит, какая версия API была использована wcx.style = CS_HREDRAW | CS_VREDRAW;// говорим окну перерисовываться при изменении размеров окна wcx.lpfnWndProc = WndProc;// указываем функцию обработки сообщений wcx.hInstance = hInst; // хендл на наше приложение wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // GetStockObject возвращает хендл на белую кисточку, для фона окна wcx.lpszClassName = TEXT(«[lexpenz.com] Win32.»);// имя данного класса. Должно быть уникальным, иначе, если класс с таким именем уже зарегестрирован, то в регистрации будет отказано if ( !RegisterClassEx(&wcx) ) return 1;// регистрируем ( не получилось — уходим по английски ) с кодом ошибки (1) Вопрос №3: Что делает макрос TEXT? Ответ: Он, если идет компиляция с использованием Unicode, добавляет префикс «l» к переданной ему строке, что делает её Unicode—строкой для компилятора. Далее идет создание окна: // 2й этап // создается окно HWND hWnd = CreateWindowEx(0, TEXT(«[lexpenz.com] Win32.»),//имя класса TEXT(«[lexpenz.com] Win32. Первое приложение Win32.»),//заголовок окна WS_OVERLAPPEDWINDOW, //тип окошка (включает отображение системного меню, кнопок в верхнем правом углу и т.п.) CW_USEDEFAULT,0,//место появления окна (координаты х и y). Здесь указано место “по умолчанию”, поэтому второй параметр игнорируется CW_USEDEFAULT,0,//ширина окна (определяется аналогично месту появления) 0, //ссылка на родительское окно 0,//хендл меню hInst, 0);//код, передаваемый с сообщением WM_CREATE if (!hWnd) //проверяем успешность создания окна return 2; // теперь показываем окошко ( nShowCmd — как его показать? минимизированным, обычным или … ) ShowWindow(hWnd, nShowCmd); // говорим окну обновиться UpdateWindow(hWnd); И, наконец, // 3й этап // запуск главного цикла обработки сообщений MSG msg = {0};// создаем структуру сообщения, которую будем обрабатывать while( GetMessage(&msg, 0,//говорим получать сообщения от всех окон 0, 0) )//диапазон значений получаемых сообщений (сейчас получаем все) { // ждем сообщение TranslateMessage(&msg); // преобразуем виртуальную клавишу в ASCII-код и посылаем сообщение WM_CHAR (тут не нужно.Необходимо, если надо работать с текстом, вводимым с клавиатуры) DispatchMessage(&msg); // передаем сообщения для обработки в «главную функцию обработки сообщений» } |
Для завершения основной функции, осталось прописать только код возврата:
return( (int)msg.wParam );// т.к. это функция, то вернем параметр WM_QUIT сообщения (см. PostQuitMessage)
Функция обработки сообщений:
// главная функция обработки сообщений LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY:// если этого не сделать, то все ваши жалкие попытки закрыть окно будут проигнорированы PostQuitMessage(0);// отправляет приложению сообщение WM_QUIT. Принимает код ошибки, который заносится в wParam сообщения WM_QUIT break; } return DefWindowProc(hWnd, msg, wParam, lParam);//обрабатываем все остальные сообщения обработчиком «по умолчанию» } |
И, как всегда, в завершении статьи ссылка на архив с примером.
Полезная статья? Их будет больше, если вы поддержите меня!