Введение в создание оконных приложений. Виндовс программирование


Введение в создание оконных приложений

 

Программирование в Windows основывается на использовании функций API (Application Program Interface, т.е. интерфейс программного приложения).

Программа для Windows в значительной степени состоит из таких вызовов. Все взаимодействие с внешними устройствами и ресурсами операционной системы происходит посредством таких функций.

Программный интерфейс приложений

Windows API (Application Programming Interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows.

Windows API в настоящее время поддерживает свыше тысячи вызовов функций, которые можно использовать в приложениях. Каждая функция Windows API имеет развернутое имя, написанное буквами как верхнего, так и нижнего регистров.

Все основные функции Windows объявляются в заголовочных файлах. Главный заголовочный файл называется WINDOWS.H, и в этом файле содержится множество ссылок на другие заголовочные файлы.

Основное отличие функций API от библиотечных функций С: код библиотечных функций связывается с кодом программы пользователя, а код функций API остается вне программы пользователя в динамически подключаемых библиотеках (DLL – Dynamic Link Library), что позволяет создавать более компактный и эффективный код приложений.

При запуске программы Windows она взаимодействует с операционной системой посредством процесса «динамического связывания». Большая часть динамических библиотек DLL расположена в каталоге WINDOWS\SYSTEM.

При компоновке программы для Windows, чтобы сделать ее исполняемой, необходимо связывать ее с «библиотеками импорта», поставляемыми в составе среды программирования (IDE – Integrated Development Environment), которой может являться, в частности, Microsoft Visual Studio. Библиотеки импорта содержат имена всех функций Windows из динамически подключаемых библиотек и ссылки на них. Компоновщик использует эту информацию для создания в исполняемом EXE-файле таблицы, которую Windows использует при загрузке программы для настройки адресов функций API.

Графический интерфейс пользователя

Графический интерфейс пользователя (Graphical User Interface, GUI) еще называют «визуальный интерфейс» или «графическая оконная среда».

GUI делает возможным использование графики на растровом экране. Графика дает лучшее восприятие элементов управления на экране, визуально богатую среду для передачи информации. В GUI экран становится устройством ввода и показывает различные графические объекты в виде картинок и конструкций для ввода информации, таких как кнопки или полосы прокрутки. Используя клавиатуру и манипулятор (мышь, тачпад), пользователь может непосредственно оперировать объектами на экране. Графические объекты можно перетаскивать, кнопки можно нажимать, полосы прокрутки можно прокручивать. Взаимодействие между пользователем и программой становится более тесным.

Пользователям не надо тратить слишком много времени на то, чтобы научиться пользоваться компьютером и составлять новые программы. Система Windows способствует этому, поскольку все программы для Windows выглядят и воспринимаются одинаково.

Любая программа для Windows имеет окно — прямоугольную область на экране, в котором приложение отображает информацию и получает реакцию от пользователя. Окно идентифицируется заголовком. Большинство функций программы запускается посредством меню. Слишком большой для экрана объем информации может быть просмотрен с помощью полос прокрутки. Некоторые пункты меню вызывают появление окон диалога, в которые пользователь вводит дополнительную информацию.

Программирование Windows-приложений тесно связано с понятиями объектно-ориентированного программирования. Главным объектом в операционной системе Windows является окно. Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами.

Активное окно – окно, получающее реакцию от пользователя в данный момент.

Основными элементами окна являютсяОсновные элементы окна

  • 1 — строка заголовка title bar
  • 2 — строка меню menu bar
  • 3 — системное меню system menu
  • 4 — кнопка сворачивания окна minimize box
  • 5 — кнопка разворачивания окна maximize box
  • 6 — рамка изменения размеров sizing border
  • 7 — клиентская область client area
  • 8 — горизонтальная и вертикальная полосы прокрутки scroll bars

 

Многозадачность

Многозадачность (multitasking) — свойство операционной системы обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов.

Операционная система Windows является многозадачной. Если программа DOS после своего запуска должна быть постоянно активной, и если ей что-то требуется (к примеру, получить очередную порцию данных с устройства ввода-вывода), то она сама должна выполнять соответствующие запросы к операционной системе, то в Windows все наоборот. Программа пассивна, после запуска она ждет, когда ей уделит внимание операционная система. Операционная система делает это посылкой специально оформленных групп данных, называемых сообщениями. Сообщения могут быть разного типа, они функционируют в системе достаточно хаотично, и приложение не знает, какого типа сообщение придет следующим.

Логика построения Windows-приложения должна обеспечивать корректную и предсказуемую работу при поступлении сообщений любого типа. Одновременно несколько программ могут выполняться и иметь вывод на экран. Каждая программа занимает на экране прямоугольное окно. Пользователь может перемещать окна по всему экрану, менять их размер, переключаться между разными программами и передавать данные от одной программы к другой.

Операционная система не сможет реализовать многозадачность без управления памятью. Так как одни программы запускаются, а другие завершаются, память фрагментируется. Операционная система Windows имеет средства управления фрагментами памяти.

Процессы и потоки

Процессом (process) называется экземпляр программы, загруженной в память. Экземпляр программы может создавать потоки (thread), которые представляют собой последовательность инструкций на выполнение.

Выполняются не процессы, а именно потоки. Любой процесс имеет хотя бы один поток. Этот поток называется главным (основным) потоком приложения.

Потоки на самом деле выполняются не одновременно, а по очереди. Распределение процессорного времени происходит между потоками, но переключение между ними происходит так часто, что кажется будто они выполняются параллельно.

Все потоки ранжируются по приоритетам. Приоритет потока обозначается числом от 0 до 31, и определяется исходя из приоритета процесса, породившего поток, и относительного приоритета самого потока. Таким образом, достигается наибольшая гибкость, и каждый поток в идеале получает столько времени, сколько ему необходимо.

Дескрипторы

Дескриптор (описатель) объекта — служебная структура данных, представляющая собой беззнаковое целое число и служащая для идентификации различных объектов. Дескриптор представляет собой указатель на некоторую системную структуру или индекс в некоторой системной таблице.

Примеры дескрипторов, описанных в заголовочном файле windows.h

          

typedef void *HANDLE;  // абстрактный дескриптор (например, файла)typedef void *HMODULE;  // дескриптор модуляtypedef void *HINSTANCE; // дескриптор экземпляра программыtypedef void *HKEY;  // дескриптор ключа в реестреtypedef void *HGDIOBJ;  // дескриптор граф. примитива (перо, кисть)typedef void *HWND;  // дескриптор окнаtypedef void *HMENU;  // дескриптор менюtypedef void *HICON;  // дескриптор иконкиtypedef void *HBITMAP;  // дескриптор картинкиtypedef void *HFONT;  // дескриптор шрифта

Контекст устройства

GDI – графический интерфейс устройства. Функции системной библиотеки GDI32.dll используются для вывода графики на экран.

Дескриптор контекста устройства — это паспорт конкретного окна для функций GDI. Контекст устройства фактически является структурой данных, которая внутренне поддерживается GDI. Он связан с конкретным устройством вывода информации (принтер, дисплей). Что касается дисплея, то в данном случае контекст устройства обычно связан с конкретным окном на экране.

Назад: Создание Windows-приложений

prog-cpp.ru

Программирование для Windows XP, 7, 8, 10

Scratch Offline Editor

Февраль 20, 2018

Scratch Offline Editor — бесплатная платформа для освоения основных понятий и принципов программирования, изначально разработанная для школьников младших и средних классов. Работает на Microsoft Windows, Mac… Скачать

Интерпретаторы, Компиляторы, Программирование, Прочие языки, Разработчику, Средства разработки

Decision tree with Time limit

Декабрь 16, 2017

Decision tree with Time limit — полезная программа для компьютера, позволяющая строить деревья решений для задач классификации. Результат программы в виде кода Pascal, который может быть… Скачать

Delphi и Pascal, Образование и наука, Программирование, Разработчику

Учебник и задачник по PHP+MySQL

Июнь 20, 2016

Учебник и задачник по PHP+MySQL — офлайн версия раздела PHP, который входит в состав учебника по основам веб-программирования, с помощью которого вы сможете научиться самостоятельно создавать… Скачать

ASP, PHP, Perl, CGI, IT-литература, Веб-разработчику, Образование и наука, Обучающие программы, Программирование, Электронные книги

Учебник, справочник и задачник по CSS

Июнь 13, 2016

Учебник, справочник и задачник по CSS — офлайн версия раздела CSS, который входит в состав учебника по основам веб-программирования, с помощью которого вы сможете научиться самостоятельно… Скачать

CMS, IT-литература, Веб-разработчику, Образование и наука, Обучающие программы, Программирование, Электронные книги

Учебник, справочник и задачник по HTML

Июнь 13, 2016

Учебник, справочник и задачник по HTML — офлайн версия раздела HTML, который входит в состав учебника по основам веб-программирования, с помощью которого вы сможете научиться самостоятельно… Скачать

HTML, IT-литература, Веб-разработчику, Образование и наука, Обучающие программы, Программирование, Электронные книги

Poet

Февраль 24, 2015

Poet — бесплатная компьютерная программа для работы с текстом, совмещающая в себе функции текстового редактора и процессора. Благодоря продуманному интерфейсу, она предельно проста в освоении… Скачать

Образование и наука, Перекодировщики, Программирование, Редакторы текста, Текст

Kuzya

Октябрь 21, 2013

Kuzya — свободная кроссплатформенная учебная среда программирования, написанная на С++ и использующвя библиотеку Qt. Оболочка программирования Kuzya не привязана к одному конкретному языку программирования или… Скачать

Компиляторы, Образование и наука, Программирование, Разработчику, Средства разработки

Eastegger

Июнь 1, 2013

Eastegger — бесплатная база данных с описаниями «пасхальных яиц» (скрытых возможностей в программах), которые разработчики часто скрывают в своих творениях. Секреты таких известных продуктов, как… Скачать

Компьютер и программы, Образование и наука, Программирование

BinDecHex

Декабрь 29, 2012

BinDecHex — небольшой удобный конвертер систем счисления для компьютера. Программа позволяет переводить числа из одной системы счисления в другую. Программой поддерживается перевод между десятичной, двоичной,… Скачать

Другое, Образование и наука, Программирование, Разработчику

wikiprograms.org

Останься легальным: как написать программу для Windows, не потратив ни копейки

Вот и до нашей страны дошла вездесущая борьба с компьютерным пиратством, карающая всех без разбора. Конечно, это еще не значит, что надо в срочном порядке тереть весь пиратский софт с домашних архивов (к счастью, пока еще правоохранительные органы не устраивают поквартирных обходов с целью выявления нелицензионного ПО). Но вот программистам-одиночкам, выпускающим свои программы в свет, нужно серьезно беспокоиться о том, чтобы их программы были сделаны с учетом законодательства.

Для среднестатистического, мелкомасштабного, читай — домашнего, программера не представляется возможным приобрести в личное пользование таких монстров софтостроения как Visual C++, Borland Delphi. Да и чтобы сотворить действительно красивое оформление интерфейса программы (иконки, картинки, звуки и анимация), понадобиться еще куча денег на Photoshop, Corel…

Средний доход честного человека в нашей стране очень мал, а у студентов — и того меньше. А софт очень дорогостоящий. Как же быть, спросите вы? Выход один — нужно использовать бесплатные средства разработки, бесплатные форматы файлов. К счастью, это добро есть не только под Linux, но и под Windows.

С учетом вышесказанного сформулируем задачу: написать приложение для операционной системы Windows, обладающее следующими качествами — надежность, быстрота работы, относительно малый размер дистрибутива, работа без сторонних библиотек, обязательно наличие красивого и удобного графического интерфейса, естественно, не нарушив при этом закон и не потратив ни копейки.

Если выкинуть компиляторы/интерпретаторы типа Java, Php, Perl, а также Visual Basic (который имеет сравнительно малую популярность в нашей стране) и прочую одноориентированную и узконаправленную программистскую ересь, в нашем распоряжении находятся следующие БЕСПЛАТНЫЕ универсальные средства разработки компьютерных программ для операционной системы Windows:

  1. Visual C++ Express Edition;
  2. C++ Builder Turbo Edition;
  3. Pelles C++ for Windows;
  4. Порты с Linux типа GCC, LCC и другие СС;
  5. Borland Delphi Turbo Edition;
  6. Компилятор Странник «Модула-Си-Паскаль» (поддерживает сразу три языка Си, Паскаль, Модула). Кстати, разработан нашим соотечественником.

Разберем недостатки и преимущества каждого из представленных средств разработки, а также определим, насколько они подходят для решения поставленной нами задачи.

Около года назад в компании Мелкософт что-то произошло. Великие гиганты мысли и любители выколачивания длинного доллара из кармана доверчивых пользователей решили пойти на милость и выдали нам бесплатную версию своей знаменитой «визуальной студии», хотя немного и подрезанную, но все равно рабочую и впечатляющую, и носящую название Visual C++ Express Edition. Вкратце посмотрим, чем этот жест/жесть (нужное подчеркнуть) доброй воли поможет простому российскому кодеру. Данный компилятор бесплатен как для дома и семьи, так и для более глобального распространения. Хым… Вот только много ли из вас ограничатся созданием консольных прог под Windows 98? Дело все в том, что Мелкософтовцы, видать,по недоразумению, а может и по злому умыслу выкинули из дистрибутива экспресса все заголовочный файлы, относящиеся к визуальному программированию. Зато подарили нам свою новую библиотеку визуального программирования CLR, которая по основным концепциям подозрительно похожа на Делфевывую VCL. Но вся беда состоит в том, что CLR для своей работы требует .NET, дистрибутив которого весит 300 метров. Согласитесь, что таскать 300 метров, для того чтобы заработала программа весом в 10 метров — это чересчур большое уважение к Мелкософту. Итог: Троечка — только за смелый шаг.

Рассмотрим другого тяжеловеса софтверного фронта. Представим, что программирование на Си++ упростилось в n-ое число раз. Говорите не может? Может :). В подтверждение этого обратим свое внимание на C++ Builder Turbo Edition. А вот насчет этого компилятора мнение общественности кардинально расходиться. С одной стороны, ключевым языком разработки является Си/Си++ (что не может не радовать приверженцев этого языка) и визуальное удобство находиться на высочайшем уровне, а с другой – есть повод для развязывания HolyWar 🙂 – билдер написан на Делфи, а с другой – можно быстро склепать клевый интерфейс у проги, да и перед товарищами хвастануть, что типа на Си написано :).Итог: В принципе, подойдет, но то, что внутренности написаны на Делфях, все же не дает мне покоя 🙂

