Начало.
Оговорим некоторую условность этого названия. Я не собирался, и не собираюсь писать учебник или полное руководство, обучающее программированию в системе Windows. Таких книг и руководств так много, что нет смысла их повторять. Но, начинающим самостоятельно программировать, пригодятся эти советы, для более полного и точного понимания происходящего не только в вашей программе, но и в самой системе.
Я надеюсь, что если вам будет не понятно, то на нашем форуме я всегда смогу уточнить и дополнить этот текст.
В какой среде программировать на Windows решать вам. Все, что здесь будет написано, справедливо для всех языков, всех компиляторов, однако, базовым, мы будем рассматривать основной компилятор от Microsoft - VC++ 6.0. От добра, добра не ищут, а компилятор и среда VC++ представляется мне одними из лучших.
- 1 -
Выберите тип создаваемой аппликации. Изначально вам предложат три варианта:
1. MFC;
2. Windows API;
3. Console application.
Console application - это эмуляция обычной программы под DOS. В ней есть только функция main().
Выбирайте этот вариант - если вы хотите создать приложение, которое не нуждается в красивом оконном интерфейсе, а является обычной программой обслуживания, или фоновой программкой, выполняющей сервисные функции. Например, любой сервер типа Апачи бежит именно в таком варианте. Это подходит и для написания приложений работающих сразу в нескольких типах OS.
Windows API - это стандартная программа под Windows, раньше бывшая единственной формой аппликации. Выбор такого варианта даст вам много нагрузки при оформлении внешнего вида, да и в обработке сообщений вам придется поработать. Не стоит брать этот вариант, для сложных и многоплановых программ, однако он вам подойдет, для организации простенького окна, выполняющего ограниченные функции для пользователя. Почти как в предыдущем варианте, только с оконным интерфейсом. Этот вариант дает компактную компиляцию. Дает возможность внешне несложной программе выполнять сложные функции.
MFC - это использование системы библиотек MFC, которые намного облегчают работу с визуальными эффектами, графикой и элементами интерфейса. Однако после компиляции, включающей в код библиотеку, размер программы сразу около 200Кб, а при компиляции без библиотеки, заставляет таскать с собой библиотечную dll, тоже немалого размера. На этом варианте мы остановимся подробнее, ну уж очень облегчает работу в Windows эта библиотека.
На 3 виде я останавливаться не буду. Его структура вполне знакома программистам на С, С++, а вы остальном, все что я буду говорить будет справедливо и для него.
Создадим аппликацию в виде Windows API.
Нас будут интересовать несколько частей полученного файла. Его имя - это имя, которое вы ввели как название проекта .cpp.
Код:
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_WINAPI);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_WINAPI;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
Несмотря на то, что нам эта функция в будущем практически не понадобиться, для понимания самого процесса работы программы она нам необходима.
Все аппликации Windows имеют свой класс. Это не тот класс, к которому мы привыкли в программировании, класс окна - это элемент списка в таблице атомов.
Так как виртуальная машина Windows выделяет каждой аппликации виртуальное пространство, в котором аппликация и живет, то для каждого оконного процесса, а бывают еще и безоконные, OS заводит запись. Атом используют для более простой идентификации записи в виде целого числа.
Для своей работы, кроме time-slice технологии, Windows использует систему приоритетов, и систему очередей. Декларировано, Windows является системой реального времени, реагирующей на события, происходящие в системе, такие, как нажатие клавиши, или приход запроса с устройства на обслуживание. Примером служит нажатие клавиши. Изначально получив от драйвера сигнал о нажатии, Windows генерирует сообщение WM_KEYDOWN с параметрами, в которых указывает все жизненно важные данные. Затем идет сообщение WM_CHAR, с которым уже непосредственно для программы идет информация о коде клавиши (буковке), и т.д. При отпускании клавиши появится сообщение WM_KEYUP.
При равном приоритете и некоторых других параметров, время на работу выделяется в зависимости от наличия сообщений.
У Windows существует главная очередь. В нее помещаются абсолютно все сообщения, направляемые во все аппликации, в том числе и системные. Уже после помещения сообщения в главную очередь, системный обработчик определяет реальное назначение сообщения, и перемещает его в главную очередь аппликации.
Разбор происходит с ориентировкой именно на тот класс окна (процесса), который мы регистрируем вышеупомянутой функцией.
В основном данные, зарегистрированные по умолчанию, не приходится менять. Нам стоит запомнить несколько из них для дальнейшей работы.
Оставим иконки и курсоры, с ними разберемся потом, запомним две вещи.
1. wcex.lpfnWndProc = (WNDPROC)WndProc; - основная процедура обработки сообщений передаваемых нашей программе из системы.
2. wcex.hInstance = hInstance; - наш идентификатор, который в Windows API помогает обращаться нам самим к ресурсам не оконного типа, но стандартным в Windows. Например - иконки.
Второе тоже понадобиться только в качестве параметра и основным для аппликации станет не главная функция приложения, а именно WndProc.
Information
- Posted on 31.01.2010 21:40
- Просмотры: 1583