Developer от Бога

DV

четверг, 6 июля 2017 г.

WinAPI. Введение.

WINAPI - это набор функций и структур для программирования приложений которые работают в операционной системе Windows. WINAPI в основном спроектирован для работы с языком СИ. Интерфейсы управления процессами от внешнего вида окон программ и до работы с портами ввода/вывода основаны на структурах языка СИ. Любые процессы в компьютере контролирует операционная система, и Windows выделяет по очереди время для каждой программы в которое приложение имеет доступ до вычислительных ресурсов ПК.
Организацию приложения WINAPI можно разделить на три составляющие:
1) Окно приложения (его регистрация в операционной системе, создание и отображение).
2) OS WINDOWS.
3) Функция обработки сообщений WndProc.
В первом пункте создается переменная типа HWND (HWND hwnd) которая является дескриптором главного окна, именно через нее в ходе выполнения программы будет происходить управление главным окном (добавление/удаление элементов, вывод информации и другое). Переменную hwnd можно создать как глобальную (вне любых функций) или внутри главной функции с которой приложение начинает работу - WinMain. WinMain - функция создает еще несколько переменных, две из которых имеют тип HINSTANCE, где хранится дескриптор приложения, по которому Windows будет отличать программу из множества других. В функции WinMain также заполняется структура главного окна WNDCLASSEX (WNDCLASSEX wincl), в которой содержатся настройки окна (его вид, визуальный тип курсора и другое). Далее созданное окно регистрируется в системе функцией RegisterClassEx(&wincl). Следующим этапом идет отображение окна функцией ShowWindow (hwnd, nCmdShow);
Заключительным этапом первого пункта - запуск цикла сообщений , извлекаемых из операционной системы функцией GetMessage (&messages, NULL, 0, 0); где messages - ранее созданная переменная типа MSG. По параметрам этих сообщений определяются события происходящие в программе и в компьютере в целом.

Второй пункт OS WINDOWS, операционная система, она есть посредник между программой и аппаратурой компьютера. OS WINDOWS решает когда, и на сколько выделять ресурсы ПК для программы, и делает более читаемым вид событий которые происходят в системе на уровне электрических сигналов.

Третий , более абстрактный пункт - функция обработки сообщений WndProc(), это - логика приложения. Она вызывается операционной системой, и принимает сообщения из OS WINDOWS в виде параметров WPARAM wParam, LPARAM lParam . В свою очередь в зависимости от событий, программа решает что делать и какие действия производить в ответ на происходящее.
Данный пример кода создания окна является стартовым в среде разработки программ Code::Blocks:




  1. #include <tchar.h>
  2. #include <windows.h>
  3. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  4. TCHAR szClassName[ ] = _T("iVARIOUS.COM");
  5. int WINAPI WinMain (HINSTANCE hThisInstance,
  6. HINSTANCE hPrevInstance,
  7. LPSTR lpszArgument,
  8. int nCmdShow)
  9. {
  10. HWND hwnd;
  11. MSG messages;
  12. WNDCLASSEX wincl;
  13. wincl.hInstance = hThisInstance;
  14. wincl.lpszClassName = szClassName;
  15. wincl.lpfnWndProc = WindowProcedure;
  16. wincl.style = CS_DBLCLKS;
  17. wincl.cbSize = sizeof (WNDCLASSEX);
  18. wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  19. wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  20. wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  21. wincl.lpszMenuName = NULL;
  22. wincl.cbClsExtra = 0;
  23. wincl.cbWndExtra = 0;
  24. wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  25. if (!RegisterClassEx (&wincl))
  26. return 0;
  27. hwnd = CreateWindowEx (
  28. 0,
  29. szClassName,
  30. _T("iVARIOUS.COM"),
  31. WS_OVERLAPPEDWINDOW,
  32. CW_USEDEFAULT,
  33. CW_USEDEFAULT,
  34. 700,
  35. 600,
  36. HWND_DESKTOP,
  37. NULL,
  38. hThisInstance,
  39. NULL
  40. );
  41. ShowWindow (hwnd, nCmdShow);
  42. while (GetMessage (&messages, NULL, 0, 0))
  43. {
  44. TranslateMessage(&messages);
  45. DispatchMessage(&messages);
  46. }
  47. return messages.wParam;
  48. }
  49. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  50. {
  51. switch (message)
  52. {
  53. case WM_DESTROY:
  54. PostQuitMessage (0);
  55. break;
  56. default:
  57. return DefWindowProc (hwnd, message, wParam, lParam);
  58. }
  59. return 0;
  60. }

Комментариев нет:

Отправить комментарий