Pelles C++ for Windows – хорошее бесплатное средство разработки. Можно сказать, что это «бесплатный Визуал Си» поскольку все настройки и интерфейс почти совпадают. Может компилировать Native. Есть встроенный редактор и компилятор ресурсов. Только толку от этого никакого, визуальности не больше, чем в Visual C++ Express Edition, а написать в таких условиях сложную программу — можно и до пенсии не успеть.Итог: Жизнь коротка, писать надо быстро и качественно – боюсь, не успеем.

Рассмотрим подарки гостей с «другой вселенной». Порты с Linux типа GCC, LCC и другие СС – визуальности нуль, удобство такое же, как у предыдущего компилятора, вдобавок LCC оказался маленько нерабочим, а чтобы качнуть GCC с сайта и заставить его работать, нужно быть академиком. 🙂Итог: Не берем.

Borland Delphi Turbo Edition – бесплатен, есть редактор ресурсов, позволяет писать программы для Windows 32, не требующие никаких дополнительных библиотек. Но есть и свои минусы — нет компилятора командной строки (в принципе, не велика потеря), со временем засоряет память и, что самое неприятное, для своей работы среда Турбо требует установленного dotNET. 🙁Итог: Подходит

Компилятор Странник «Модула-Си-Паскаль» – отечественная разработка, перспективный компилятор, но минусы те же, что и у Pelles C++ for Windows — крайне низкая визуальность.Итог: Патриотично, но не рентабельно. Не берем.

