- •Лекция 1. Введение в язык С++. Типы данных. Математические операции. Сокращенная запись операций. Инкремент/декремент.
- •Лекция 2. Управляющие конструкции. Статические массивы. Функции.
- •Лекция 3. Понятие ООП. Класс. Инкапсуляция. Зоны видимости. Поля.
- •Лекция 4. Адреса и указатели. Динамические массивы. Friend-методы.
- •Лекция 5. Принципы ООП. Наследование. Полиморфизм. Наследование и зоны видимости.
- •Лекция 6. Раннее и позднее связывание. Виртуальные методы. Таблица виртуальных функций. Абстрактные классы. Чистые виртуальные функции.
- •Лекция 7. Перегрузка операций. Файловый ввод-вывод. Понятие шаблона.
- •Лекция 8. Шаблонные классы.
- •Лекция 9. Модели компиляции шаблонов. Специализация шаблонов.
- •Лекция 10. Семинар на тему «Шаблоны в С++ - за и против»
- •Лекция 11. Потоки выполнения. Многопоточность.
- •Лекция 12. Строки в с/с++. Команды работы со строковыми типами.
- •Лекция 13. Графика. Консольная графика. GUI.
- •Лекция 14. API-функции. Использование системных методов.
- •Лекция 15. Обработка ошибок и исключений
- •Лекция 16. Оптимизация кода. Интеграция с другими языками программирования.
- •Лекция 17. Языки программирования. История и перспективы развития.
Лекция 14. API-функции. Использование системных методов.
(см. слайды П_1_14_API)
Windows API
Windows API — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows корпорации «Майкрософт» и совместимой с ними свободной бесплатной операционной системы ReactOS.
Windows API был изначально спроектирован для использования в программах, написанных на языке Си/C++. Работа через Windows API — это наиболее близкий к системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется черезWindows Driver Model.
Примеры
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
MessageBox(NULL, "Сказала собака баскервилей.", "Ну, здравствуй, Герасим.", MB_OK| MB_ICONEXCLAMATION);
return 0;
}
Начнем с параметров главной функции. Кстати, это САМАЯ главная функция. Функция WndProc (о которой позже) является главной оконной процедурой.
Итак, параметры… HINSTANCE вообще интересный тип. Это своего рода дескриптор объекта (HANDLE).
В первом случае (hInstance) он указывает на тот исполняемый модуль, на основе которого запущен процесс данного кода. Проще говоря, указывает на файл “NoWindow.exe”.
Второй параметр (hPrevInstance) – пережиток Win16. В 32-разрядных приложениях не используется. Раньше обозначал предыдущий запущенный экземпляр данного приложения.
Третий (lpszCmdParam) – строка параметров, которые были посланы программе при запуске. Если их не было, то строка пуста.
Четвертый (nCmdShow) – число, обозначающее вид окна при запуске. Например, свернутое, развернутое, нормальное.
За одно, разберем параметры вызова MessageBox.
Первый – дескриптор окна, к которому принадлежит сообщение. Это нужно для того, что бы Windows знала, какое окно его вызвало и, соответственно, сделать его неактивным, пока вы не ответите в нем нажатием какой-нибудь кнопки.
Второй и третий – строки. Соответственно, текста сообщения и текста заголовка сообщения.
Четвертый – самый интересный. В нем указывается стиль сообщения. Они находятся в файле <WinUser.h>
#include <windows.h> #include <windowsx.h>
#define SimWnd_DefProc DefWindowProc
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
;
BOOL Register(HINSTANCE hInstance);
HWND Create(HINSTANCE hInstance, int nCmdShow); static char szAppName[] = "SimWnd";
static HWND hMainWindow;
void SimWnd_OnDestroy(HWND hwnd);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
MSG Msg;
if (!Register(hInstance)) return FALSE;
if (!Create(hInstance, nCmdShow)) return FALSE;
while (GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
BOOL Register(HINSTANCE hInstance)
{
WNDCLASS WndClass;
WndClass.style |
= |
CS_HREDRAW | CS_VREDRAW; |
WndClass.lpfnWndProc |
= |
WndProc; |
WndClass.cbClsExtra |
= |
0; |
WndClass.cbWndExtra |
= |
0; |
WndClass.hInstance |
= |
hInstance; |
WndClass.hIcon |
= |
LoadIcon(NULL, IDI_APPLICATION); |
WndClass.hCursor |
= |
LoadCursor(NULL, IDC_ARROW); |
WndClass.hbrBackground |
= |
(HBRUSH)(COLOR_BTNFACE+1); |
WndClass.lpszMenuName |
= |
NULL; |
WndClass.lpszClassName |
= |
szAppName; |
return (RegisterClass(&WndClass) != 0);
}
HWND Create(HINSTANCE hInstance, int nCmdShow)
{
HWND hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL); if (hwnd == NULL)
return FALSE; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd);
return hwnd;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message,
WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
HANDLE_MSG(hwnd, WM_DESTROY, SimWnd_OnDestroy); default:
return SimWnd_DefProc(hwnd, Message, wParam, lParam);
}
}
void SimWnd_OnDestroy(HWND hwnd)
{
PostQuitMessage(0);
}
Три шага создания окна:
1)Регистрация. (Register())
2)Создание. (Create())
3)Обработка сообщений. (WndProc())
Когда мы создаем оконное приложение, мы как бы делаем подкласс объекта «окно» благодаря этим трем шагам. При создании кнопки (класс “button”) , регистрацию и обработку сообщений выполняет система, а создание – программист. Программист также может создать свой класс кнопки и сделать ей любые свойства такие, как подсветка или градиент.
При регистрации, мы сообщаем системе, в основном, название нового класса и процедуру обработки его сообщений, ну и некоторые элементы внешнего вида и другие параметры.
Создание окна – тут все просто. Вызов функции CreateWindow(). А при создании нового окна, после этой вызываются ShowWindow() и UpdateWindow(). Они призваны соответственно показать и обновить окно.
Самое сложное и обычно наиболее емкое по коды – это обработка сообщений. Есть такая штука – DefWindowProc – стандартная оконная процедура. Все наше окно полностью работает за счет этой процедуры.
Сообщения.
Все функционирование в Windows основано на сообщениях. Даже то, что вы передвигаете мышь. Точнее её перерисовка. А как их получает оконная процедура? Все начинается тут:
while (GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
А продолжается тут:
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message,
WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
HANDLE_MSG(hwnd, WM_DESTROY, SimWnd_OnDestroy); default:
return SimWnd_DefProc(hwnd, Message, wParam, lParam);
}
}
Функция GetMessage получает сообщение от системы и пересылает его оконной процедуре. Там программист обрабатывает его так, как хочет. Если он этого не делает или ему этого не нужно, то оно обрабатывается стандартной процедурой. Сообщений очень много и приводить их здесь нецелесообразно – займет пару страниц. Скажу только то, что когда я не знал, как называется сообщение, то открывал файл <WinUser.h> искал WM_NULL и смотрел далее сообщения, а по названию определял назначение, далее по справке и, в конце-концов, можно найти.
Рассмотрим параметры в функции WndProc:
1)Дескриптор окна, к которому относится сообщение.
2)Само сообщение.
3)Параметр сообщения.
4) Параметр сообщения.
Использование системных методов
Операционная система windows является объектно-ориентированной. Все элементы управления (объекты) являются окнами в том или ином виде. Каждый такой элемент имеет свои параметры состояния, входные и выходные сообщения. Традиционно при написании программ с использованием чистого winapi применяются методы структурного и объектноориентированного программирования.