Графика и звук вне закона – к сожалению или к счастью, кончились ДОСовские времена, настала эра программ с визуальностью и красочностью интерфейса. Картиночки, иконки, анимация и прочая мишура, которой очень удобно скрыть общую убогость программы. 🙂 Даже во времена ДОСа примитивная, по сегодняшним меркам, графика делалась в специальных программах — ASCII-редакторах. Для создания красивых иконок, картинок идеально подходит Adobe Photoshop, но он не по карману честному труженику софтверного фронта. Будем искать альтернативу. И найдем ее в стане портированных графических редакторов с Линукса, а именно Gimp. Простой, немного неудобный после пиратского фотошопа, но привыкнуть можно. А какже звук, спросите вы? Современный пользователь избалован и не сегодня — завтра захочет, чтобы программа на каждое его действие отвечала голосом. Как это сделать? WaveLab, SoundForge и Adobe Audition требуют платы за свои возможности. На счастье, есть звуковой редактор Audacity, написанный аспирантом Домиником Мацони из Университета Карнеги Мэллона.

Формат-не формат или как не ошибиться в выборе форматов файлов – для успешного и безопасного, с точки зрения закона, программирования мало выбрать бесплатный компилятор и бесплатный мультимедиа-редактор. Представьте такую ситуацию. Вы делаете прогу, которая, анализируя системное время, говорит приятным женским голосом, сколько там натикало. Понятно, что для повышения качества голоса вам понадобиться попросить свою маму, подругу, жену, тещу, наконец, проговорить (в случае тещи прошипеть 🙂 ) все эти цифры на микрофон. Запись, конечно, вы сделаете с помощью Audacity. А теперь вопрос: «В каком формате вы сохраните эти звуковые файлы?». В wav? Тогда вы напросто увеличите дистрибутив своейпрограммы. В mp3? Но он запатентован, то есть за его использование тоже надо платить. Выход есть — сохраняй в формат ogg, качай заголовочные файлы для его использования — и будет тебе счастье.

Хочешь анимацию сделать? Надумал использовать Gif? Начинай сушить сухари. На него тоже есть патент. Твой выбор — Png.

Вывод. В наше непростое время все-таки можно и нужно честно трудиться.

Загляни на сайт http://www.aplusfreeware.com/, там много чего полезного по нашей тематике. Есть куча бесплатных программ, которые ничуть не хуже, чем их платные аналоги. Я уже встал на путь честного программистского труда, а ты?

xakep.ru

Идеология программирования под Windows

Идеология программирования под Windows

Под термином WINDOWS-программирование можно подразумевать все, что угодно, но в большинстве своем это означает "событийное" программирование. Именно эта концепция используется в Windows. Она кардинально отличается от того, как писались программы для DOS. Если в DOS программа представлялась единым целым и опрашивала в цикле клавиатуру, мышь, порты и пр. и в зависимости от того, нажата ли клавиша, передвинулась мышь, выполняла определенные действия. В Windows этот процесс опроса берет на себя сама система и если произошло какое-то действие (событие), то сообщает (посылает вашей программе сообщение) об этом. А программа фактически состоит из отдельных функций, каждая из которых обрабатывает определенные (клавиатура, мышь) сообщения и соответствующим образом реагирует на них (т.е. реагирует на событие). Очевидно, что события могут быть разными - это не только клавиатура и мышь, а например закрытие окна, изменение его размеров, завершение работы Windows, появление новых данных в буфере обмена и пр. Причем программа может реагировать только на определенные сообщения, а остальные, будут обработаны системой.

Наиболее важным моментом при программировании для Windows является интерфейс прикладного программирования - (Application Programming Interface, API) - это набор самых различных функций, с помощью которых приложение может взаимодействовать с Windows.

API содержит около 2000 функций! Кроме этого в него входит несколько сотен сообщений, макросов и предопределенных констант. С одной стороны все это облегчает работу программиста, а с другой требует изучения многих томов литературы. Но здесь же следует вспомнить, что из десятков тысяч слов русского языка средний человек использует от силы пять тысяч.

Win32 API реализован на следующих платформах: Win32s (интерфейс Win32s # свободно распространяемое подмножество API Win32, работающее под ОС Windows 3.x на процессорах 80386 и старше), Windows 95/98/NT/2000/XP/2003, Windows CE.

Все Win32-платформы содержат Win32-функции, а значит, можно вызывать любую из функций интерфейса Win32 API независимо от того на какой платформе компилируется приложение. Но реализация реализации рознь.

Все Win32-функции существовуют на каждой платформе, но поддерживаются на некоторых из них только частично.

Win32 API в основном состоит из трех компонентов: Kernel, User и GDI, которые обеспечивают интерфейс с базовой OS, управление окнами и приложениями и предоставляет поддержку графики.

    Знание WinAPI очень полезно, но в случае использования соответсвующих систем программирования не является обязательным. Если использовать Borlan Pascal или Borland С++, то знание API просто необходимо. В случае использования т.н. RAD-систем (системы быстрой разработки приложений), таких как Delphi, С++ Builder, Visual Basic, Visual C++ и им подобных знание WinAPI особо не требуется (но приветствуется). Все вышеперечисленные системы (а также множество других) являются ответом на вопрос "И где это делают?".

Программирование с применением API, представляет непростую задачу. Особенно трудоемким является процесс отладки таких программ. Поэтому все современные интегрированные средства программирования позволяют в значительной степени автоматизировать, написание таких программ. Но и здесь имеются свои проблемы. Для того чтобы разобраться, как написать самостоятельно программу с использованием API, достаточно изучить коды программ написанных другими программистами.

Основные общие свойства Windows-платформ.

Систему Windows часто называют операционной системой передачи сообщений. В основе системы лежит механизм, транслирующий практически каждое событие (нажатие клавиши, перемещение мыши, истечение времени таймера) в сообщение.

Типичное приложение построено на основе цикла сообщений, который принимает эти сообщения и отправляет их к соответствующим функциям – обработчикам сообщений. Хотя сообщения передаются приложениям, они адресованы не им, а другим основополагающим компонентам операционной системы – окнам.

С точки зрения пользователя, окно - это прямоугольная область экрана, которую занимает каждая программа Windows. Хотя одна программа может создать несколько окон, всегда имеется одно окно верхнего уровня, которое называется “главным окном” приложения.

С точки зрения программиста, окно - это самостоятельно существующий объект, параметры которого описаны в специальных структурах данных, а поведение функцией окна.

  • Окно – это гораздо больше, чем просто прямоугольная область на экране компьютера; оно представляет некую абстрактную сущность, через которую взаимодействуют пользователь и компьютер.

Приложения, потоки и окна

В многозадачных (но не многопоточных) операционных системах наименьшей единицей выполнения является задача или процесс. Механизм распределения задач в этих операционных системах переключается между этими задачами; многозадачность выполняется между двумя или более процессами.

В противоположность этому в многопоточной системе наименьшей единицей выполнения является поток, не процесс. Задача или процесс могут состоять из одного или более потоков (обычно один определяется как главный поток). Организация нового потока требует меньше системных ресурсов, потоки одного процесса имеют доступ к одному адресному пространству; переключение между потоками одного и того же процесса требует незначительных расходов ресурсов системы.

Типичное Win32-приложение состоит из одного или более потоков, которые выполняются параллельно (потоки можно понимать как многозадачность в рамках отдельного приложения, например, один поток обрабатывает данные, вводимые пользователем, в то время как другой поток занят передачей документа на принтер).

Поток, выполняющий какие-либо операции, не имеющий ни окон, ни очереди сообщений, ни цикла сообщений, называется обычно рабочим потоком, в противоположность более совершенному, обрабатывающему очередь сообщений потоку пользовательского интерфейса.

Все окна находятся в иерархической зависимости: некоторые из них являются окнами верхнего уровня, другие подчинены своим родительским окнам.

В Windows существует множество типов окон.

Самыми очевидными типами окон являются большие прямоугольные окна, связанные с приложениями, и диалоговые панели, которые можно переместить, изменить их размеры, максимизировать или минимизировать.

Менее очевидно, что многие элементы, отображаемые внутри главного или диалогового окна, сами по себе являются окнами.

Каждая кнопка, поле ввода, полоса прокрутки, окно списка, пиктограмма, даже фон экрана обрабатывается операционной системой как окно.

Классы окон

Основное поведение окна определяется классом окон. Класс окна (не путать с понятием “класс” языка программирования C++) несет информацию о начальном внешнем виде окна, пиктограмме по умолчанию, курсоре и ресурсе меню, связанном с окном; и, что, возможно, более важно – об адресе функции, называемой оконной процедурой.

Когда приложение обрабатывает сообщения, оно обычно делает это посредством вызова функции DispatchMessage для каждого принятого сообщения - это происходит в так называемом цикле сообщений. В свою очередь, функция DispatchMessage вызывает соответствующую оконную процедуру, проверяя, для какого класса окна предназначено сообщение. Именно эта оконная процедура (функция окна) действительно обрабатывает сообщение, переданное окну.

Функция окна анализирует это сообщение и его параметры, а затем, при необходимости, выполняет некоторые действия.

Можно считать, что единственная для каждого окна функция окна реализует все методы окна как объекта. В языке C++, напротив, каждый метод объекта (класс) реализуется отдельной функцией, называемой обычно функцией-членом. Для реализации методов функция окна анализирует сообщение и однозначно определяет нужный метол.

Рассмотрим, какие типы классов окон существуют.

Существует множество стандартных классов окон, предусмотренных самой операционной системой Windows. Эти системные глобальные классы реализуют функциональные возможности общих элементов управления.

Любое приложение может использовать эти классы в своих окнах; например, реализовать элемент управления – поле ввода, используя класс окна Edit.

Приложение также может определять собственные классы окон с помощью функции RegisterClass. Эта функция позволяет программисту реализовать поведение окна, не являющегося частью ни одного из поддерживаемых системой глобальных классов.

Например, таким образом, типичное приложение реализует функциональные возможности своего главного окна, регистрирует пиктограмму главного окна и ресурса меню.

В Windows предусмотрен механизм наследования. Он реализуется с использованием так называемых классов окна. Перед созданием окна, необходима регистрация класса окна.

Для каждого класса окна определяется функция окна. При создании окна необходимо указать, к какому классу окна оно будет принадлежать и, соответственно, какую функцию окна будет использовать для обработки сообщений. Приложения могут создавать собственные оконные классы окна и свои функции окна (и следовательно свои методы), или использовать стандартные, определенные в Windows классы окна.

Например, можно создать окно изображающее кнопку и для него определить функцию окна, которая будет обрабатывать сообщения от мыши. Эта функция будет обрабатывать сообщения, и рисовать кнопку в нажатом и отжатом состоянии. Но в Windows уже определен класс окна, соответствующий кнопке.

Типы сообщений

Существует много разновидностей сообщений, представляющих события на разных уровнях. Каждое простое событие, каждое простое действие посылается в виде сообщения окну для обработки.

Приложению приходит множество сообщений, однако приложение не должно заботиться о смысле каждого отдельного сообщения. Вместо обработки всех возможных сообщений приложение имеет свободу выбора; необработанные сообщения передаются в функции обработки сообщений операционной системы по умолчанию.

Приходящее приложению Windows-сообщение состоит из нескольких частей, для его представления используется структура MSG. Приведем описание структуры, применяющейся для представления сообщения, т.е. описывающей тип сообщения:

typedef struct tagMSG

{ HWND hwnd; // окно, которому посылается это сообщение

UINT message; // значение самого сообщение

WPARAM wParam; // для передачи дополнительной информации

LPARAM lParam; // для передачи дополнительной информации

DWORD time; // время, когда произошло событие

POINT pt; // точка, где произошло события (для мыши)

} MSG;

Элемент структуры hwnd однозначно идентифицирует окно, которому посылается это сообщение. Каждое окно в Windows имеет такой идентификатор. Элемент message идентифицирует само сообщение. Этот элемент может иметь сотни различных значений, означающих одно из многих сотен различных сообщений, которые могут получать приложения Windows.

Для идентификаторов сообщений обычно используются символьные представления (WM_PAINT, WM_TIMER), а не числовые значения. Эти символьные значения определены в стандартных файлах заголовков Windows (приложению необходимо включать в свой исходный текст только файл windows.h – он содержит директивы #include для остальных файлов).

Сообщения можно разделить на несколько групп в зависимости от их функций. Самой насыщенной группой сообщений является группа сообщений управления окнами. Символьные идентификаторы для этих сообщений начинаются с WM_. Эта группа настолько велика, что ее уместно еще раз разбить на категории. Эти категории включают:

  • сообщения DDE (dynamic data exchange),

  • сообщения буфера обмена (clipboard),

  • сообщения мыши,

  • сообщения клавиатуры,

  • сообщения неклиентской (non-client) области окна,

  • сообщения MDI (multiple-document interface),

  • и многие другие типы.

Перечисленные категории несколько неточны, не всегда строго определены; они просто служат для удобства программистов, чтобы можно было представить картину множества событий управления окнами. Множество сообщений WM_ также не фиксировано, оно растет по мере добавления новых возможностей операционной системы.

Другие группы сообщений связаны с определенными типами окон. Существуют сообщения, определенные для полей ввода, кнопок, списков, комбинированных списков, полос прокрутки, элементов просмотра списка деревьев и т.д. Эти сообщения за редким исключением обычно обрабатываются оконной процедурой окна элемента управления и редко представляют интерес для программистов приложений.

Приложения также могут определять собственные сообщения.

  • Первый способ пригоден только для случая, если сообщение пересылается между окнами (частями) одного и того же приложения. Для этого необходимо определить символическое имя нового сообщения при помощи директивы #define, например:

#define СимволическоеИмяОдногоСообщения (WM_USER+1)

#define СимволическоеИмяДругогоСообщения (WM_USER+2)

  • Вторым способом определения собственного сообщения является использование функции RegisterWindowMessage, которая возвращает уникальный идентификатор для сообщения. Использование собственных типов сообщений, полученных таким способом, позволяет частям приложения связываться между собой; разные приложения также могут обмениваться информацией таким способом. Однако для взаимодействия приложений доступны более мощные механизмы, например, отображаемые в память файлы.

Вызов функций Windows

Существование цикла сообщений – не единственный механизм, посредством которого приложение взаимодействует с Windows. Windows предлагает огромное количество системных вызовов для выполнения большого разнообразия задач, включая управление потоками, работу с окнами, обработку файлов, управление памятью, графический сервис, коммуникацию и много других функций.

Службы GDI. Функции GDI используются для выполнения основных независимых от устройства графических операций над контекстом устройства. Контекст устройства – это интерфейс для определенного графического устройства. Его можно использовать для получения информации об устройстве и выполнения графического вывода на это устройство. Информация, которая может быть получена через контекст устройства, содержит его подробное описание. Технология устройства (векторная или растровая), его тип, имя, разрещающая способность, цветовые возможности, возможности шрифтов – все это можно получить, вызвав контекст соответствующего устройства.

Службы пользователя. Модуль User (модуль пользователя) поддерживает системные вызовы для работы с элементами пользовательского интерфейса. Они включают в себя функции обработки окон, диалоговых панелей, меню, текстовых и графических курсоров, элементов управления, буфера обмена и многих других понятий. Именно благодаря функциям модуля User становятся доступными высокоуровневые компоненты пользовательского интерфейса.

Службы ядра системы. Службы ядра обычно относятся к категории управления файлами, памятью, процессами, потоками и ресурсами. Это не полный список, но все же эти категории описывают самые часто используемые функции модуля Kernel.

Другие API. Windows – это намного больше, чем возможности, реализованные в рассматриваемых выше трех основных модулях. Существует множество модулей, других API, каждый реализующий свое определенное множество функциональных возможностей. Рассмотрим кратко некоторые из наиболее широко используемых API.

  • Функции общих элементов управления используются для работы с новыми элементами управления (расширяющими множество стандартных элементов управления).

  • Общие диалоговые окна содержат поддерживаемые системой диалоговые окна для открытия файла, выбора цвета из цветовой палитры, выбора шрифта из множества инсталлированных в системе, определения операции поиска или поиска с заменой. Эти диалоговые окна можно использовать по умолчанию или их функции можно изменять через новые шаблоны диалоговых окон и оконных процедур.

  • MCI (multimedia control interface) предоставляет собой интерфейс управления средствами мультимедиа. Через функции MCI приложения легко могут получить доступ к видео-, аудио- и MIDI-возможностям Windows.Существует несколько групп функций, связанных с сетью: например, WinSock – библиотека Windows Sockets, WinInet – библиотека Windows Internet API и др.

Оконная функция – функция обратного вызова

Программисты хорошо знакомы с понятием вызова операционной системы для выполнения каких-то действий. Например, программисты на C используют функцию fopen для открытия файла. Библиотечные функции, поставляемые компилятором, содержат код, который фактически вызывает для открытия файла операционную систему. Здесь все просто. Но операционная система Windows ведет себя иначе.

Хотя в Windows имеется очень много доступных программисту функций, Windows также и сама посылает вызовы программе, особенно оконной процедуре. Оконная процедура связана с классом окна, который программа регистрирует с помощью вызова функции RegisterClass. Окно, создаваемое на основе этого класса, использует оконную процедуру для обработки всех сообщений окна. Windows посылает сообщения окну, вызывая оконную процедуру.

Рассмотрим примеры, когда Windows вызывает оконную процедуру:

  • первый раз при создании окна;

  • при последующем удалении окна;

  • при изменении размеров окна, при его перемещении, при его свертывании;

  • при выборе пункта меню;

  • при манипуляции с полосами прокрутки или с мышью;

  • чтобы сообщить ей о необходимости перерисовать рабочую область.

Все эти вызовы имеют форму сообщений. В большинстве Windows-программ основная часть программы направлена на обработку этих сообщений. Свыше 200 различных сообщений, которые Windows может отправить оконной процедуре, идентифицируются именами, которые начинаются с cимволов WM_ и определяются в заголовочных файлах Windows.

Фактически, идея функции, находящейся в программе, но которая вызывается не из самой программы, не является абсолютно новой в традиционном программировании. Функции signal в языке С может перехватить нажатие комбинации клавиш . В Windows эта идея расширена и пронизывает всю систему.

Любое событие, относящееся к окну, передается оконной процедуре в виде сообщения. Затем оконная процедура соответствующим образом реагирует на это сообщение или передает сообщение в функцию DefWindowProc для обработки его по умолчанию.

Синхронные и асинхронные сообщения

Итак, передача окну сообщений означает вызов операционной системой Windows оконной процедуры. Но в программах для Windows имеется и цикл обработки сообщений, который берет сообщения из очереди сообщений, вызывая функцию GetMessage, и отправляет их оконной процедуре, вызывая функцию DispatchMessage.

Одни и те же сообщения могут быть и синхронные (queued), и асинхронные (nonqueued). Синхронными сообщениями называются сообщения, которые Windows помещает в очередь сообщений программы, и которые извлекаются и диспетчеризируются в цикле обработки сообщений. Асинхронные сообщения передаются непосредственно окну, когда Windows вызывает оконную процедуру.

  • Говорят, что синхронные сообщения помещаются (отправляются) в очередь сообщений (post), а асинхронные посылаются прямо в оконную процедуру (send).

Структура программ для Windows очень проста, поскольку у них имеется только одно центральное место обработки сообщений. В результате оконная процедура получает все предназначенные для окна сообщения, как синхронные, так и асинхронные.

Синхронными становятся сообщения, в основном, тогда, когда они являются результатом пользовательского ввода путем нажатия клавиш (например, WM_KEYDOWN или WM_KEYUP), это символы, введенные с клавиатуры (WM_CHAR), результат движения мыши (WM_MOUSEMOVE) и щелчков кнопки мыши (WM_LBUTTONDOWN). Кроме этого, синхронные сообщения включают в себя сообщения таймера (WM_TIMER), сообщение о выходе из программы (WM_QUIT), а также все сообщения, которые помещаются в очередь сообщений посредством вызова приложением функции PostMessage.

Сообщения становятся асинхронными во всех остальных случаях. Часто асинхронные сообщения являются результатом вызова определенных функций Windows или непосредственным результатом вызова функции SendMessage.

Очевидно, что процесс этот сложен, но, большая часть сложностей ложится на Windows, а не пользовательские программы.

С позиции оконной процедуры совершенно не важно, для обработки какого сообщения и кем она вызвана. Оконная процедура может что-то сделать с этими сообщениями, а может и проигнорировать их. По этой причине оконную процедуру назвали конечным пунктом обработки (ultimate hook). Сообщения извещают оконную процедуру почти обо всем, что влияет на окно.

Например, когда WinMain вызывает функцию CreateWindow, Windows отправляет оконной процедуре асинхронное сообщение WM_CREATE. КогдаWinMain вызывает UpdateWindow, Windows отправляет оконной процедуре асинхронное сообщение WM_PAINT.

Сообщения не похожи на аппаратные прерывания. Во время обработки в оконной процедуре одного сообщения программа не может быть прервана другим сообщением. Только в этом случае, если оконная процедура вызвала функцию, которая сама стала источником нового сообщения, то оконная процедура начнет обрабатывать это новое сообщение еще до того, как функция вернет управление программе.

Цикл обработки сообщений и оконная процедура работают не параллельно. Когда оконная процедура обрабатывает сообщение, то это результат вызова функции DispatchMessage в WinMain. DispatchMessage не завершается до тех пор, пока оконная процедура не обработала сообщение.

Часто возникает необходимость того, чтобы оконная функция сохраняла информацию, полученную в сообщении, и использовала ее при обработке другого сообщения. Тогда эту информацию следует описывать в оконной процедуре в виде статических переменных, либо хранить в глобальных переменных.

Разделение аппаратных ресурсов

Одним из наиболее существенных свойств Windows является то, что под его управлением можно одновременно запускать на выполнение несколько программ. Различные приложения делят между собой эти ограниченные ресурсы, распределение которых осуществляет операционная оболочка Windows.

Программируя для Windows, нельзя забывать о том, что все аппаратные ресурсы являются разделяемыми, и для их правильного использования следует придерживаться определенных правил.

Так, если программа для MS-DOS имеет доступ ко всей свободной оперативной памяти и может обращаться к этой памяти так, как захочется программисту, то в Windows, где одновременно может выполняться несколько программ, память является разделяемым ресурсом.

Другим примером разделяемого ресурса является дисплей. Программируя в MS-DOS, можно в любой момент переключить режим видеоадаптера, изменить цвет или даже напрямую обратится контроллеру и что-то записать в видеопамять. Такая техника полностью исключается при программировании в Windows. Дисплей - разделяемый системный ресурс, и обращаться к нему можно только так, как позволяет Windows.

Одной из основных целей создателей Windows являлось обеспечение визуального доступа к большинству приложениям одновременно. Для этого каждому приложению выделяется часть экрана для взаимодействия с пользователем. В Windows каждое приложение в любой момент времени имеет доступ к определенной части экрана. Таким образом, экран в Windows - разделяемый ресурс, средством разделения которого является окно приложения.

Итак, два важных вывода.

Во-первых, загруженная на выполнение программа не забирает на себя полностью все ресурсы - эти ресурсы выделяются приложению при помощи специальных механизмов.

Во-вторых, в каждый момент времени программа не знает, какая именно область экрана принадлежит окну приложения, поскольку пользователь в любой момент может переместить окно и изменить его размеры (для определения координат окна нужно обратиться к специальной функции Windows).

 

www.metod-kopilka.ru

Программируем на C. Установка и настройка компилятора СИ и С++ на windows по взрослому ⋆ SLUSAR.SU

Программируем на сиМногие советую начинать свой путь в программирование именно с этого языка, когда-то созданного для UNIX, но в последствии захватившем все ОС.Если вы знаете язык программирования Си, то вам не составит труда освоить такие языки, как С++, С#, Java и т.д. Он довольно легкий и удобный, именно поэтому так популярен среди программистов и хакеров.Сегодня мы будем устанавливать компилятор языков Си и С++, писать нашу первую программу и компилировать ее в консоли. Меньше слов, больше инструкций. приступим.

Заходим на сайт mingw.org и скачиваем инсталлятор, для участников лиги лени вот прямая ссылка http://sourceforge.net/projects/mingw/files/latest/download?source=files.Далее устанавливаем, при этом НЕ меняя путь установки, т.е. C:\WinGW.Во время установки загружаются все необходимые файлы, поэтому необходимо иметь подключение к интернету.По окончании установки запускаем программу и выбираем необходимые компоненты для установки, а именно:mingw32-bace // компилятор Сиmingw32-gcc-g++ //компилятор С++установка компилятора Си и С++Далее в верхнем меню выбираем Installation и выбираем Apply Changes и в появившемся окне жмём Apply, после чего подгрузятся и установятся компиляторы.Проверяем наличие компиляторов после установки, зайдя в папку C:\WinGW\bin\, в частности нам нужен gcc. Ок, компилятор на месте, приступим к прописыванию системного пути к нему.Жмём Пуск -> Панель Управления -> Система -> Дополнительные параметры системы -> во вкладке «дополнительно» внизу жмем «Переменные среды». Выделяем PATH и жмем изменить.Системный путь к компилятору С++Переходим в конец строки «Значение переменной» и после точки с запятой прописываем относительный адрес к папке с компиляторами C:\WinGW\bin и все, без никаких знаков вконце и жмем ОК на всех окнах.

Все компиляторы установлены и настроены. В следующей статье мы напишем нашу первую программу.

Просмотры: 4 596

slusar.su