- Энциклопедия
- Разное
- Операционная система windows
Операционная система компьютера является самой главной его составляющей это то, что делает «компьютерное железо» умный. Самой распространенной операционной системой является система windows. В свое время в США зародилась компания Microsoft, которая и создала эту удивительную операционную систему. Сейчас это уже не компания, а мировая корпорация.
Windows начала быстро распространятся и набирать обороты по всему Земному шару, потому что она имела очень приятный дизайн и интерфейс. Главной ее отличительной особенностью стала скрытность исходного кода, то есть пользователь не видел коды написания программ. Именно так появился рабочий стол и цветовые палитры различных программ. В девяностых годах прошлого столетия это был огромный прорыв компьютерных технологий, так как новоиспеченная операционная система позволяла открывать одно программу поверх другой. В современное время этим некого не удивишь, современный персональный компьютер способен открыть хоть десять программ одновременно.
В далеком 1981 году зародилась компания Microsoft. Первым делам она купила лицензию и сходный код другой операционной системы, которая называлась Seattle Computer products. Microsoft не пыталась доработать эту операционную систему, а наоборот создать собственную, которая не будет похожа предыдущую. В этот же год началась плодотворная работа. Windows создавалась не на основе существующей операционной системе, а именно в ней. Компания разработала собственную программу для написания операционных систем. Именно таким методом появилась первая версия Windows. Первые труды были без успешными, так как операционная система сильно опережала существующие комплектующие компьютеров. То есть Windows была слишком мощной для компьютеров. Спустя несколько лет на рынке появились достойные запчасти для компьютеров. Именно в этот момент в компьютерную гонку вступает Windows. Дебютной версия называется Windows 0.1.
Однако она продержалось не долго, так как была выпущена «на скорую руку». Ее интерфейс сильно отставал от аналогов конкурентов. Спустя несколько лет с этого момента, мир снова содрогнулся от новейшей операционной системы. На рынке появилась система Windows 3.0. В ней были все стандартные приложения, которые есть на современных компьютерах. На борту появились мощные комплектующие, которые ускоряли работу процессора и улучшали цветопередачу монитора. Именно после выхода этой ОП, Microsoft официально закрыла исходный код системы. Теперь нельзя переделовать и дополнять ОП обычным пользователям. После этого разорились множество компаний, которые выпускали усовершенствованный Windows. Этот шаг был вынужденным, так как на рынке появилось множество «пиратских версий системы», которые выдавались за оригинал.
На сегодняшний день, Windows является ведущей операционной системой для домашнего компьютера. Максимально ее версией является Windows 10.
Операционная система windows
Популярные темы сообщений
- Бабочка Траурница
Самым красивым представителем среди семейства нимфалид считается бабочка траурница. Бабочку можно встретить в период с мая по июнь и с августа по сентябрь. Хотя чаще всего она живет все лето. Когда начинается весна, где-то в апреле
- Художественное мышление в авангарде науки
Без сомнения, открытые новых, доселе неведомых фактов и предсказание будущего является далеко не основополагающей задачей искусства. Однако существует некое количество исторических примеров,
- Тушканчик
Тушканчик очень маленькое животное, которое можно отнести к отряду грызунов. Они могут обитать где угодно. Это может быть регионы, где преобладают степи, пустыни или полупустыни. Получается, что этот вид животного может свободно приспосабливаться
- Достопримечательности Москвы
Москва является одним из самых красивых городов не только России, но и мира. Она всегда привлекала туристов, как взрослых, так и маленьких. Конечно, взрослому человеку здесь открывается больше возможностей, что посмотреть и куда отправиться,
- Нарцисс
Кто такой нарцисс? Нарцисс – это красивый цветок, которого выращивают уже очень много веков. Он прорастает из маленькой луковички и радует глаз своими жёлтыми или белыми цветами.
Детище Microsoft
Microsoft Corporation,
широко известная как Microsoft,
— американская многонациональная технологическая компания, основанная
Биллом Гейтсом и Полом Алленом 4 апреля 1975 года. Штаб-квартира компании
расположена в Редмонде, штат Вашингтон.
Компания впервые стала известна благодаря разработке и
продаже дисковой операционной системы Microsoft (MS-DOS), которая использовалась
в персональных компьютерах IBM.
Однако 1985 году Microsoft
выпустила Windows,
которая быстро стала доминирующей операционной системой для персональных
компьютеров и сделала ее лидером рынка.
На протяжении 1990-х и 2000-х годов Microsoft продолжала доминировать на
рынке персональных компьютеров именно благодаря своей операционной системе Windows и пакету программного
обеспечения Office.
Сейчас Microsoft
является одной из крупнейших технологических компаний в мире с рыночной
капитализацией более 2 триллионов долларов. В компании работает более 181 000
сотрудников по всему миру, а ее деятельность осуществляется в более чем 190
странах.
С чего все началось
История операционной системы Windows началась в начале 1980-х
годов, когда соучредитель компании Microsoft Билл Гейтс осознал потенциал
графических пользовательских интерфейсов (GUI) в вычислительной технике. Он
представлял себе удобную операционную систему, которая могла бы работать на
IBM-совместимых персональных компьютерах.
В 1983 году компания Microsoft начала разработку
операционной системы на основе графического интерфейса пользователя под
названием Windows, которая должна была работать поверх существующей
операционной системы MS-DOS. Первая версия, Windows 1.0, была выпущена в 1985
году и имела простой интерфейс с плиточными окнами, выпадающими меню и системой
навигации с помощью мыши.
Windows 2.0 была выпущена в 1987 году и содержала
значительные усовершенствования, включая возможность перекрытия окон и улучшенные
графические возможности. За ней последовала Windows 3.0 в 1990 году, которая
стала первой широко успешной версией Windows, было продано более 10 миллионов
копий.
Windows 95 была выпущена в 1995 году и стала важной вехой в
истории операционной системы Windows. В ней появились знаковое меню «Пуск» и
панель задач, которые стали неотъемлемой частью пользовательского интерфейса
Windows. Она также отличалась повышенной производительностью и стабильностью, а
также поддержкой оборудования Plug and Play.
Последующие версии Windows: Windows 98, Windows 2000 и
Windows NT — продолжали развивать эти улучшения и добавляли
новые функции, такие как подключение к Интернету и улучшенные мультимедийные
возможности.
В 2001 году компания Microsoft выпустила Windows XP, которая
представляла собой значительную переработку операционной системы и ввела ряд
новых функций, включая переработанный пользовательский интерфейс, улучшенную
производительность и встроенную поддержку беспроводных сетей.
С тех пор Microsoft продолжает выпускать новые версии
Windows, включая Windows Vista, Windows 7, Windows 8, Windows 10 и Windows 11.
Каждая новая версия привносит новые функции и улучшения.
Сегодня Windows — самая распространенная операционная
система в мире, насчитывающая более 1,3 миллиарда активных пользователей.
Развитие пользовательского интерфейса
За прошедшие годы интерфейс Windows претерпел множество
изменений, предлагая пользователям все больше удобств.
Windows 1.0 (1985): Первая версия Windows имела простой
графический интерфейс пользователя (GUI), который позволял пользователям
использовать мышь для навигации по меню и открытия программ.
Windows 95 (1995): В этой версии появилось знаковое меню «Пуск»,
которое позволяло пользователям быстро открывать программы и файлы. В ней также
появилась панель задач, которая отображала запущенные программы и позволяла
пользователям переключаться между ними.
Windows XP (2001): В Windows XP были переработаны меню «Пуск»
и панель задач, которые имели более современный вид. В ней также были
представлены визуальные стили, которые позволяли пользователям настраивать
внешний вид операционной системы.
Windows Vista (2006): В Vista был значительно переработан
пользовательский интерфейс с новой темой Aero, включающей полупрозрачные окна и
анимацию. В ней также появилась боковая панель, которая позволяла пользователям
добавлять и настраивать гаджеты.
Windows 7 (2009): Windows 7 усовершенствовала тему Aero,
представленную в Vista, улучшила производительность и добавила новые функции,
такие как Jump Lists, которые обеспечивали быстрый доступ к часто используемым
файлам.
Windows 8 (2012): Windows 8 существенно отличается от
предыдущих версий Windows, представляя собой интерфейс, ориентированный на
сенсорное управление и оптимизированный для планшетов и других сенсорных
устройств. Меню «Пуск» было заменено полноэкранным экраном «Пуск» с живыми
плитками, отображающими информацию и обновления приложений.
Windows 10 (2015): Windows 10 объединила традиционный
интерфейс рабочего стола с сенсорно-ориентированным дизайном Windows 8, вновь
представив меню «Пуск» и добавив новые функции, такие как Task View и
виртуальные рабочие столы. В ней также была представлена система Fluent Design
System, которая обеспечивает более современный и последовательный внешний вид и
ощущение на различных устройствах и в приложениях.
Windows 11 (2021): появился новый вариант многозадачности с
большим количеством окон, обновленный проводник имеет современный и более
чистый вид с новыми элементами дизайна пользовательского интерфейса, появились
макеты прикрепления с двумя колонками для упрощения многозадачности. Также Windows
11 поддерживает анимированный фон экрана блокировки на компьютерах, оснащенных
акселерометром.
Провалы и неудачи
Хотя у каждой версии Windows есть свои сильные и слабые
стороны, некоторые считаются неудачными и провалились в продажах. Обычно к ним
относят следующие версии:
Windows ME (Millennium Edition): выпущенная в 2000 году,
Windows ME страдала от проблем со стабильностью и совместимостью, ее
критиковали за низкую производительность, частые сбои и отсутствие новых
функций. Она не была хорошо принята критиками и потребителями, и считается
одной из худших версий Windows.
Windows Vista: хотя Vista внесла несколько значительных
улучшений по сравнению со своей предшественницей, Windows XP, она также
страдала от проблем с производительностью и совместимостью, а также от высоких
системных требований. Vista критиковали за медлительность, ошибки и отсутствие
новых интересных функций, что заставило многих пользователей отказаться от нее
или перейти на Windows XP.
Windows 8: Ориентируясь на удобные сенсорные интерфейсы и
мобильные устройства, Windows 8 значительно отличалась от предыдущих версий
Windows и столкнулась с критикой со стороны пользователей, которые сочли новый
интерфейс запутанным и сложным в использовании на настольных компьютерах и
ноутбуках. Отказ от традиционного меню «Пуск» и ставка на начальный экран также
вызвали критику.
Стоит отметить, что даже в этих версиях были свои сильные
стороны и были представлены некоторые инновационные функции, но они не были
приняты пользователями.
Особенности системы
Операционная система Windows имеет различные особенности,
которые делают ее популярной и широко используемой. Вот некоторые из них:
Пользовательский интерфейс: Windows предоставляет
графический интерфейс пользователя (GUI), который прост в использовании и
настраивается. Пользователи могут легко перемещаться по различным приложениям и
настройкам.
Многозадачность: Windows позволяет пользователям запускать
несколько приложений одновременно, что облегчает переключение между различными
программами.
Управление файлами: Windows имеет мощную систему управления
файлами, которая позволяет легко организовывать, искать и извлекать файлы.
Совместимость: Windows совместима с широким спектром
аппаратного и программного обеспечения, что облегчает поиск совместимых
устройств и приложений.
Безопасность: Windows имеет встроенные функции безопасности,
такие как антивирус и брандмауэр, которые помогают защитить пользователей от
вредоносных программ и других угроз безопасности.
Регулярные обновления: Windows регулярно обновляется для
повышения производительности, исправления ошибок и добавления новых функций.
Универсальные приложения: Windows имеет платформу
универсальных приложений, которая позволяет разработчикам создавать приложения,
которые могут работать на различных устройствах, включая ПК, планшеты и
смартфоны.
Cortana: Cortana — это персональный цифровой помощник,
который может помочь пользователям в решении различных задач, таких как
установка напоминаний, планирование встреч и поиск информации в Интернете.
Microsoft Store: Microsoft Store — это цифровой магазин, где
пользователи могут загружать приложения, игры и другой контент.
Игры: Windows также является популярной платформой для игр,
поддерживая DirectX и другие игровые технологии.
Модели распространения
Microsoft использует различные модели коммерческого
распространения своей операционной системы Windows, включая:
Розничная торговля: Windows можно приобрести в розничных
магазинах в виде коробочных пакетов программного обеспечения, включающих
установочные диски и лицензионные ключи.
OEM (Original Equipment Manufacturer): Windows
предустановлена на компьютерах и устройствах, продаваемых такими
производителями, как Dell, HP и Lenovo. Эти производители приобретают лицензии
на Windows у Microsoft и устанавливают операционную систему на свои устройства,
прежде чем продавать их потребителям.
Объемное лицензирование: Эта модель предназначена для
предприятий и организаций, которым необходимо установить Windows на несколько
компьютеров. Microsoft предлагает лицензии на объем, которые позволяют
организациям устанавливать Windows на определенное количество устройств, как
правило, по более низкой цене за лицензию, чем розничные или OEM-лицензии.
Подписка: Microsoft предлагает модель Windows на основе
подписки под названием Microsoft 365, которая включает доступ к операционной
системе, приложениям Microsoft Office и другим облачным сервисам. Эта модель
предназначена для предприятий и частных лиц, которые хотят вносить ежемесячную
или ежегодную плату за доступ к программному обеспечению и услугам Microsoft.
В целом, модели коммерческого распространения Windows
позволяют Microsoft охватить широкий круг клиентов, от индивидуальных
потребителей до крупных организаций, предлагая различные варианты ценообразования
и лицензирования.
В России сейчас есть определенные затруднения с покупкой
лицензий, но они преодолимы.
Альтернативы – преимущества и недостатки
Windows, Linux и MacOS — три популярные операционные
системы, используемые частными лицами и предприятиями по всему миру. Каждая из
них имеет свои уникальные особенности и характеристики, которые отличают ее от
других. Вот некоторые ключевые различия между Windows, Linux и MacOS, а также
их преимущества и недостатки.
Пользовательский интерфейс:
Одно из самых значительных различий между тремя
операционными системами — это пользовательский интерфейс. Windows известна
своим простым и легким в использовании интерфейсом, который делает ее удобной
для начинающих пользователей. Linux, с другой стороны, предлагает настраиваемый
интерфейс, который может быть настроен по вкусу пользователя. MacOS имеет
изящный и минималистичный интерфейс, в котором основное внимание уделяется
эстетике и простоте использования.
Открытый исходный код против закрытого:
Linux — это операционная система с открытым исходным кодом,
что означает, что исходный код доступен для всех желающих, его можно свободно
просматривать, изменять и распространять. Windows и MacOS являются
операционными системами с закрытым исходным кодом, что означает, что исходный
код недоступен для общественности.
Доступность программного обеспечения:
Windows имеет самую большую библиотеку программного
обеспечения и поддержку, так как это самая распространенная операционная
система в мире. MacOS имеет меньшую библиотеку программного обеспечения, но она
предлагает высококачественное программное обеспечение, оптимизированное для
этой платформы. Linux имеет обширную коллекцию программного обеспечения с
открытым исходным кодом, но найти совместимое с ней коммерческое программное
обеспечение может быть сложнее.
Безопасность:
Windows считается наиболее уязвимой для вирусов и
вредоносных программ, что делает ее частой мишенью для хакеров. MacOS известна
как более безопасная, чем Windows, но и она не полностью защищена от угроз
безопасности. Linux — самая безопасная из трех систем, с меньшим количеством
уязвимостей в безопасности благодаря своей природе с открытым исходным кодом,
что позволяет чаще получать исправления и обновления.
Совместимость оборудования:
Windows совместима с широким спектром аппаратного
обеспечения, что делает ее популярной среди геймеров и пользователей, которым
требуется высококлассное оборудование. MacOS имеет ограниченный спектр
аппаратных возможностей, поскольку она доступна только на устройствах Apple.
Linux имеет ограниченную совместимость с оборудованием, но популярен для работы
на старых машинах и серверах.
Преимущества Windows:
Большая библиотека программного обеспечения и поддержка
Удобный интерфейс
Совместимость с широким спектром аппаратных средств
Широко используется и знакома многим пользователям
Недостатки Windows:
Уязвимость к вирусам и вредоносным программам
Закрытый исходный код
Ограниченные возможности настройки
Преимущества MacOS:
Изящный и минималистичный интерфейс
Высококачественное программное обеспечение
Повышенная безопасность по сравнению с Windows
Интеграция с устройствами Apple
Недостатки MacOS:
Ограниченная совместимость с аппаратным обеспечением
Меньшая библиотека программного обеспечения
Закрытый исходный код
Преимущества Linux:
Код с открытым исходным кодом
Высоко настраиваемый интерфейс
Более безопасный, чем Windows и
MacOS
Свободен в использовании и распространении
Недостатки Linux:
Ограниченная совместимость с коммерческим программным
обеспечением
Может быть более сложным для начинающих пользователей
Ограниченная совместимость с аппаратным обеспечением
Перспективы развития Windows
Основываясь на отраслевых тенденциях, можно сделать
предположения о направлениях развития Windows.
Интеграция облака: Microsoft продвигает интеграцию облака с
Windows, облегчая пользователям доступ к облачным службам прямо с рабочего
стола. Сюда входят такие функции, как интеграция OneDrive, поддержка Azure
Active Directory и Windows Virtual Desktop.
Безопасность: В связи с ростом числа кибератак компания
Microsoft уделяет большое внимание повышению безопасности Windows. Сюда входят
такие функции, как распознавание лица Windows Hello, улучшенная биометрическая
аутентификация и интеграция с Microsoft Defender for Endpoint.
Интеграция искусственного интеллекта: Microsoft работает над
интеграцией искусственного интеллекта в Windows, чтобы обеспечить более
интеллектуальный и персонализированный опыт для пользователей. Сюда входят
такие функции, как Cortana, виртуальный помощник на базе ИИ, который может
помочь пользователям в решении задач, и платформа Windows AI, которая
предоставляет разработчикам инструменты для создания интеллектуальных
приложений.
Интеграция между устройствами: Microsoft работает над
созданием более унифицированного опыта работы на различных устройствах, включая
ПК с Windows, планшеты и смартфоны. Это включает в себя такие функции, как
приложение Your Phone, которое позволяет пользователям получать доступ к своему
смартфону с ПК, и Windows Timeline, которая обеспечивает временную шкалу
действий на разных устройствах.
Пользовательский интерфейс: Microsoft вносит изменения в
пользовательский интерфейс Windows, чтобы сделать его более современным и
удобным. Сюда входит внедрение системы Fluent Design System, которая
обеспечивает более плавный и интуитивно понятный интерфейс, а также добавление
темного режима, который снижает напряжение глаз и увеличивает время автономной
работы на устройствах с OLED-экранами.
Это лишь несколько примеров направлений развития Windows.
Microsoft постоянно развивает и адаптирует Windows для удовлетворения
меняющихся потребностей пользователей и технологического ландшафта.
Время на прочтение
11 мин
Количество просмотров 67K
Несколько дней назад в сеть просочился образ ранней версии Windows 11. Различные издательства провели тесты по производительности и пришли к неутешительному выводу: Windows 11 в среднем работает хуже, чем Windows 10. Но расстраиваться рано! Проблемы производительности могут быть связаны с «сыростью» слитого образа и нюансами совместимости с текущими программами. Так или иначе, 24 июня состоится официальная презентация нового поколения операционных систем Windows, которая, возможно, даст ответы на многие вопросы. Если сегодня у вас есть настроение для ностальгии, предлагаем вам окунуться в мир Windows: познакомиться с историей, как менялась ось и что у нее внутри.
История Windows
В начале 80 годов прошлого века компания IBM работала над персональным компьютером на базе процессора Intel 8088. С середины 70 годов компания Microsoft была основным поставщиком Basic для восьмибитных микрокомпьютеров. Когда IBM обратилась к Microsoft для лицензирования Basic для их нового компьютера IBM PC, Microsoft согласилась, а также посоветовала обратиться к компании Digital Research для лицензирования операционной системы CP/M. Но, получилось так, что глава Digital Research не нашел в своем графике времени для встречи для IBM, и IBM снова обратилась к Microsoft, теперь уже с просьбой решить вопрос операционной системы для IBM PC. Microsoft купила клон ОС CP/M у компании Seattle Computer Products и перенесла её на IBM PC. Итоговым названием получившейся ОС стало MS-DOS 1.0.
IBM PC
Первые продукты с названием «Windows» от Microsoft не были операционными системами. Это были графические среды для MS-DOS. На фоне успеха, в том числе и коммерческого, пользовательского интерфейса на Apple Lisa, компания решила реализовать графический интерфейс на IBM PC с MS-DOS. В отличии от относительно дешевых IBM PC, Apple Lisa стоили дорого (почти 10 тысяч долларов), и немногие покупатели могли позволить купить их. Microsoft решила занять нишу дешевых компьютеров с графическим интерфейсом. При этом низкая стоимость достигалась экономией на комплектующих и более низкая производительность, по сравнению с Lisa, избежать не получилось. Так, в 1985, 1987 и в 1990 выходят первые три версии Windows — 1.0, 2.0 и 3.0. Причем за первые шесть месяцев после релиза Windows 3.0 было продано более 1 миллиона экземпляров. Дальнейшее развитие Windows можно разделить на два направления — Windows на базе MS-DOS и Windows на базе NT.
Windows 1.01
Windows 9x
Windows на базе MS-DOS или Windows 9x не были первыми ОС от Microsoft, но они продолжали «старые традиции» и были построены на основе 16-битного кода MS-DOS. В августе 1995 года была выпущена Windows 95 — первая система семейства Windows 9x. Она уже была полноценной операционной системой с соответствующими возможностями. Однако у системы были проблемы с безопасностью (например, не было «администратора») и с изоляцией приложений. Зависание 16-битного приложения приводило к блокировке всей системы. Проблемы со стабильностью достались и Windows 98 и Windows ME, которые отличались от выпуска 95 года рядом небольших обновлений.
Windows 95
Windows NT
В целом, к концу 80-х годов в Microsoft появилось понимание о необходимости разработки операционной системы не на базе MS-DOS. Параллельно с разработкой софта, связанного с MS-DOS, Microsoft наняла команду инженеров из компании DEC для разработки новой 32-битной операционной системы. Главой группы стал Дэйв Катлер — один из главных разработчиков ОС VMS. Новая система была названа NT — от сокращения New Technology. Основной упор при разработке NT делался на безопасность и надежность системы, а также на совместимость с Windows на MS-DOS. Так получилось, что опыт при разработке VMS повлиял на NT и сходство между ними стало причиной спора между DEC и Microsoft. По итогу спор был решен во внесудебном порядке.
Дэйв Катлер
Первая система Windows называлась Windows NT 3.1 и была выпущена в 1993 году. Это была первая ОС от Microsoft. Индекс 3.1 был выбран для соответствия Windows 3.1 на MS-DOS. Эта версия не имела особого успеха. Для NT требовалось больше памяти, 32-разрядных приложений на рынке было мало, возникали проблемы с совместимостью драйвером. Достичь поставленных целей смогли в NT 3.5. А первым серьезным обновлением для NT стала версия 4.0 в 96 году. Теперь эта система была мощна, надежна и безопасна, а также обеспечивала тот же интерфейс, что и Windows 95 (которая к тому моменту была чрезвычайно популярной).
Windows NT 3.1
В 2000 году вышла новая версия Windows — Windows 2000. Она развивала идеи, заложенные в системы NT. Был добавлена технология Plug-and-Play, управление электропитанием и улучшен интерфейс пользователя.
Windows 2000
Успех Windows 2000 задал вектор развития для следующего поколения — Windows XP. В «хрюшке» Microsoft улучшила совместимость, интерфейс стал более дружелюбным. Стратегия Microsoft завоевывать аудиторию уже знакомыми системами дала плоды — за несколько лет Windows XP была установлена на сотнях миллионах ПК. Эпоха MS-DOS подошла к концу.
Windows XP
Следующий проект Microsoft пал жертвой собственных амбиций. Через пять лет после Windows XP, в 2006 году на свет вышла Windows Vista. В ней был переделан графический интерфейс, переработаны и добавлены функциональные возможности в плане безопасности. Была улучшена производительность, надежность.
Первоначальные планы Microsoft по поводу Vista были настолько обширны, что через несколько лет после начала разработки проект пришлось сильно ограничить. Vista включала в себе 70 миллионов строк кода, часть которого составлял «причесанный» код XP. Неудача Vista отчасти с тем, что она вышла не в то время. На 2006 год пришелся бум недорогих компьютеров, которые не могли обеспечить достаточную для Vista производительность.
Windows Vista
Проблемы Vista были учтены при разработке Windows 7. Microsoft уделила большее внимание тестированию и производительности новой системы. Windows 7 быстро вытеснила Vista, а затем и XP, став самой популярной версией Windows до появления Windows 10 (сейчас Windows 7 на втором месте по популярности).
Windows 7
Бум смартфонов в начале 2010-х подтолкнул Microsoft к созданию операционной системы, которую можно было бы развернуть на разных устройствах: на телефонах, планшетах, приставках и т. д. В результате этой работы мир узрел Windows 8. «Восьмерка» построена на модульном подходе MinWin для получения небольшого ядра ОС, которое можно было бы расширить на линейку других типов устройств. Но аудитория встретила холодно такой подход. Многие люди критиковали «смартфоноподобный» интерфейс на ПК, отсутствие кнопки пуск. Для решения многих проблем Microsoft выпустила обновление под названием Windows 8.1, которая, помимо исправления имеющихся ошибок, добавила новые функции.
Windows 8.1
И вот, к 2015 году Microsoft выпускает Windows 10. При разработке Microsoft продолжала развитие идеи единой системы для разных устройств. В «десятке» появилась голосовая помощница Кортана, вернули меню «Пуск», улучшена системная безопасность.
Технические аспекты
Чтобы осветить все технические аспекты и тонкости операционной системы Windows понадобится не менее 1000 страниц. Для особо любопытных советуем 7-е издание «Внутреннего устройства Windows« Марка Руссиновича, специалиста по внутреннему устройству Windows. Также можно почитать «Современные операционные системы« Эндрю Таненбаума и «Operating System Concepts«: в обеих книгах есть главы, посвященные Windows. Здесь же ограничимся рассмотрением инструментов взаимодействия приложений пользователя с операционной системой (Windows API) и архитектуры «оси».
Архитектура
Во многих многопользовательских операционных системах сама ОС отделяется от приложений. Код ядра ОС выполняется в привилегированном режиме процессора (режим ядра). Для него доступны системные данные и оборудование. В непривилегированном режиме (пользовательский режим) выполняется код приложений. Ему предоставляется ограниченный набор интерфейсов и ограниченный доступ к системным данным. Прямой доступ к оборудованию заблокирован. При вызове программой пользовательского режима системной функции процессор выполняет специальную команду, переключающую вызывающий поток (последовательность команд внутри процесса, планируемая Windows для исполнения) в режим ядра. Когда системная функция завершается, операционная система переключает контекст потока обратно в пользовательский режим и дает возможность вызывающей стороне продолжить работу.
Windows считается операционной системой с гибридным ядром. С одной стороны компоненты ядра Windows располагаются в вытесняемой памяти и взаимодействуют друг с другом путем передачи сообщений, как в микроядерных системах. С другой стороны ядро слишком велико (более 1 Мбайт), а большая часть кода ОС и кода драйверов устройств использует одно защищенное пространство памяти защищенного режима, что свойственно монолитным ОС. Это означает, что в теории любой компонент ОС или драйвер устройства может повредить данные, используемые другими системными компонентами. В Windows эта проблема решается за счет повышения качества и контроля происхождения сторонних драйверов через такие программы, как WHQL или KMCS. Одновременно применяются дополнительные технологии защиты ядра, такие как безопасность на базе виртуализации, функции Device Guard.
Рассмотрим ключевые системные компоненты, формирующие архитектуру системы. На рисунке ниже представлена упрощенная схема, на которой опущены некоторые элементы, например, сетевые компоненты и различные уровни драйверов. Первое, на что стоит обратить внимание — это линия, разделяющая части пользовательского режима и режима ядра. Как упоминалось выше, потоки пользовательского режима выполняются в закрытом адресном пространстве процессов. На время выполнения в режиме ядра они получают доступ к системному пространству. Таким образом, системные процессы, пользовательские процессы, процессы служб и подсистемы среды обладают собственным закрытыми адресными пространствами.
Упрощенная схема архитектуры Windows
Вторая линия разделяет компоненты режима ядра и гипервизор (Hyper-V). Гипервизор перехватывает многие привилегированные операции, выполняемые ядром, и эмулирует их таким образом, чтобы позволить на одной и той же машине одновременно работать нескольким операционными системам. Гипервизор работает на том же уровне привилегий процессора (0), что и ядро. Но из-за использования специализированных команд процессора (VT-x у процессоров Intel, SVM у АMD) он может изолироваться от ядра с сохранением контроля над ним и приложениями. Поэтому некоторые иногда применяют термин «кольцо -1».
Четыре базовых типа процессов пользовательского режима:
- Пользовательские процессы. Эти процессы относятся к одному из следующих типов: 32- или 64-разрядные приложения Windows (приложения Windows Apps, работающие на базе среды Windows Runtime в Windows 8 и выше, включаются в эту категорию), 16-разрядные приложения Windows 3.1, 16-разрядные приложения MS-DOS, 32- и 64-разрядные приложения POSIX. Заметим, что 16-разрядные приложения могут выполняться только в 32-разрядных версиях Windows, а приложения POSIX в Windows 8 уже не поддерживаются.
- Процессы служб. В эту категорию входят процессы, являющиеся хостами для служб Windows (например, службы планировщика задач и диспетчер печати). Обычно к службам предъявляется требование независимости выполнения от входа пользователя. Многие серверные приложения Windows (например, Microsoft SQL Server и Microsoft Exchange Server) также включают компоненты, выполняемые как службы.
- Системные процессы. Фиксированные процессы, такие как процесс входа или диспетчер сеансов, не являются службами Windows. Другими словами, они не запускаются диспетчером служб.
- Серверные процессы подсистем среды. Такие процессы реализуют часть поддержки среды ОС, предоставляемой пользователю и программисту. Изначально в Windows NT было три подсистемы среды: Windows, POSIX и OS/2. Подсистема OS/2 включалась только до Windows 2000, подсистема POSIX в последний раз была включена в Windows XP.Ultimate- и Enterprise-выпуски клиента Windows 7. Все серверные версии Windows 2008 R2 включают поддержку расширенной подсистемы POSIX, называемой SUA (Subsystem for UNIX-based Applications). Сейчас подсистема SUA не поддерживается и уже не включается как необязательное часть в версии Windows (Windows 10 версии 1607 включает подсистему Windows для Linux — WSL, Windows Subsystem for Linux).
Обратим внимание на блок DLL подсистем под блоками Процессы служб и Пользовательские процессы. В Windows пользовательские приложения не вызывают низкоуровневые сервисные функции операционной системы напрямую. Вместо этого они проходят через одну или несколько динамических библиотек (DLL) подсистем. Их роль состоит в том, чтобы преобразовывать документированные функции в соответствующие внутренние (недокументированные) вызовы системных функций, реализованных в основном в Ntdll.dll. Преобразование может включать (а может не включать) отправку сообщения процессу, обслуживающему пользовательский процесс.
Компоненты режима ядра:
- Исполнительная система. Она содержит базовые сервисные функции ОС: управление памятью, управление процессами и потоками, безопасность, ввод/вывод, сетевая поддержка и межпроцессные коммуникации.
- Ядро Windows. Низкоуровневые функции ОС: планирование потоков, диспетчеризация прерываний и исключений и многопроцессорная синхронизация. Также ядро предоставляет набор функций и базовых объектов, которые используются исполнительной системой для реализации высокоуровневых конструкций.
- Драйверы устройств. Сюда входят как драйверы физических устройств, преобразующие вызовы пользовательских функций ввода/вывода в конкретные запросы ввода/вывода к устройству, так и драйверы устройств, не относящихся к физическому оборудованию, например драйверы файловой системы или сетевые драйверы.
- Слой абстрагирования оборудования (HAL). Прослойка кода, изолирующее ядро, драйверы устройств и прочий исполняемый код Windows от платформенно-зависимых различий в работе оборудования, например различий между системными платами.
- Оконная и графическая система. Реализация функций графического интерфейса (GUI), также известных как функции GDI: работа с окнами, элементы пользовательского интерфейса и графический вывод.
- Уровень гипервизора. Включает всего-навсего один компонент: сам гипервизор. В этой среде нет ни драйверов, ни других модулей. При этом сам гипервизор состоит из нескольких внутренних уровней и служб: собственный диспетчер памяти, планировщик виртуальных процессов, управление прерываниями и таймером, функции синхронизации, разделы (экземпляры виртуальных машин) и внутрипроцессные коммуникации (IPC, Inter-Process Communication) и многие другие.
В таблице ниже представлены некоторые файлы некоторых базовых компонентов Windows:
Windows API
Windows API (Application Programming Interface) — это программный интерфейс пользовательского режима для Windows. До появления 64-разрядной версии операционной системы программный интерфейс 32-разрядных версий Windows назывался Win32 API в отличие от исходного 16-разрядного Windows API (программный интерфейс для исходных 16-разрядных версий Windows). На данный момент термин Windows API или Win32 API относят как к 32-разрядным, так и к 64-разрядным версиям.
В «доисторические времена» Windows API состоял только из функций в стиле C. Выбор языка C был обусловлен тем, что написанный на нем код также мог использоваться из других языков. Он являлся достаточно низкоуровневым для предоставления сервиса ОС. Но огромное количество функций в сочетании с недостаточной последовательностью выбора имен и отсутствием логических группировок (вроде пространств имен C++) привели к тому, что в некоторых новых API используется другой механизм — модель COM.
COM базируется на двух основных принципах. Во-первых, клиенты взаимодействуют с объектами (серверные объекты COM) через интерфейсы — четко определенные контракты с набором логически связанных методов, сгруппированных посредством механизма диспетчеризации по виртуальным таблицам. Такой же механизм, к слову, обычно применяется компиляторами C++ для реализации диспетчеризации виртуальных функций. Таким образом обеспечивается двоичная совместимость и снимаются проблемы с декорированием имен компилятором. Поэтому, такие методы могут вызываться из многих других языков и компиляторов, включая C, C++, VB, языки .NET, Delphi и т. д. Вторым принципом является динамическая загрузка компонентов (вместо статической компоновки с клиентом).
WinRT
В Windows 8 появился новый API и исполнительная среда поддержки Windows Runtime (WinRT). WinRT состоит из платформенных сервисов, предназначенных для разработчиков приложений Windows Apps (приложения Windows Apps подходят для устройств, начиная от миниатюрных IoT-устройств до телефонов, планшетов, десктопных систем, ноутбуков и даже Xbox One и Microsoft HoloLens).
С точки зрения API платформа WinRT строится на базе COM, добавляя в базовую инфраструктуру COM различные расширения. С архитектурной точки зрения она обладает намного большей целостностью: в ней реализованы иерархии пространств имен, последовательная схема назначения имен и паттерны программирования. На базовом двоичном уровне WinRT API все равно строится на основе унаследованных двоичных файлов и API Windows. Это не новый «машинный» API для системы: ситуация немного напоминает то, как .NET строится на основе традиционного Windows API.
.NET Framework
.NET Framework является частью Windows. Он состоит из двух основных компонентов:
- CLR (Common Language Runtime). Исполнительная среда .NET, включает JIT-компилятор для преобразования инструкций языка CIL в низкоуровневый язык машинных команд процессора, сборщик мусора, систему проверки типов, безопасность обращения к коду и т. д. Среда реализована в виде внутрипроцессного сервера COM (DLL) и использует различные средства, предоставляемые Windows API.
- .NET Framework Class Library (FCL). Обширная подборка типов, реализующих функциональность, часто используемую в клиентских и серверных приложениях, — средства пользовательского интерфейса, поддержка сети, работа с базами данных и т. д.
На схеме представлены отношения между .NET Framework и ОС Windows:
Отношение между .NET и ОС Windows. Термин «сервер COM» обычно относится к DLL библиотеке или исполняемому файлу (EXE), в котором реализованы классы COM.
Реферат:
на
тему «Windows»
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
ИСТОРИЯ
СОЗДАНИЯ MICROSOFT WINDOWS
ОБЗОР
ОСНОВНЫХ ПРИНЦИПОВ ОРГАНИЗАЦИИ ИНТЕРФЕЙСА В WINDOWS
Аппаратно-независимый графический интерфейс
(GDI
Стандартный оконно-ориентированный интерфейс
Окно
Пиктограммы
Меню
Полосы прокрутки
Курсоры
Каретка
Блоки диалога
Механизм сообщений
ИНТЕРФЕЙС
ГРАФИЧЕСКИХ УСТРОЙСТВ (GDI
Устройства GDI
Логические обьекты графики GDI
Контекст устройства
Основные атрибуты контекста устройства
Перерисовка области и изображение пикселей
Рисование линий
Рисование закрашенных фигур
Вывод
текста
ЭЛЕМЕНТЫ
ОКОННОГО ИНТЕРФЕЙСА……………………….
Окна
Windows……………………………………… 20
Главное окно
приложения………………………….
Регистрация класса
окна………………………….
Функция окна
приложения………………………….
Создание
окна…………………………………..
Отображение и обновление
окна…………………….
Типы
окна………………………………………
Построение
меню……………………………………
Определение
меню………………………………..
Обьекты
диалога……………………………………
Кнопки и переключатели…………………………..
Статические обьекты
диалога………………………
Редактор……………………………………….
Окно
список…………………………………….
Комбинированный
список…………………………..
ОБМЕН
ДАННЫМИ МЕЖДУ ПРИЛОЖЕНИЯМИ……………………….
Средства обмена данными между
приложениями……………
Динамический обмен между приложениями………………..
Основные термины………………………………..
Несколько слов о
DDEML…………………………..
Взаимосвязь между клиентом и
сервером……………..
Транзакции, функция обратного вызова
DDE…………..
Вспомогательные имена и другие названия……………
Системный
режим…………………………………
Инициализация…………………………………..
Основное назначение и работа функции обратного
вызова.
Обработка
строк…………………………………
Диалог между
приложениями………………………..
Простой
Диалог………………………………….
Сложный
диалог………………………………….
Обмен данными между
приложениями………………….
Классы транзакций……………………………….
Определение
ошибок………………………………
Список
литературы………………………………….
ВВЕДЕНИЕ
Для эффективной работы системы
и ее большого
покупательского спроса
недостаточно только того, чтобы аппаратура и программы обеспечивали правильные
результаты — не менее важным фактором является удобство работы пользователя.
Поэтому в настоящее время ни один программный продукт, лишенный более менее
удобного интерфейса взаимодействия пользователя с компьютером и программ между
собой, не может рассчитывать на успех.
В мире разработано огромное
количество различных систем поддержки создания пользовательского интерфейса.
Наиболее прогрессивному, по нашему мнению, являются обьектноориетированная
система Turbo Vision фирмы Borland и операционная среда Windows фирмы
Microsoft. Рассмотрением возможностей системы Turbo Vision занималась в своей
работе Фомичева Т.Л., а в представленной работе производится изучение и обзор
средств, входящих в состав операционной среды Windows.
Тот кто
написал хотя бы одну коммерческую программу, то знает, сколько времени и сил
уходит на организацию меню и выработку единого, непротиворечивого, интуитивно
ясного и удобного пользовательского интерфейса. Интерфейс, разработанный
корпорацией Microsoft является одним из лучших и стал своеобразным эталоном для
подражания.
В Microsoft Windows программисту
доступна вся мощь этого интерфейса — он избавляется от необходимости
организовывать меню, работу с клавиатурой и мышью (достаточно воспользоваться
стандартными средствами). Интерфейс с пользователем Windows является полным и
цельным. В нем решены не только проблемы организации меню, но и все общение с
пользователем организовано стандартными средствами.
ИСТОРИЯ СОЗДАНИЯ MICROSOFT WINDOWS
Корпорация
Microsoft объявила о начале разработки графической операционной оболочки
Windows 10 ноября 1983 года, хотя еще в конце 1982 года программисты Microsoft
начали создавать универсальный набор графических процедур, названный
Графическим Интерфейсом с Компьютером ( CGI ).
Первоначально предполагалось, что
CGI как набор процедур будет поставляться с компиляторами Microsoft, позволяя
разработчикам программ выводить графику на самые различные типы принтеров.
Программисты могли бы использовать в своих программах функции CGI, которые
затем переводились бы в команды нужного типа принтера.
Вскоре после
начала работ над CGI корпорация Microsoft развернула работы по созданию
графической операционной среды для компьютеров с MS-DOS. Создание такой
оболочки было инспирировано неожиданным интересом пользователей IBM совместимых
компьютеров к объявлению корпорацией VISICorp о начале работ над многооконной
операционнной оболочкой VisiOn. Таким образом, старая добрая конкуренция
сделала свое дело — в феврале 1983 года стало ясно, что Microsoft создаст свою
собственную оболочку Windows.
Хотя многие
особенности и свойства Windows кардинально изменились в последующем, некоторые
положения были ясны с самого начала. Windows должна быть многозадачной, т.е.
должна позволять запускать несколько программ одновременно. Windows должна
работать со всеми типами дисплеев и принтеров. И поскольку пользователю очень
трудно отказаться от привычных программных средств, Windows должна позволять
запускать приложения MS-DOS. Последняя цель настолько оказалась трудной в
реализации, что задержала весь проект на многие месяцы.
Задача
оказалось не из простых. Типичной машиной был компьютер со сравнительно
медленным процессором 8088 и оперативной памятью 64Kb. Если учесть, что MS-DOS
накладывает принципиальное ограничение по оперативной памити в 640Kb и, в
отличие от компьютеров Macintosh, не обеспечивает программноаппаратную
поддержку графики, разработка многозадачной графической операционной оболочки
грозила вырасти в неразрешимую задачу. Однако Microsoft развернула работы над
Windows полным ходом. К осени 1983 года разработкой Windows было занято уже 15
высококвалифицированных программистов, привлеченных к проекту из различных
филиалов Microsoft. Многие фирмы командировали своих специалистов для одновременного
участия в проекте.
Когда работы
над CGI перешли в фазу тестирования, это не был уже самостоятельный продукт.
CGI был переменован в GDI (the Graphics Device Interface — «Интерфейс с
графическими Устройствами») и стал частью Windows, включив в себя
процедуры работы не только с принтером, но и с дисплеем. Для этого в CGI были
добавлены функции, обеспечивающие поддержку типографско-издательских
особенностей в работе с текстами и процедуры манипулирования графическими
объектами.
При
презентации первого варианта Windows было обещано, что коммерческая продажа
начнется в мае 1984. Весной 1984 года дата начала продаж была отодвинута на
ноябрь. В ноябре эта дата была перенесена на июнь 1985 года. Однако коробки с
Windows появились в магазинах только 18 ноября 1985 года.
Несколько факторов привели к столь значительным
задержкам. Однако главную роль сыграло нежелание
Microsoft
выходить на рынок с сырым продуктом. В феврале 1984
года глава
корпорации Microsoft Билл Гейтс ( Bill Gates ) провел семинар,
на котором представил Software Development Kit ( SDK
), пакет
для написания приложений под Windows,
продемонстрировав на нем
возможности,
предлагаемые программисту под Windows.
SDK произвел
хорошее впечатление и к июню 1984 года было продано почти 100 копий. Начав
работать под Windows, программисты присылали в Microsoft свои замечания,
заставляя разработчиков еще и еще отшлифовывать Windows, облегчая
написание приложений. Был заменен язык, на
котором создавался
Windows ( сначала это был Microsoft Pascal, затем
Lattice C и,
наконец, Microsoft C Compiler ). Ориентация на
Microsoft C
Compiler также была одной из причин задержки
работ над
проектом, потому, что сам компилятор не был готовым
продуктом
и
постоянно совершенствовался.
Однако, несмотря на
то, что в ноябре 1985 года Windows все же вышел на прилавки магазинов, в
течение двух лет ( с 1985 по 1987 год ) Windows не оказал большого влияния на
рынок программного обеспечения и не стал альтернативой MS-DOS, как надеялся
Microsoft. Большое число пользователей ( 51% ) покупали Windows не ради
созданных для него приложений (которых было очень мало по сравнению с обычными
программами под MS-DOS ) или графического интерфейса, а для того, чтобы иметь
возможность быстро переключаться с одного DOS приложения на другое.
С 1987 года
ситуация начала меняться. Начали появляться мощные и известные приложения,
переписанные для работы под Windows. Сейчас можно назвать такие продукты как
Page Maker под Windows, очень мощная электронная таблица Excel, Windows Graph,
Word for Windows и многие другие.
С выходом
третей версии Windows стало ясно, что Windows не просто завоюет прочное место
на рынке программного обеспечения, но станет основой стратегической политики
Microsoft в создании программного обеспечения. Windows 3.0 произвел настоящий
фурор, предлагая совершенно потрясающую графику и новые, неожиданные
возможности.
В июле 1990 года «PC
Magazine» поместил статью о новой версии Windows 3.0, в которой
отмечалось, что Microsoft Windows превратился в блестящую многозадачную
операционную систему, которой еще пытается стать OS/2. Как и все программные
продукты Microsoft, первые версии Windows не оправдывали надежд несмотря на то,
что выходили со значительными задержками, но в своем последнем варианте
оставляют конкурентов далеко позади.
ОБЗОР ОСНОВНЫХ ПРИНЦИПОВ ОРГАНИЗАЦИИ
ИНТЕРФЕЙСА В WINDOWS
Для понимания
принципов организации интерфейса Windows необходимо иметь представление об
основных его элементах, на которых построено выполнение программ и
взаимодействие программы и пользователя. Весь интерфейс Windows основывается на
трех китах:
— аппаратно-независимая графика;
— стандартный оконно-ориентированный интерфейс;
— взаимодействие приложений с системой Windows
и между собой посредством передачи сообщений;
Данные элементы системы Windows
самым тесным образом связаны между собой, вместе образуют целостную систему и
отдельное рассмотрение каждого из них в отрыве от других не имеет смысла.
Перечисленные выше элементы системы Windows ниже будут рассмотрены более
подробно, а пока вкратце остановимся на том, что они из себя представляют.
Аппаратно-независимый графический интерфейс (GDI)
Любая программа для
Windows может выполнять вывод на любое устройство с помощью одного и того же
набора вызываемых подпрограмм. Причем для Windows приложения все устройства
выглядят одинаково и программисту не нужно забодится об управлении конкретным
устройством на низком уровне.
Каждое
устройство имеет свой драйвер, отвечающий за фактическое выполнение
графического вывода. Для устройств, которым при этом необходима помощь, GDI
обеспечивает программную эмуляцию, использующую для реализации функций высокого
уровня средства низкого уровня этого устройства.
При выводе
информации на экран дисплея GDI обеспечивает оконно-ориентированную графику.
Это означает, что каждое окно рассматривается как отдельная область прорисовки.
Когда программа выполняет в окне прорисовку, то координаты по умолчанию
устанавливаются так, что точка начала координат (0,0) находится в верхнем левом
углу клиентной области окна.
Кроме того, рисунки автоматически
отсекаются по границам окна. Подобные механизм защиты работает двусторонне, то
есть ни вы не можете нарисовать что-либо вне своего окна, ни другая программа
нарисовать что-то в вашем окне.
Стандартный оконно-ориентированный интерфейс
Система Windows имеет встроенную поддержку
ряда обьектов пользовательского интерфейса: окон, пиктограмм, меню, блоков
диалога и т.п.
Окно
Окно представляет собой самую важную часть
пользовательского
интерфейса. Оно играет ключевую роль.
Для программиста
окно служит для организации прочих обьектов пользовательского интерфейса и
направляет прохождение сообщений в системе, окно обеспечивает область экрана
для связи с пользователем.
Окно — это самостоятельно
существующий обьект, параметры которого описаны в специальных структурах
данных, а поведение функцией окна.
Каждое окно
принадлежит классу окон. Класс окон — это шаблон, по которому реализуются
реальные окна. С каждым классом окон и, следовательно, с каждым окном связан
специальный тип подпрограммы, называемый процедурой окна. Задача процедуры окна
состоит в обработке поступающих окну сообщений.
Каждое приложение располагается в
своем собственном окне и имеет по крайней мере хотя бы одно окно — главное окно
приложения. Из приложения Windows непосредственно нельзя осуществить вывод на
экран, так как экран является разделяемым ресурсом, а средством его разделения
являются окна. Таким образом, прежде чем отобразить что-либо на экране, нужно
создать окно, и только в окне можно осуществить вывод.
Пиктограммы
Пиктограмма представляет собой
небольшой рисунок,
который служит для пользователя напоминанием о
чем-либо и
обозначают
команду, программу или некоторые данные.
Меню
Меню представляет
собой список команд и функций программы. Имеется пять типов меню:
— системные,
— горизонтальные,
— выпадающие,
— вложенные,
—
всплывающие.
Системные меню
обеспечивают стандартный набор операций, которые могут быть выполнены с окном
(перемещение, изменение размеров, закрытие, переключение на другую задачу и
т.д.). Это меню обязательно находится в главном меню каждого приложения.
Горизонтальное
меню фиксировано привязывается к верху окна.
Выпадающие
меню появляются при выборе соответствующих пунктов горизонтального меню.
Вложенные
меню появляются при выборе соответствующих пунктов выпадающих меню. Прикладная
программа может вкладывать
одно меню в другое до любого уровня
вложенности.
Всплывающие меню могут располагаться в
произвольной позиции в окне и фактически в любой позиции на экране дисплея.
Полосы прокрутки
Используются в тех случаях,
когда обьект данных больше размеров окна. Полосы прокрутки бывают вертикальными
и горизонтальными. Они позволяют пользователю управлять отображением больших
обьемов данных и иметь к ним доступ.
Существует ограничение на обьем данных в
скроллинге. Обьем данных не может превышать 64 Кбайт.
Курсоры
Курсор представляет собой битовый образ,
перемещаемый по экрану в ответ на перемещения мыши или другого координатного
устройства. Программа может изменить формукурсора, чтобы отобразить некоторое
изменение в системе.
Каретка
Каретка — это
небольшая битовая матрица, которая является отметкой фокуса ввода с клавиатуры.
Окно, управляющее вводом с клавиатуры может создать каретку, чтобы сообщить
пользователю об этот факте.
Пользовательский интерфейс Windows
поддерживает только одну каретку на экране.
Блоки диалога
Блок диалога — это
стандартный способ приема программой ввода от пользователя. Типичный пример
блока диалога — это блок диалога для открытия файла.
Блок диалога
представляет собой окно, содержащее внутри себя отдельные окна, которые либо
выводят некоторую информацию, либо позволяют принять ввод от пользователя.
Каждое их этих окон называется элементом управления диалогом.
Система
имеет шесть предопределенных классов окон, на базе которых создаются элементы
управления блоками диалога:
— кнопки;
— комбинированные блоки;
— элементы управления редактированием;
— блоки списков;
— полосы прокрутки;
—
статические элементы.
Более полное описание обьектов интерфейса
представлено ниже.
Механизм сообщений
В системе Windows любое приложение строится
как совокупность обработчиков различных событий, которые происходят совершенно
независимо друг от друга. Каждое событие генерирует, сообщение, которое
передаются всем приложениям, для которых оно может представлять интерес.
Приложение
представляет собой 16-битовое значение без знака, которому для удобства
присваивается символьная константа. Все сообщения имеют единый формат и являются
единственным средством связи приложения с операционной оболочкой и с другими
приложениями. Некоторые сообщения могут в свою очередь порождать другие
сообщения.
При
поступлении сообщения о произошедшем событии, это сообщение помещается в
системную очередь Windows. Системная очередь в Windows одна. После этого
сообщения из системной очереди распределяются между приложениями. Для каждого
приложения Windows организует и поддерживает отдельную очередь, куда
пересылаются все сообщения для этого приложения.Обработку очереди приложения
осуществляет само приложение.
Если
сообщение поступило например от устройств ввода, таких как мышь или клавиатура,
то для определения адресата сообщения используется понятие «фокус
ввода». Так как пользователь в каждый момент времени может работать только
с одним приложением. Таким образом, говорят, что приложение, в которое попадают
сообщения от клавиатуры в момент ввода, имеет фокус ввода, поэтому все
сообщения от устройств ввода информации поступают из системной очереди в очередь
приложения, имеющего фокус ввода в данный момент.
Для обработки поступающих
сообщений в программе
организуется цикл сообщений, который создается
при при
создании окна приложения. Цикл сообщений извлекает
сообщения
из очереди и передает их функции управления
соответствующим
окном приложения, причем не напрямую а через Window. О
функции
окна
приложений пойдет речь позже.
Все стандартные
сообщения, определенные в системе Windows можно разделить на несколько групп:
— аппаратные (входные данные от мыши и клавиатуры);
— об организации окна
(уведомление, требование действия, запрос);
— об организации интерфейса
пользователя (меню,
указатель
мыши, линейка прокрутки, блоки диалога, MDI);
— о завершении
(закрытие прикладной программы или системы);
— частные
(элементы управления блоком диалога: редактор кнопка, блок списка, комбо-блок);
—
уведомление о системном ресурсе (изменение цвета, шрифты, буферизация печати,
режимы работы устройств);
— о
совместном использовании данных (буфер вырезанного изображения и динамический
обмен данными DDE);
— внутренние системные (недокументированные сообщения).
Ниже будут более
подробно рассмотрены перечисленные классы сообщений в контексте их применения.
Особое внимание будет уделено сообщениям по взаимодействию между приложениями
и совместному использованию данных.
ИНТЕРФЕЙС ГРАФИЧЕСКИХ УСТРОЙСТВ (GDI)
В данном разделе
рассматриваются вопросы связанные с созданием графического вывода, обсуждаются
различные типы графического вывода, поддерживаемых интерфейсом графических
устройств (GDI).
GDI представляет собой библиотеку
графического вывода Windows. GDI обеспечивает графический вывод на экран
дисплея и на устройства для получения твердых копий, например, принтеры и
плоттеры. GDI отвечает за создание отображения каждой линии, буквы или
графического знака, выводимого программой для Windows. Сама Windows использует
GDI при подборке элементов, составляющих пользовательский интерфейс, — окон,
пиктограмм, меню, блоков диалога и т.д.
Устройства GDI
Интерфейс
графических устройств позволяет выполнять графический вывод на различные
устройства. Для того, чтобы GDI работал с конкретным устройством, необходим
специальный элемент программного обеспечения — драйвер устройства, который
преобразует запросы графического вывода в конкретные действия для рисования на
конкретном устройстве.
Помимо
этого, драйвер устройства представляет GDI набор флагов, которые сообщают,
какими графическими возможностями обладает данное устройство. Существует пять
наборов таких флагов: для кривых линий, для прямых, многоугольников, битовых
образов и текстов, которые сообщают GDI, когда можно направить устройству
непосредственно запрос, а когда такой запрос надо предварительно преобразовать
в последовательность запросов низкого уровня. Это зависит то возможностей
конкретного устройства.
Помимо
физических устройств GDI поддерживает логические устройства, или
псевдоустройства. Псевдоустройства служат для хранения изображений. В отличие
то физических устройств, которые выводят изображения на определенной аппаратной
базе, псевдоустройства позволяют «перехватить» образ изображения в
оперативной памяти или на диске. GDI поддерживает два типа псевдоустройств:
битовые образы и метафайлы.
Битовые
образы имеют прямоугольную форму и хранят изображения в памяти в таком виде, в
каком графические образы хранятся дисплейным адаптером, и обеспечивают быстрое
получение копии картинки. Битовые образы используются и для хранения образов,
которые нужно быстро выводить на экран, например, пиктограммы, курсоры и т.д.
Метафайлы создаются средствами записи-воспроизведения
GDI. С точки зрения расходуемой памяти
метафайлы
предпочтительнее, чем битовые образы, однако
работа сними
происходит медленнее. Обычно в метафайлах хранятся
крупные
изображения.
Логические обьекты графики GDI
Одним из средств
достижения аппаратной независимости GDI является использование логических
обьектов графики. Такой обьект описывает, каким образом должен выполняться
вывод, это высокоуровневый аппаратно-независимый запрос. GDI поддерживает
следующие логические обьекты графики:
— перья (для рисования линий);
— кисти (для закрашивания областей);
— шрифты (для вывода текстов);
—
логические цвета (описывающие цвета вывода).
После создания логического обьекта он может
быть использован в отношении любого устройства, при этом драйвер каждого
устройства по своему интерпретирует логический обьект способом, соответствующий
возможностям устройства.
Контекст устройства
Контекст устройства представляет собой
некоторое
множество атрибутов графического вывода, в которое
входит одно
перо для рисования линий, одна кисть для закрашивания
областей
и один шрифт для вывода текстов, которые можно
изменить в
любой момент. Вместе взятые, атрибуты графического
вывода дают
полный контроль над тем, как выглядит и где
выполняется
графический
вывод программы.
Каждый контекст
устройства включает в себя 20 атрибутов графического вывода, которые приведены
ниже (в скобках приведено значение по умолчанию):
— Цвет фона (белый);
— Режим фона (OPAQUE);
— Логический номер кисти (белая кисть);
— Начало координат кисти (0,0);
— Логический номер области прорисовки (вся
поверхность);
— Логический номер
цветовой палитры (палитра по умолчанию);
— Текущая позиция пера (0,0);
— Режим графического вывода (R2_COPYPEN);
— Логический номер шрифта (системный шрифт);
— Межсимвольный интервал (0);
— Режим отбражения (MM_TEXT);
— Логический номер пера (черное перо);
— Режим закрашивания многоугольников (альтернативный);
— Режим растяжения (черный по белому);
— Выравнивание
границ текста (по левому и верхнему краям);
—
Цвет текста (черный для текста и кистей с монохромным
шаблоном закрашивания);
— Выравнивание строк текста (0,0);
— Протяженность окна данного экрана (1,1);
— Начало координат окна данного экрана (0,0);
— Протяженность окна экрана (1,1);
—
Начало координат окна экрана (0,0).
Контекст устройства связывает программу с
конкретной поверхностью рисования. Такое соединение является логическим, а не
физическим. Чтобы избежать конфликтов, связанных с совместным использованием
устройств, программа получает у контекста устройства «пропуск» к
устройству. Работа системы пропусков зависит от типа устройства. На устройствах
получения твердых копий это делается путем буферизации ввода, а на
видеоустройствах — путем выделения так называемой области прорисовки, вне
границ которой программа рисовать не может.
Основные атрибуты контекста устройства
Для рисовании линий
самым важным атрибутом контекста устройства является перо, определяющее, как
будет выглядеть линию: ее цвет, ширина и стиль (или шаблон, например, сплошная
линия, пунктир и т.п.) и представляющее из себя запрос к устройству на
рисование линии определенного вида.
При
рисовании линий также используется атрибут — режим графического вывода, в
котором можно задать логическую операцию, чтобы применить ее при выводе между
новым и старым пикселями.
Для
закрашивания областей используется атрибут кисть, определяющий как будет
выглядеть закрашиваемая область и характеризующийся тремя характеристиками:
стилем, цветом и шаблоном. Размер кисти составляет 8Х8 пикселей.
При
изображении текста ключевым атрибутом является шрифт. Шрифт — совокупность
шаблонов для вывода текста. GDI распознает два вида шрифтов: логические и
физические.
Логический шрифт описывает
текст стандартным не
зависящим от внешних устройств способом.
Логический шрифт
задается структурой LOGFONT. Логический шрифт — это
запрос на
на
текст с определенными характеристиками.
typedef struct tagLOGFONT
int lfHeight; // высота символа
int lfWidth; // средняя ширина
int lfEscapement; // угол наклона текста
int lfOrientation; // угол наклона символа
int lfWeight; // среднее число пикселей/1000
BYTE lfItalic; // не
0, если курсив
BYTE lfUnderline; // не
0, если подчеркнуто
BYTE lfStrikeOut; // не
0, если вычеркнуто
BYTE lfCharSet; // набор
символов ANSI, OEM
BYTE lfOutPrecision; // точнось отображения
BYTE lfClipPrecision; // точность вырезки
BYTE lfQuality; //
качество печати
BYTE lfPitchAndFamily; // флаг для стиля
шрифта
BYTE lfFaceName[LF_FACESIZE]; // название шрифта
LOGFONT;
Физический шрифт — это набор шаблонов,
зависящий от устройства. Он выбирается по описанию, содержащемуся в логическом
шрифте и может быть аппаратно реализован.
Для задания
атрибута контекста устройства используется функция SelectObject, описанная
следующим образом:
HANDLE
FAR PASCAL SelectObject(HDC, HANDLE);
Здесь первый
параметр — логический номер контекста устройства, а второй — логический номер
значения атрибута.
Для того,
чтобы получить логический номер требуемого значения атрибута контекста,
используется функция GetStockObject. Ее прототип:
HANDLE FAR PASCAL GetStockObject(int);
Параметром является значение атрибута контекста
устройства, обычно для удобства задаваемое в
виде набора
символов.
Программист может использовать либо уже
заданные значения атрибутов, либо создавать свои новые.
Перерисовка области и изображение пикселей
Из-за того, что
Windows не накладывает ограничений на размеры и расположение окон приложений,
могут возникнуть ситуации, что окно одного приложения перекроет окно другого
приложения, поэтому при переключении между приложениями необходимо перерисовыть
поврежденные области окна.
Для этой
цели используется подпрограмма BeginPaint. При получении сообщения WM_PAINT,
говорящее о необходимости перерисовки окна из изменения его размеров или
восстановления поврежденной области, подпрограмма BeginPaint получает контекст
устройства и определяет область, которую надо перерисовать.
Подпрограмма BeginPaint принимает два параметра:
логический номер окна и указатель на
структуру данных
PAINTSTRUCT, Она возвращает
логический номер контекста устройства, необходимый для рисования пикселя.
Прототип подпрограммы имеет вид:
HDC FAR PASCAL BeginPaint(HWND, LPPAINTSTRUCT);
Структура
PAINTSTRUCT определена так:
typedef struct tagPAINTSTRUCT
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
PAINTSTRUCT;
hdc — логический номер контекста устройства;
fErase — флаг, задающий необходимость стирания окна;
rcPaint — описывает прямоугольник, ограничивающий
поврежденную область;
fRestore, fIncUpdate и rgbReserved
предназначены для внутреннего использования Windows.
Для отображения пикселя
используется подпрограмма
SetPixel.
Ее прототип:
DWORD
FAR PASCAL SetPixel( HDC, int, int, DWORD);
HDC — логический контекст устройства;
следующие два параметра — координаты пикселя; последний параметр — цвет.
После
завершения перерисовки, программа вызывает функцию EndPaint, чтобы вернуть контекст
устройства дисплея Менеджеру Окон и сообщить, что окно восстановлено. Когда тот
получает контекст устройства, он восстанавливает все его атрибуты по умолчанию,
и контекст устройства готов к передаче информации любой программе, которой
понадобится нарисовать окно. Подпрограмма
EndPaint имеет прототип:
void
FAR PASCAL EndPaint(HWND, LPPAINTSTRUCT);
Рисование линий
Каждая линия имеет
начальную и конечную точку, и GDI рисует линию так, начальная точка включается
в линию, а конечная исключается из линии.
GDI имеет 4 подпрограммы для
рисования линий: MoveTo, LineTo, PolyLine и Arc.
Подпрограмма
MoveTo помещает пару координат XY в атрибут контекста устройства, который
называется текущей позицией. Подпрограмма имеет прототип:
DWORD
FAR PASCAL MoveTo( HDC, int x1, int y1 );
Подпрограмма LineTo
берет начальную точку из атрибута текущей позиции и рисует линию до конечной
точки, передаваемой как параметр. После этого она устанавливает новое значение
атрибута текущей позиции. Подпрограмма имеет прототип:
BOOL
FAR PASCAL LineTo( HDC, int x1, int y1 );
Подпрограмма
Polyline позволяет нарисовать ломанную линию, но для ее работы необходимо
предварительно создать массив координат точек. Подпрограмма имеет прототип:
BOOL
FAR PASCAL Polyline( HDC, LPPOINT points, int num );
points — указатель на массив координат,
котором координаты оси абсцисс и оси ординат чередуются; num — число пар
координат в массиве.
Подпрограмма
Arc позволяет нарисовать дуги эллипса. Передаваемые параметры определяют
прямоугольник, ограничивающий фигуру, если бы она была полной, начальную точку
и конечную. Подпрограмма имеет прототип:
BOOL
FAR PASCAL Arc( HDC,int,int,int,int,int,int,int,int);
Рисование закрашенных фигур
Для рисования закрашенных фигур
существует семь
различных
функций.
Функция Polygon
соединяет расположенные последовательно точки с помощью текущего установленного
в контексте устройства пера. Функция
определена так:
BOOL
FAR PASCAL Polygon(HDC, LPPOINT, int);
HDC — логический номер контекста устройства;
LPPOINT — указатель
на массив координат, соединяемых граничных точек;
Третий
параметр — число соединяемых точек.
Функция PolyPolygon
позволяет нарисовать за один вызов несколько многоугольников и определена так:
BOOL
FAR PASCAL PolyPolygon(HDC, LPPOINT, LPINT, int);
HDC — логический номер контекста устройства;
LPPOINT — указатель
на массив координат, соединяемых граничных точек всех создаваемых
многоугольников;
LPINT — указатель
на массив типа int. Элементы массива задают число точек в каждом многоугольнике*
Последний параметр задает количество точек в
массиве LPINT, то есть количество многоугольников.
Для
рисования закрашенного эллипса используется функция Ellipse. Она определяется так:
BOOL
FAR PASCAL Ellipse(HDC, int, int, int, int);
HDC — логический номер контекста устройства;
Остальные параметры определяют координаты
ограничивающего
прямоугольника.
Функция Chord
используется для рисования частичной дуги, концы которой соединены сегментом
линии. Для этого также используется ограничивающий прямоугольник. Определение
функции следующее:
BOOL FAR PASCAL Chord(HDC,
int, int,
int, int,
int, int,
int,
int);
HDC — логический номер контекста устройства;
Следующие четыре параметры определяют координаты
ограничивающего прямоугольника.
Далее указываются координаты начальной и
конечной точки сегмента линии.
Функция Pie
аналогична функции Chord, только рисует не хорду, а сектор эллипса. Она
определена следующим образом:
BOOL FAR PASCAL Pie(HDC,
int, int,
int, int,
int, int,
int, int);
HDC — логический номер контекста устройства;
Следующие четыре параметры определяют координаты
ограничивающего прямоугольника.
Далее указываются координаты начальной и
конечной точки сектора.
Для рисования прямоугольника используется функция
Rectangle.Ее
прототип:
BOOL
FAR PASCAL Rectangle(HDC, int, int, int, int);
HDC — логический номер контекста устройства;
Остальные параметры определяют координаты
прямоугольника.
Если требуется
нарисовать прямоугольник с закругленными краями, то имеется функция RoundRect.
Она определена
та:
BOOL FAR PASCAL
RoundRect(HDC,
int, int,
int, int,
int,
int);
HDC — логический номер контекста устройства;
Следующие четыре параметры определяют координаты
прямоугольника.
Последние два параметра задают ширину и высоту
ограничивающего прямоугольника для эллипса, используемого при скруглении угла.
Вывод текста
Для
вывода текста имеется пять основных функций.
Функция TextOut
предназначена для вывода одной строки. Она определена следующим образом:
BOOL FAR PASCAL TextOut(HDC, int, int, LPSTR, int);
HDC — логический номер контекста устройства;
Следующие два
параметры определяют координаты точки привязки выводимой стоки текста.
LPSTR — указатель на выводимую символьную строку.
Последний
параметр — число символов в строке текста.
Более мощный
вариант функции TextOut представляет собой функция ExtTextOut. Она позволяет
управлять интервалом между строками и вырезкой
BOOL FAR PASCAL
ExtTextOut( HDC,
int, int,
WORD wOptions,
LPRECT lpRect,
LPSTR lpString,
WORD nCount,
LPINT lpDx
);
HDC — логический номер контекста устройства;
Следующие два
параметры определяют координаты точки привязки выводимой стоки текста.
wOptions — флаг,
принимающий значение 0, ETO_CLIPPED, ETO_OPAQUE и ETO_CLIPPED|ETO_OPAQUE,
позволяющий устанавливать прямоугольные области вырезки и при выводе текста
затирать фон.
lpRect — указатель на структуру прямоугольника;
lpString — указатель на выводимую символьную
строку.
nCount — число символов в строке текста. lpDx
—
указатель на массив значений интервалов между
символами.
Функция
TabbedTextOut при выводе текста распространяет знаки табуляции до позиций
табуляции. Это обеспечивает удобный способ выравнивания столбцов данных.
Прототип функции:
LONG FAR PASCAL TabbedTextOut(HDC,
int, int,
LPSTR, int, LPINT, int);
HDC — логический номер контекста устройства;
Следующие два
параметры определяют координаты точки привязки выводимой стоки текста.
LPSTR — указатель на выводимую символьную строку.
Следующий
параметр — число символов в строке текста.
LPINT — указатель на массив позиций табуляции;
Последний параметр — число элементов массиве
позиций табуляции.
Функция
DrawText обеспечивает некоторую возможность форматирования и переход в
автоматическом режиме на новую строчку при большом количестве строк текста. Ее прототип:
int
FAR PASCAL DrawText(HDC, LPSTR, int, LPRECT, WORD);
HDC — логический номер контекста устройства;
LPSTR — указатель на выводимую символьную строку.
Следующий параметр — число символов в строке текста.
LPRECT — указатель на структуру прямоугольника,
определяющего позицию вывода и границы для
форматирования. Последний параметр определяет режим форматирования.
Для отображения заблокированных пунктов
меню и
заблокированных элементов управления блоками диалога
Менеджер
Окон
использует функцию GrayString.
ЭЛЕМЕНТЫ ОКОННОГО ИНТЕРФЕЙСА
Окна Windows
Главное
окно приложения
Каждое приложение
располагается в своем собственном окне и имеет по крайней мере хотя бы одно
окно — главное окно приложения. Из приложения Windows непосредственно нельзя
осуществить вывод на экран, так как экран является разделяемым ресурсом, а
средством его разделения являются окна. Таким образом, прежде чем отобразить
что-либо на экране, нужно создать окно, и только в окне можно осуществить
вывод.
Функция
главного окна приложения выполняет в программе ту же роль, что функция main()
программы на Си для MS-DOS. При создании окна функция библиотеки SDK выполняет
специальные действия начальной подготовки в DOS, не явно осуществляемых
функцией main(). Поэтому приложение не содержит функции main(), роль которой
выполняет функция WinMain(), получающая управление в начальный момент загрузки
приложения. Функция WinMain() выполняет следующие основные действия:
— регистрация класса
окна приложения и другие
инициализации;
— создание
основного окна приложения и, возможно, других, подчиненных окон;
— запуск цикла обработки
сообщений, помещаемых в очередь приложения;
— завершение работы приложения при извлечении из
очереди сообщения WM_QUIT.
Прототип функции WinMain выглядит так:
int PASCAL WinMain
(
HANDLE instance, // дескриптор предыдущей копии
HANDLE prevInstance, // предыдущая
копия
LPSTR cmdLine, // указатель на командную строку
int cmdShow // флаг
«окно открыто/закрыто»
);
instance — однозначно определяет каждую копию
приложения,
если приложение запущено несколько раз.
prevInstance —
определяет копию данного приложения, которая была последней активной копией.
Если этот параметр равен 0, то других копий приложения, исполняемых в данный
момент не существует.
cmdLine —
дальний указатель на командную строку, оканчивающуюся нулем. Он позволяет приложениям
получать данные через командную строку.
cmdShow — определяет, как
приложение первоначально отображать на экране: пиктограммы (cmdShow =
SW_SHOWMINNOACTIVE) или в виде открытого окна (cmdShow = SW_SHOWNORMAL).
Константы SW_SHOWMINNOACTIVE и SW_SHOWNORMAL определены во включаемом файле
windows.h.
Регистрация класса окна
Любое окно
принадлежит к одному из существующих классов. Класс окна должен быть создан до
того, как окно будет отображено на экране. Класс окна определяет общие свойства
всех окон данного класса, например: форму курсора при перемещении его в области
окна или имя меню, определенного для окон этого класса.
Характеристики
окна задаются при регистрации класса окна (в структуре класса окна) и при
создании окна. Наиболее общие характеристики окон задаются при регистрации
класса окна. Окна, создаваемые при помощи функции CreateWindiw, должны иметь
зарегистрированный ранее класс окон.
Есть
несколько стандартных классов окон с заранее определенными свойствами. Однако,
как правило, каждое приложение регистрирует свой собственный класс с тем, чтобы
можно было управлять всеми свойствами окна приложения.
Для того,
чтобы зарегистрировать класс окон, следует правильно заполнить структуру типа
WNDCLASS и передать эту структуру в виде параметра функции RegisterClass.
Структура класса окна имеет вид:
typedef struct tagWNDCLASS
WORD style; //
тип окна
LONG (FAR PASCAL *lpfnWndProc)(); // функция окна
int cbClsExtra; // размер доп. памяти
int cbWndExtra; // размер
доп. памяти
HANDLE hInstance; // индекс
копии приложения
HICON hIcon; // индекс
пиктограммы
HCURSOR hCursor; // индекс
курсора
HBRUSH hbrBackground; // цвет
фона окна
LPSTR lpszMenuName; // имя
меню
LPSTR lpszClassName; // имя
класса окна
WNDCLASS;
lpszClassName —
указатель на строку, содержащую имя класса. Поскольку определенный в приложении
класс доступен всем приложениям, имя класса не должно повторятся в разных
приложениях.
hInstance —
манипулятор копии, создающей класс окна; должно содержать индекс копии
приложения.
lpfnWndProc
— указатель на функцию поддержки окна. Краткое описание этой функции смотри в
следующем разделе.
style —
содержит набор флагов, определяющих свойства окна. По умолчанию присваивается
NULL.
hBrBackground — определяет цвет фона окна.
hCursor —
определяет курсор, используемый в данном окне по умолчанию.
hIcon —
определяет пиктограмму (icon), которая будет отображаться при переводе окна в
неактивное состояние.
lpszMenuName
— указатель на имя меню окна, определенное в файле ресурсов.
cbClsExtra —
определяет число байт, которое необходимо дополнительно запросить у Windows под
эту структуру. Этот обьем памяти будет зарезервирован в конце структуры для
всех окон данного класса.
clWndExtra — определяет число
байт, которое необходимо дополнительно запросить у Windows для размещения всех
структур, создаваемых совместно с данным классом.
После
определения полей структуры WNDCLASS необходимо зарегистрировать класс при
помощи функции RegisterClass.
BOOL
FAR PASCAL RegisterClass( LPWNDCLASS winClass );
Если регистрация
класса прошла успешно, то возвращаемое значение TRUE, в противном случае —
FALSE.
При регистрации класса окна Windows копирует
структуру, описывающую класс окна, в системную область, чтобы другим копиям
приложения уже не надо было ее регистрировать.
Функция окна приложения
Функция окна
приложения занимается тем, что обрабатывает все сообщения для окон данного
класса. Это функция всегда
вызывается неявно Windows при поступлении
сообщений в окно, за
которым
оно закреплено. Функция окна имеет вид:
long far PASCAL WndProc ( HWND hwnd,
WORD msg,
WORD wParam,
LONG
lParam );
hwnd — логический
номер окна, идентифицирующий окно, связанное с приложением;
msg — идентификатор приложения;
wParam и lParam
определяют дополнительную информацию и зависят от типа сообщения.
Для облегчения работы программиста существует
специальная функция обработки сообщений
DefWindowProc с теми
же параметрами, которая производит стандартную
обработку всех
сообщений. Кроме того она играет ключевую роль в
формировании
информационных потоков сообщений Windows, и ее
указание в
функции
окна обязательно.
Создание
окна
Создание окна производится при помощи
функции
CreateWindow. Она создает окно,
имеющее указанный тип и принадлежащее к указанному классу. Прототип функции
имеет вид:
HWND FAR PASCAL CreateWindow
(
LPSTR, // имя класса окна
LPSTR, // заголовок окна
DWORD, // тип окна
int, // X-координата
int, // Y-координата
int, // Ширина окна
int, // Высота окна
HWND, // Дескриптор копии-родителя
HMENU, // Дескриптор меню
HANDLE, // Дескриптор копии
LPSTR // Дополнительная информация
);
Тип окна является комбинацией битовых флагов,
определяющих стиль окна. Возможные
значения типа окна рассмотрены ниже.
Дескриптор
копии-родителя определяет порождающее окно. Он определяет, где существует окно
и может ли окно быть автоматически показано/скрыто/уничтожено (для всех типов
окон). Когда показывается, скрывается или уничтожается, все порожденные им окна
разделяют его судьбу
Дескриптор меню позволяет
определить меню, которое будет изображаться в окне.
Дескриптор
копии позволяет идентифицировать владельца окна, то есть указывает Windows,
какой именно экземпляр программы создал окно. В результате Windows получает
возможность правильно установить регистр сегмента данных для
инициализации окна.
Последний параметр
функции позволяет передать указатель на данные в оконную процедуру. Указатель
передается с самым первым сообщением WM_CREATE, что необходимо для обеспечения
данных при инициализации окна.
В случае успешного создания окна
функция CreateWindow возвращает индекс окна.
Отображение и обновление окна
Окно не отображается на экране
сразу после создания; для отображения окна используется функция ShowWindow. Ее прототип:
BOOL
FAR PASCAL ShowWindow( HWND wnd, int cmdShow );
wnd — дескриптор отображаемого окна;
cmdShow —
определяет, как окно первоначально будет отображаться на экране:
SW_SHOWNORMAL — обычное окно;
SW_SHOWMINIMIZED — минимизированное в виде
пиктограммы; SW_SHOWMAXIMIZED — максимизорованное на весь экран;
Для
обновления окна используется функция UpdateWindow. Ее прототип выглядит так:
void FAR PASCAL UpdateWindow( HWND wnd );
Типы
окна
Тип окна задается
32-битовым целым числом, которое представляет собой комбинацию битовых флагов,
определяющих различные свойства окна.
WS_OVERLAPPED
— перекрывающееся окно. Перекрывающиеся окна — это основной наиболее
универсальный тип окон Windows. Главное окно приложения обычно имеет такой вид.
WS_POPUP —
вспомогательные окна. Они используются чаще всего для отображения окон диалога.
Вот некоторые свойства вспомогательных окон:
— если
такое окно имеет родительское окно, то всегда отображаются поверх всех окон на
экране, даже когда пользователь делает активным другое окно;
— вспомогательные окна не имеют
заголовка и часто должны иметь фиксированный размер.
WS_CHILD — дочернее окно. Окна
такого типа создаются, если у приложения есть главное (а значит и перекрывающее
окно) и связаны некоторыми характеристиками с тем окном из которого были
вызваны. Все органы управления также являются дочерними окнами. Вот некоторые
их свойства:
— дочерние
окна никогда не отображаются вне своего родительского окна ни в раскрытом виде,
ни в виде пиктограммы;
— координаты
дочерних окон отчитываются от верхнего левого угла рабочей области
окна-родителя и при перемещении последнего, дочерние окна перемещаются вместе с
ним;
— дочернее окно никогда не может стать активным окном.
WS_MINIMIZE —
создаваемое окно будет отображено в виде пиктограммы.
WS_VISIBLE —
Окно становится видимым сразу после создания. Используется для диалоговых окон.
WS_DISABLED — создается неактивное окно.
WS_CLIPSIBLINGS — исключение
областей, занимаемых
другими дочерними окнами из изменяемой области
дочернего окна.
Используется
только для дочерних окон.
WS_CLIPCHILDREN — исключение областей, занимаемых
другими дочерними окнами при изменении рабочей
области
родительского
окна. Используется только для родительских окон.
WS_MAXIMIZE —
создаваемое окно будет отображено в максимально возможном виде.
WS_CAPTION —
окно имеет рамку и заголовок, а следовательно пользователь может перемещать его
при помощи мыши.
WS_BORDER —
окно имеет широкую рамку без заголовка. Используется при создании диалоговых
окон.
WS_DLGFRAME — окно имеет тонкую рамку без заголовка.
WS_VSCROLL
— окно имеет вертикальную полосу просмотра.
WS_HSCROLL
— окно имеет горизонтальную полосу просмотра.
WS_SYSMENU
— окно имеет системное меню.
WS_THICKFRAME — создаваемое окно
имеет рамку существенно заметной толщины.
WS_MINIMIZEBOX — окно имеет кнопку минимизации.
WS_MAXIMIZEBOX
— окно имеет кнопку максимизации.
Построение меню
Для
создания меню нужно проделать:
1. Задать структуру меню в файле
ресурсов,
последовательно определив пункты меню в виде текстовых
строк.
2.
Каждому пункту меню поставить в соответствие
уникальный идентификатор.
3.
Указать имя меню в структуре класса окна.
Определение
меню
Определение
меню в файле ресурсов должно иметь вид:
MenuName MENU [опции загрузки][опции памяти]
BEGIN
MENUITEM «Item1» IDM_Item1 [, опции]
MENUITEM «Item2» IDM_Item3 [, опции]
…
POPUP «Item3» [, опции]
BEGIN
MENUITEM «Item3-1» IDM_Item3-1
[, опции] MENUITEM «Item3-2» IDM_Item3-2 [, опции]
…
END
END
MenuName — имя
ресурса меню для обращения из подпрограммы.
Опции
загрузки определяет как следует поступить с ресурсом при загрузке приложения на
выполнение — сразу загрузить или при неоходимости.
Опции памяти определяют, как
Windows должна обращаться с сегментом памяти, куда загружается ресурс.
Пункты меню
определяются между словами BEGIN и END. Они могут быть двух видов: MENUITEM и
POPUP. Пункт типа MENUITEM является конечным пунктом меню. При выборе этого
пункта функции окна сообщения передается сообщение WM_COMMAND с идентификатором
пункта меню в качестве параметра. Пункт типа POPUP является заголовком подменю.
Опции пункта
меню могут комбинироваться. В качестве опций пункта меню могут быть следующие
значения:
GRAYED —
пункт меню не активен. Текст пункта меню отображается в сером цвете.
INACTIVE — пункт
меню не активен. Текст пункта меню отображается также как и в других пунктах.
MENUBREAK —
этот и следующий за ним пункты меню отображаются в новом столбце (если указан
для главного меню, то в новой строке).
MENUBARBREAK
— этот и следующий за ним пункты меню отображаются в новом столбце (если указан
для главного меню, то в новой строке); предыдущий и новый столбец разделяются
вертикальной чертой.
CHECKED —
пункт меню помечен галочкой, помещенной слева от него. Не действует для пунктов
главного меню.
SEPARATOR — определяет
разделитель, который выделяет в группы связанные списки меню.
HELP — пункт меню выравнивается по правой стороне меню.
Обьекты диалога
Обьекты диалога, в
состав которых входят кнопки, комбинированные блоки, элементы управления редактированием,
блоки списков, полосы прокрутки, статические элементы, являются с точки зрения
Windows обычными дочерними окнами.
Взаимодействие
между родительским окном (окном диалога) и обьектами диалога осуществляется
посредством сообщений. Когда пользователь производит какое-либо действие с
обьектом диалога, функции окна родителя передается сообщение WM_COMMAND, в
качестве параметра wParam которого передается индекс обьекта диалога, а в
качестве параметра lParam — специальная дополнительная информация.
Для того, чтобы сконструировать обьект диалога нужно:
1. Зарегистрировать класс окна диалога.
2. Создать дочернее
окно функцией CreateWindow, указав зарегистрированный класс окна.
3. В функции окна
обьекта диалога определить дескриптор дочернего окна при помощи функции
GetParent.
4. По тому или
иному действию пользователя уведомлять родительское окно соответствующими
сообщениями при помощи функции SendMessage.
Для обьектов
диалога как дочерних окон не требуется регистрировать класс окна — в Windows
определены стандартные классы окон — обьектов диалога: «button»,
«edit», «scrollbar», «listbox» и пр.
При
использовании стандартных классов Windows для создания обьекта диалога нужно
вызвать только функцию CreateWindow.
Рассмотрим основные обьекты диалога.
Кнопки
и переключатели
Кнопка
«Button» обычно используется для осуществления каких — либо
немедленных действий, без переключения или включения/выключения каких-либо
опций.
Переключатель «И» («CheckBox») используется как
переключатель опций вкл/выкл. Будучи соединенными
в группу
переключатели
реализуют логику «И».
Переключатель
«ИЛИ» («RadioButton») используется как переключатель опций
вкл/выкл. Будучи соединенными в группу переключатели реализуют логику
«ИЛИ».
Вокруг этих
трех основных типов имеются некоторые вариации. Ниже приводится описание
стандартных классов кнопок
и переключателей.
BS_PUSHBUTTON
— определяет кнопку с жирной рамкой.
BS_DEFPUSHBUTTON —
определяет кнопку с жирной рамкой. Обычно используется для определения действия
по умолчанию.
BS_CHECKBOX — определяет
квадратик, имеющий два
состояния: отмеченное (перечеркнут крестиком) и не
отмеченное
(квадратик пуст). В момент отметки рамка квадрата
выделяется
жирной
линией.
BS_AUTOCHECKBOX — тоже, что
предыдущий, только состояние кнопки при отметке отслеживается автоматически.
BS_RADIOBUTTON
— определяет круглую кнопку, которая может быть нажата (внутри окружности
жирная точка) и отпущена. Справа от кнопки может быть любой поясняющий текст.
BS_AUTORADIOBUTTON
— тоже, что и предыдущее, только при отметке кнопки пользователем ранее
сделанная отметка автоматически снимается.
BS_3STATE —
тоже, что и BS_CHECKBOX, только добавлено состояние, что действие или свойство
не действительно (обозначается штриховкой кнопки).
BS_AUTO3STATE
— тоже, что и предыдущее, только смена состояний поддерживается автоматически.
BS_GROUPBOX
— определяет рамку, охватывающую другие обьекты диалога.
BS_OWNERDRAW — обьект диалога, определяемый
пользователем,
который полностью берет на себя работу с ним.
BS_LEFTTEXT — используется для выравнивания
пояснительного
текста по левой стороне кнопок.
Кнопки посылают функции окна родителя
сообщение
WM_COMMAND,
в качестве параметра lParam указывается дескрипотор
органа
управления и код нотификации, служащий для
определения того,
какое
действие произвел пользователь с кнопкой.
Статические
обьекты диалога
Статические обьекты
диалога используются для отображения текста и отрисовки оформительских
примитивов. Обьекты этого класса могут быть созданы указанием функции
CreateWindow имени класса «static». Определены следующие классы
статических обьектов:
SS_LEFT — текст,
выравненный по левому краю;
SS_CENTER — центрированный текст;
SS_RIGHT — текст, выравненный по
правому краю;
SS_ICON — пиктограмма;
SS_BLACKRECT — прямоугольник цвета рамки
фона;
SS_GRAYRECT — прямоугольник
цвета фона окна;
SS_WHITERECT — прямоугольник цвета окна;
SS_BLACKFRAME — рамка цвета рамки окна;
SS_GRAYFRAME — рамка цвета фона окна;
SS_WHITEFRAME — рамка цвета окна;
SS_USERITEM — обьект,
определяемый пользователем.
Редактор
Редактор
«edit» позволяет создать дочернее окно и редактировать в нем текст.
По умолчанию редактор может редактировать только одну строку. Типы классов
редактора приведены ниже.
ES_LEFT — текст,
выравненный по левому краю;
ES_CENTER — центрированный текст;
ES_RIGHT — текст, выравненный
по правому краю;
ES_MULTILINE — определяет
многостраничный редактор;
ES_UPPERCASE — символы переводятся в
верхний регистр;
ES_LOWERCASE — символы переводятся в
нижний регистр;
ES_PASSWORD — стиль для ввода паролей;
ES_AUTOHSCROLL — автоскроллинг вправо на 10
позиций,
если курсор находится в конце строки;
ES_AUTOVSCROLL —
при нажатии ENTER в конце страницы текст автоматически сдвигается вверх на один
экран.
В качестве
параметров сообщения WM_COMMAND передаются идентификатор дочернего
окна-редактора, индекс дочернего окна и код сообщения. Код сообщения может
быть:
EN_SETFOCUS — редактору текста передали
фокус ввода;
EN_KILLFOCUS — редактор текста потерял фокус
ввода;
EN_CHANGE — содержимое редактора
изменено;
EN_ERRSPACE — переполнение буфера редактора;
EN_HSCROLL — нажата клавиша
горизонтального просмотра;
EN_VSCROLL — нажата
клавиша горизонтального просмотра.
Окно
список
Окно список
«listbox» представляет собой прямоугольник, внутри которого находится
листаемый список из текстовых строк. Пользователь может выделить строки списка
при помощи курсора. Окно-список используется для просмотра и выбора элементов
древовидного списка. Приведем типы окна списка.
LBS_NOTIFY —
родительское окно получает информацию о любом действии пользователя в списке;
LBS_SORT — строки сортируются по алфавиту;
LBS_MULTIPLESEL — множественный выбор с переключением
выбора для каждой строки;
LBS_OWNERDRAWFIXED
— отображение содержимого списка возлагается на функцию родительского окна, все
элементы списка могут иметь разную высоту;
LBS_OWNERDRAWVARIABLE
— отображение содержимого списка возлагается на функцию родительского окна, все
элементы списка могут иметь разную высоту;
LBS_HASSTRINGS — определяет
пользовательское окно-список с произвольными строками;
LBS_USETABSTOPS
— символы табуляции заменяются на пробелы;
LBS_MULTICOLUMN — определяет
многостолбцовый список; LBS_EXTENDEDSEL — в окне-списке можно делать
множественный выбор с помощью мыши и клавиши Shift.
В качестве
параметров сообщения WM_COMMAND передаются идентификатор дочернего
окна-редактора, индекс дочернего окна и код сообщения. Код сообщения может
быть:
LBN_ERRSPACE — списку не хватает памяти;
LBN_SELCHANGE — изменен выбор элемента;
LBN_DBLCLK —
выбор двойным нажатием кнопки мыши.
Комбинированный
список
Комбинированный список представляет сроку
редактирования, к которой привешено окно-список.
Стандартные
типы
обьекта:
CBS_SIMPLE — список
отображается все время, и текущее выделение отслеживается среди элементов
списка;
CBS_DROPDOWN — то
же, что и предыдущее, но список не отображается, пока пользователь на нажмет на
левую кнопку мыши;
CBS_DROPDOWNLIST —
то же, но строка редактирования заменяется на статическую текстовую строку, ее
нельзя редактировать;
CBS_OWNERDRAWFIXED
— элементы списка отрисовываются пользователем, их высота одинакова;
CBS_OWNERDRAWVARIABLE
— элементы списка отрисовываются пользователем, их высота одинакова;
CBS_AUTOHSCROLL —
горизонтальная прокрутка в строке редактирования;
CBS_SORT
— сортировка автоматическая элементов списка.
ОБМЕН ДАННЫМИ МЕЖДУ ПРИЛОЖЕНИЯМИ
Средства обмена данными между приложениями
Одним из средств, обеспечивающим программную
совместимость, является механизм обмена
данными между
различнами приложениями. Специальный почтовый ящик
(clipboard)
Windows позволяет пользователю
переносить информацию из одного приложения в другое, не заботясь об ее форматах
и представлении.
В отличие от профессиональных операциональных
операционных систем, где механизм
обмена данными между программами доступен только программисту, в Windows это
делается очень просто и наглядно для пользователя.
Механизм
обмена данных между приложениями — жизненно важное свойство многозадачной
среды. И в настоящее время
производители программного обеспечения
пришли уже к выводу,
что для переноса данных из одного приложения
в другое
почтового ящика уже недостаточно. Появился
новый, более
универсальный механизм — OLE ( Object Linking and Embedding )
— Встроенная объектная связь,
который позволяет переносить из одного приложения в другое разнородные данные.
Например, с помощью этого механизма данные, подготовленные в системе сетевого
планирования Time Line for Windows ( Symantec ), можно переносить в текстовый
процессор Just Write ( Symantec ), а затем, скажем, в генератор приложений
Object Vision (Borland). Правда, это уже нестандартное средство Microsoft
Windows, но тем не менее реализация OLE стала возможной именно в Windows.
Кроме
механизма почтового ящика, предназначенного, в основном, для пользователя,
программисту в Windows доступны специальные средства обмена данными между
приложениями.
Программным
путем можно установить прямую связь между задачами, например, принимая данные
из последовательного порта, автоматически помещать их, скажем, в ячейки
электронной таблицы Excel, средствами которой можно тут же отображать сложные
зависимости в виде графиков или осуществлять их обработку в реальном режиме
времени (этот механизм носит название динамического обмена данными — Dynamic
Data Exchange, DDE ).
Остановимся более подробно на механизме
динамического обмена данными между
приложениями.
Динамический обмен между приложениями
Мы обсудим основные
идеи работы DDE и использование библиотеки DDE в своих приложениях в следующих
разделах:
— Основные термины
— Несколько слов о DDEML
— Взаимодействие Клиента и Сервера
— Транзакции, функция обратного вызова DDE
( CallBack function )
— Service, item и topic имена
— Системный режим
— Инициализация
— Основное назначение и работа функции обратного
вызова
— Обработка строк
— Service имена.
Регистрация, фильтр
— Диалог между приложениями
— Простой диалог
— Сложный диалог
— Обмен данными между приложениями
— Классы транзакций
— Определение наличия ошибок при динамическом обмене
данными.
Основные термины
Клиентское
приложение DDE — приложение, которому необходимо установить диалог с сервером и
получить данные от сервера в процессе диалога.
DDE-диалог —
взаимосвязь между клиентским и серверным приложениями.
Сервер-приложение
— DDE приложение, которое передает данные клиенту в процессе диалога.
DDE-Транзакция
-обмен сообщениями или данными между клиентом и сервером.
Item имя — строка, идентифицирующая некоторое
множество данных, которое сервер в состоянии
передать
клиенту
в процессе диалога.
Service имя — строка, генерируемая сервером
и
используемая клиентом для установления
диалога.
Строковый указатель
— двойное слово, генерируемое операционной системой, идентифицирующее строку,
передающуюся в процессе динамического обмена данными.
Topic имя — строка, которая идентифицирует
тип
данных, необходимых клиентскому приложению при
динамическом
обмене данных.
Фильтр транзакции — флаг, который
препятствует
передаче нежелательных типов
транзакций в функцию
обратного
вызова.
Несколько
слов о DDEML
В Microsoft Windows
динамический обмен данных является формой связи, которая использует общие
области памяти для обмена данными между приложениями. Приложение может
использовать DDE в некоторый момент времени для передачи и получения новых
данных от сервера.
Механизм DDE
схож с механизмом почтового ящика, который является частью операционной системы
WINDOWS. Существует лишь незначительная разница в том, что почтовый ящик, в
большинстве случае, используется как буфер временного хранения информации. DDE
может быть инициализирован пользователем и в большинстве случаев продолжать
работать без его вмешательства.
Библиотека DDEML обеспечивает
пользователя набором средств, которые упрощают использование механизма DDE в
WINDOWS приложениях. Вместо того, чтобы обрабатывать, получать и передавать DDE
сообщения напрямую, приложения используют функции DDEML библиотеки. Библиотека
DDEML также обеспечивает работу со строками и разделяемыми данными,
генерируемыми DDE приложениями. Вместо того, чтобы использовать указатели на общие
области памяти, DDE приложения создают и обмениваются строковыми указателями,
которые идентифицируют строки и данные.
Уже существующие приложения,
использующие протокол DDE, основанный на сообщениях полностью совместимы с
теми, которые используют библиотеку DDEML. Вот почему приложение, использующее
DDE-протокол могут установить диалог и выполнять транзакции с приложениями,
использующими библиотеку DDEML.
Взаимосвязь между клиентом и сервером.
DDE возникает всегда между клиентским
приложением и серверным. Клиентское приложение инициализирует обмен данными
путем установления диалога с сервером и передачи транзакции. Транзакция
необходима для данных и обслуживания. Сервер отвечает на транзакцию и
обеспечивает клиента данными. Сервер может иметь сразу несколько клиентов в
одно и тоже время, в свою очередь, клиент может получать данные сразу от
нескольких серверов. Некоторое приложение одновременно может быть и клиентом и
сервером. В добавок к вышесказанному, клиент и сервер могут оборвать диалог в
любое удобное для них время.
Транзакции, функция обратного вызова DDE
(
CallBack function )
DDEML информирует
приложение об активности DDE путем передачи транзакции в функцию обратного
вызова данного приложения. DDE транзакция схожа с обыкновенным сообщением — это
именованная константа, сопровождаемая другими параметрами, которые содержат
дополнительную информацию о текущей транзакции.
DDEML передает транзакцию в
функцию обратного вызова приложения, которая выполняет некоторое действие
согласно типу и виду транзакции. Например, когда клиентское приложение пытается
установить дилог с сервером, клиент вызывает функцию DdeConnect. Это означает,
что DDEML должна послать транзакцию XTYP_CONNECT в функцию обратного вызова
сервера. Функция обратного вызова может позволять или не позволять установку
диалога, возвращая TRUE или FALSE DDEML.
Вспомогательные имена и другие названия
DDE сервер использует
три зарезервированных типа имен, расположенных иерархично: service, topic item
— уникально идентифицируют некоторое множество данных, которое сервер может
передать клиенту в процессе диалога.
Service имя
— это строка, которую генерирует сервер в те промежутки времени, в которые
клиент может установить диалог с сервером.
Topic имя —
это строка, которая идентифицирует логический контекст данных. Для сервера,
который манипулирует файлами, topic имена это просто названия
файлов; для других серверов — это
специфические имена
конкретного приложения. Клиент обязательно должен
указывать topic имя вместе с service именем,
когда он
хочет
установить диалог с сервером.
Item имя — это
строка, которая идентифицирует некоторое множество данных, которое сервер может
передать клиенту в процессе транзакции. Например, item имя может
идентифицировать ЦЕЛОЕ ( int, integer ), СТРОКУ ( string, char * ), несколько
параграфов текста, или BITMAP образ.
Все вышеуказанные имена позволяют клиенту
установить
диалог с сервером и получить от него данные.
Системный
режим
Системный режим
работы обеспечивает клиента всей необходимой информцией о сервере.
Для того,
чтобы определить, какие серверы доступны в данный момент времени, а также какой
информацией они могут обеспечить клиента, последний, находясь в начальном
режиме работы, должен установить имя устройства, равное NULL. Такой шаблон
диалога максимально увеличивает эффективность работы, а также работу с сервером
в системном режиме. Сервер, в свою очередь, должен поддерживать нижеописанные
item имена, а также другие, часто используемые клиентом:
SZDDESYS
ITEM TOPICS — список item имен, с которыми может работать сервер в данный
момент времени. Этот список может изменяться время от времени.
SZDDESYS
ITEM SYSITEMS — список item имен, с которыми может работать сервер в системном
режиме.
SZDDDESYS
ITEM STATUS — запросить текущий статус сервера. Обычно, данный запрос
поддерживается только в формате CF_TEXT и содержит строку типа Готов/Занят.
SZDDE ITEM ITEMLIST — список item имен,
поддерживаемых сервером в несистемном режиме
работы. Этот
список
может меняться время от времени.
SZDDESYS ITEM FORMATS — список строк,
представляющий собой список всех форматов почтового
ящика,
поддерживаемых сервером в данном диалоге.
Например,
CF_TEXT
формат представлен строкой TEXT.
Инициализация
Перед вызовом любой функции DDEML, приложение
должно вызвать функцию DdeInitialize. Эта функция получает идентификатор копии
данного приложения, регистрирует функцию обратного вызова приложения
посредством DDEML и указывает флаг фильтра транзакции для функции обратного
вызова.
Каждое приложение или DLL
должно содержать
идентификатор своей копии, например, в параметре
idInst.
Он необходим любой функции DDEML.
Это очень легко поддается объяснению: назначение DDEML — поддержка механизма
DDE в приложениях, несколько копий которых может быть запущено в данный момент
времени. Однако приложение НЕ МОЖЕТ использовать более одной копии DDEML.
Фильтр транзакции оптимизирует эффективность
системы путем предотвращения
передачи нежелательных типов транзакций в функцию обратного вызова. Приложение
устанавливает фильтр транзакции при вызове функции DdeInitialze. Приложение
должно указать флаг фильтра транзакции для каждого типа транзакции, которые не
будут обрабатываться в функции обратного вызова. Однако любое приложение может
изменить фильтр транзакции путем дополнительного вызова функции DdeInitialize.
Приведем пример инициализации DDE-диалога.
DWORD idInst = 0;
HINSTAINCE
hInst;
DdeInitialize( &idIns, //
Копия приложения
( PFNCALLBACK ) DdeCallback, //
Адрес CallBack функции CBF_FAIL_EXECUTES | // Фильтр XTYPE_EXECUTE
CBF_SKIP_ALLNOTIFICATIONS, 0 );// Фильтр NOTIFICATIONS
Каждое приложение должно вызывать функцию
DdeUninitialize, когда оно больше не
собирается
использовать DDEML. Эта функция прекращает текущий
диалог и освобождает ресурсы DDEML, предоставленные системой для установления
диалога.
Основное назначение и работа функции обратного вызова
Приложение, которое использует DDEML,
должно
содержать функцию обратного
вызова, которая обрабатывает события, полученные приложением. DDEML уведомляет
приложение о таких событиях путем посылки транзакций в функцию обратного вызова
данного приложения.
В зависимости от флага
фильтра транзакции,
сформированного при вызове функции
DdeInitialize, функция обратного вызова получает отсортированные транзакции вне
зависимости от того, является ли данное приложение клиентом, сервером или тем и
другим одновременно. Следующий пример демонстрирует наиболее типичное использование
функции обратного вызова.
HDDEDATA CALLBACK DdeCallback(
uType, uFmt, hconv, hsz1, hsz2, hdata, dwData1, dwData2 )
UINT uType; // Тип
транзакции
UINT uFmt; // Формат
почтого ящика
HCONV hconv; // Идентификатор
диалога
HSZ hsz1; // Идентификатор
строки #1
HSZ
hsz2; // Идентификатор строки #2
HDDEDATA hdata; // Идентификатор
глобального объекта памяти DWORD dwData1; // Данные текущей транзакции #1
DWORD dwData2; // Данные текущей
транзакции #2
switch (uType)
case XTYP_REGISTER:
case XTYP_UNREGISTER:
. . .
return
(HDDEDATA) NULL;
case XTYP_ADVDATA:
. . .
return (HDDEDATA) DDE_FACK;
case XTYP_XACT_COMPLETE:
. . .
return
(HDDEDATA) NULL;
case XTYP_DISCONNECT:
. . .
return
(HDDEDATA) NULL;
default:
return (HDDEDATA) NULL;
Параметр uType идентифицирует тип посланной
транзакции в функцию обратного вызова при помощи
DDEML. Значения оставшихся параметров зависят от типов транзакции. Типы
транзакций будут обсуждены нами в разделе «Обработка Транзакций».
Обработка строк
Для того, чтобы работать в режиме
диалога,
большинство DDEML функций требуют
наличия доступа к строкам. Например, клиент должен в явном виде указывать
service и topic имена, когда приложение вызывает функцию DdeConnect для
установления диалога с сервером. Приложение указывает строку путем передачи ее
идентификатора в соответствующее место (также как и в случае указателя на DDEML
функцию). Идентификатор строки — это двойное слово, определяемое системой.
Приложение может получить
идентификатор строки
путем вызова соответствующей функции
DdeCreateStringHandle. Эта функция
регистрирует строку в системе и возвращает ее идентификатор приложению.
Следующий пример получает идентификатор строки для строк System topic и
Service-name.
HSZ hszServName;
HSZ hszSysTopic;
. . .
hszServName = DdeCreateStringHandle(
idInst, //
Копия приложения
«MyServer», // Строка
для регистрации
CP_WINANSI); //
Кодовая страница Windows ANSI
hszSysTopic = DdeCreateStringHandle(
idInst, // Копия приложения
SZDDESYS_TOPIC, // Строка для
регистрации CP_WINANSI); // Кодовая страница
Windows ANSI
.
. .
Параметр idInst содержит идентификатор,
возвращенный
функцией DdeInitialize.
Функция обратного
вызова получает один или более строковых идентификаторов при обработке
большинства DDE-транзакций. Например, сервер получает два идентификатора строк
в процессе транзакции типа XTYP_REQUEST: один идентификатор — это строка,
описывающая topic имя, а другой — item.
Приложение может получать длину строки,
соответствующую идентификатору строки и
копировать эту
строку в некоторый буфер, предварительно
зарезервированный
приложением.
Все вышеуказанные
действия можно проделать при помощи вызова функции DdeQueryString, как
продемонстрировано в следующем примере:
DWORD idInst;
DWORD cb;
HSZ hszServ;
PSTR pszServName;
. . .
cb = DdeQueryString(idInst, hszServ, (LPSTR) NULL, 0,
CP_WINANSI) + 1;
pszServName = (PSTR) LocalAlloc(LPTR, (WORD) cb);
DdeQueryString(idInst, hszServ, pszServName, cb,
CP_WINANSI);
.
. .
Итак, функция DdeQueryString создает
строку,
используя строковый идентификатор,
а затем функция
DdeCreateStringHandle создает
строковый идентификатор из строки. Следует отметить, что два идентификатора НЕ
СУЩЕСТВУЮТ в одно и тоже время.
DWORD idInst;
DWORD cb;
HSZ hszInst, hszNew;
PSZ pszInst;
. . .
DdeQueryString(idInst, hszInst, pszInst, cb,
CP_WINANSI); hszNew = DdeCreateStringHandle(idInst, pszInst, CP_WINANSI); //
hszNew != hszInst !
.
. .
При возвращении некоторого значения
функцией
обратного вызова идентификатор строки портится.
В
приложении можно сохранить идентификатор при помощи
функции DdeKeepStringHandle и использовать этот идентификатор после вызова
функции CallBack.
Когда приложение вызывает функцию
DdeCreateStringHandle и указывает
строку, которая уже существует, система помещает эту строку в таблицу и
генерирует некоторый идентификатор, необходимый для быстрого и корректного
доступа к этой строке. Система также сохраняет количество использования каждой
строки в этой же таблице.
Если
приложение пытается определить строку, которая уже существует в таблице,
система просто увеличивает ее количество использования, а при вызове функции
DdeFreeStringHandle, соответственно уменьшает на 1. Строка удаляется из
таблицы, когда ее количество использования равно 0. Service имена. Регистрация,
фильтр.
DDEML
позволяет регистрировать service имена для сервера и не посылать транзакцию
вида XTYP-CONNECT для неподдрерживаемых service имен в функцию обратного
вызова. Остановимся на обсуждении этого вопроса более подробно.
При
регистрации service имен в DDEML, сервер информирует другие DDE-приложения в
системе о том, что текущий сервер доступен для обмена данными.
Сервер
регистрирует service имя путем вызова функции DdeNameService и указывает
идентификатор строки, связанной с именем.
При
получении вышеуказанных данных DDEML посылает транзакцию вида XTYP-REGISTER в
функцию обратного вызова каждого DDEML-приложения в системе (за исключением
только тех, которые указали флаг фильтрации GBF_SKIP_REGISTRATION в функции
DdeInitialize).
Транзакция XTYP_REGISTER передает два
идентификатора строк в функцию обратного вызова:
первый из
них указывает на основное service имя, а
второй — на
строку,
содержащую системную информацию.
Обычно клиент
использует основное service имя в списке всех доступных серверов так, что
конечный пользователь может выбрать необходимый ему сервер, перемещаясь по
этому списку. Также клиент использует системную информацию для
непосредственного установления диалога с сервером.
Сервер может
использовать функцию DdeNameServise для того, чтобы сбросить регистрацию
service имени. Это оэначает, что DDEML необходимо послать транзакцию вида
XTYP_UNREGISTER в оставшиеся DDE-приложения с информацией о том, что они больше
не смогут использовать данное service имя для установления диалога.
Сервер должен вызывать функцию
DdeNameServise для регистрации его service имени сразу после вызова функции
DdeInitialize. Сервер должен сбрасывать свое service имя сразу после вызова
функции DdeUninitialize. Помимо регистрации service имени функция
DdeNameService поэволяет включать или выключать серверу ее собственный фильтр
service имени.
Когда сервер выключает фильтр,
DDEML посылает транзакцию вида XTYP_CONNECT в функцию обратного вызова сервера
вне зависимости от того совпадают ли вызываемое service имя с
зарегистрированным или нет при вызыве клиентом функции DdeConnect. Когда сервер
включает фильтр, транзакция вида XTYP_CONNECT посылается лишь в том случае,
когда вызываемое service имя совпадает с зарегистрированным.
По умолчанию, фильтр включен лишь
тогда, когда приложение вызывает функцию DdeInitialize. Это необходимо для
предотвращения генерации транзакции XTYP_CONNECT до того как созданы
необходимые идентификаторы строк. Сервер может выключить фильтр путем установки
флага DNS_FILTEROFF при вызове функции DdeNameService. Флаг DNS_FILTERON
включает фильтр.
Диалог между приложениями
Диалог между клиентом и сервером всегда
устанавливается по требованию клиента. Когда
диалог
установлен, оба партнера получают идентификатор,
который
описывает данный диалог.
Партнеры используют этот идентификатор
в
большинстве функций DDEML для посылки транзакций и
для их
обработки. Клиенту может потребоваться диалог как
с одним
сервером,
так и с несколькими.
Рассмотрим подробно как приложение
устанавливает диалог и получает информацию о уже существующих каналах связи.
Простой Диалог
Клиентское
приложение устанавливает простой диалог с сервером путем вызова функции
DdeConnect и определяет идентификаторы строк, которые содержат всю необходимую
информацию о service имени текущего сервера и интересущем клиента в данный
момент topic имени.
DDEML
отвечает на вызов этой функции посылкой соответствующей транзакции XTYP_CONNECT
в функцию обратного вызова каждого доступного в данный момент времени сервера,
зарегистрированное имя которого совпадает с именем, переданным при помощи
функции DdeConnect при условии, что сервер не отключал фильтр service имени
вызовом функции DdeServiceName.
Сервер может также установить фильтр на
XTYP_CONNECT транзакцию заданием
соответствующего флага CBF_FAIL_CONNECTIONS при вызове функции DdeInitialize.
В процессе
обработки транзакции типа XTYP_CONNECT DDEML передает полученные от клиента
service и topic имена серверу. Сервер должен проверить эти имена и возвратить
TRUE, если он в состоянии работать
с такими именами, и FALSE в противном случае. Если ни один из существующих
серверов не отвечает на CONNECT-запрос клиента, функция DDeConnect возвращает
ему NULL с информацией о том, что в данный момент времени НЕ возможно
установить диалог.
Однако, если
сервер возвратил TRUE, то диалог был успешно установлен и клиент получает
идентификатор диалога
— двойное слово, посредством
которого и ведется обмен данными с сервером.
Затем сервер получает транзакцию вида
XTYP_CONNECT_CONFIRM (в случае,
если он НЕ описывал флаг фильтра CBF_FAIL_CONFIRMS при вызове соответствующей
функции).
В нижеприведенном примере
производится попытка
установить диалог с сервером, который в состоянии
работать с service именем ‘My Server’ в системном режиме. Считаем, что
параметры hszSysTopic и hszServName уже предварительно созданы нами ранее.
HCONV hConv;
HWND hwndParent;
HSZ hszServName;
HSZ hszSysTopic;
. . .
hConv = DdeConnect(
idInst, //
Копия приложения
hszServName, // Идентификатор service-имени
handle hszSysTopic, // Идентификатор system-topic-имени (PCONVCONTEXT) NULL); // Используем
контекст по умолчанию
if( hConv == NULL )
MessageBox( hwndParent, «MyServer НЕ
доступен!»,
(LPSTR) NULL, MB_OK );
return FALSE;
.
. .
В этом примере
функция DdeConnect заставляет DDEML посылать транзакцию вида XTYP_CONNECT в
функцию обратного вызова сервера MyServer.
А теперь
приведем пример функции обратного вызова сервера, который обрабатывает
транзакцию XTYP_CONNECT и сравнивает свое зарегистрированное имя с именем,
полученным от клиента. Как уже было отмечено ранее, если они совпадают, то
сервер в состоянии установить диалог с клиентом.
#define CTOPICS 5
HSZ hsz1; //
Идентификатор строки,
полученный
от DDEML.
HSZ
ahszTopics[CTOPICS]; // Массив поддреживаемых topic имен int
i; // Счетчик цикла
.
. // Для обработки транзакций используем стандартную
ANSI C . // конструкцию switch —> case —> default.
.
case XTYP_CONNECT:
for (i = 0; i < CTOPICS; i++)
if (hsz1 == ahszTopics[i])
return TRUE; // Установка
диалога
return FALSE; // Topic имя НЕ
поддерживается, диалог запрещен.
.
. // Обработка других типов транзакций.
.
Если сервер
возвращает TRUE в ответ на транзакцию XTYP_CONNECT, DDEML посылает транзакцию
вида XTYP_CONNECT_CONFIRM в функцию обратного вызова данного сервера. Обработав
эту транзакцию, сервер может получить идендификатор диалога.
Вместо
конкретного имени сервера клиент может установить шаблон диалога путем
установки идентификаторов service и topic имен в NULL при вызове функции
DdeConnect.
Если хотя бы один из вышеперечисленных
идентификаторов равен NULL, DDEML посылает
транзакцию типа
XTYP_WILDCONNECT в функцию
обратного вызова всех активных в данный момент DDE-приложений (исключения
составляют лишь те, кто при вызове соответствующей функции указал флаг
фильтрации XTYP_WILDCONNECT).
Любое
сервер-приложение должно ответить на данную транзакцию и возвратить указатель
на массив структур типа HSZPAIR, оканчивающийся нулем.
Если сервер-приложение НЕ вызывает функцию
DDeNameService для регистрации
собственного service имени в системе и фильтр обработки транзакций включен, то
сервер НЕ получит транзакцию вида XTYP_WILDCONNECT.
Вышеописанный массив должен содержать одну
структуру для каждого service и
topic имен. DDEML выбирает одну пару из массива для установления диалога и
возвращает его идентификатор клиенту. Затем DDEML посылает серверу транзакцию
вида XTYP_CONNECT_CONFIRM (исключения составляют лишь те серверы, которые при инициализации
установили фильтр обработки транзакций).
Продемонстируем использование транзакции вида
XTYP_CONNECT.
#define
CTOPICS 2
UINT uType;
HSZPAIR ahszp[(CTOPICS + 1)];
HSZ
ahszTopicList[CTOPICS];
HSZ hszServ, hszTopic;
WORD i,
j;
if (uType == XTYP_WILDCONNECT)
// Сканируем список topic имен и создаем массив
// структур типа HSZPAIR
j = 0;
for (i = 0; i < CTOPICS; i++)
if (hszTopic == (HSZ) NULL
||
hszTopic == ahszTopicList[i])
ahszp[j].hszSvc = hszServ;
ahszp[j++].hszTopic = ahszTopicList[i];
//
// Последний элемент массива всегда NULL.
//
ahszp[j].hszSvc = NULL;
ahszp[j++].hszTopic
= NULL;
//
// Возвращаем дискриптор глобального объекта памяти,
// содержащий структуры типа HSZPAIR.
//
return DdeCreateDataHandle(
idInst, // Копия приложения
(LPBYTE)
&ahszp, // Указатель на массив типа HSZPAIR
sizeof(HSZ) * j, // Длина массива
0, //
Начальное смещение
(HSZ) NULL, // item-имя не
существует
0, // формат
item-имени также
// не существует
0); //
Возлагаем все работу
// с массивом на систему
Любой сервер или
клиент может оборвать диалог в любое время путем вызова функции DdeDisconnect.
Это означает, что партнер по обмену данными получает транзакцию типа
XTYP_DISCONNECT в функции обратного вызова (если, конечно, партнер не установил
фильтр обработки транзакций вида CBF_SKIP_DISCONNECTIONS).
Обычно приложение реагирует на транзакцию
XTYP_DISCONNECT вызовом функции
DdeQueryInfo для получения информации о прекращенном диалоге. После того, как
функция обратного вызова обработала транзакцию типа XTYP_DISCONNECT,
идентификатор диалога больше не существует.
Клиентское
приложение, которое получает транзакцию типа XTYP_DISCONNECT в своей функции
обратного вызова может попытаться возобновить диалог при промощи вызова
функции DdeReconnect. Клиентское приложение
может вызывать
эту функцию только находясь внутри своей
собственной
функции
обратного вызова.
Сложный
диалог
Клиентское
приложение может использовать функцию DdeConnectList для того, чтобы определить
какие сервер-приложения существуют в системе в данный момент времени.
Клиент
обязательно должен описывать service и topic имена, когда он вызывает эту
функцию; это означает, что DDEML должна послать транзакцию вида XTYP_CONNECT
все функции обратного вызова всех имеющихся в данный момент сервер-приложений,
чьи зарегистрированные имена совпадают с именами, указанными клиентом
(исключение составляют лишь те серверы, которые фильтруют получаемые
транзакции).
В добавление
к вышесказанному, можно отметить, что клиент, при вызове функции
DdeConnectList, может указать NULL в качестве service или topic имени, либо же
сразу для обоих. Все доступные в системе серверы, чьи зарегистрированные имена
совпадают с именами, указанными клиентом, отвечают на его запрос. Диалог устанавливается
со всеми такими серверами, даже если в системе запущено одно и тоже
сервер-приложение несколько раз.
Клиент может использовать функции
DdeQueryNextServer и
DdeQueryConvInfo для того, чтобы понять, какой сервер находится в списке,
полученный при вызове функции DdeConnectList. DdeQueryNextServer возвращает
идентификатор диалога для следующего сервера, находящегося в списке;
DdeQueryConvInfo заполняет структуру CONVINFO информацией о диалоге.
Клиент может
сохранить полученные идентификаторы диалогов и отказаться от просмотра
оставшихся серверов в списке.
Приведем пример использования функции
DdeConnectList для установления диалога
со всеми
серверами, которые поддерживают имя ‘system
topic’, затем
будем использовать функции DdeQueryConvInfo
и
DdeQueryNextServer для получения
их идентификаторов
service имен, одновременно не забывая сохранить
последние
во
временном буфере.
HCONVLIST hconvList; // Список диалогов
DWORD idInst; // Дискриптор приложения
HSZ hszSystem; // System
topic
HCONV hconv = NULL; // Идентификатор
диалога
CONVINFO ci; // Информация
о диалоге
UINT cConv = 0; // Количество
идентификаторов диалогов
HSZ
*pHsz, *aHsz; // Указатель на идентификатор строки
// Присоединяемся ко всем серверам, поддерживающим
//
System topic.
hconvList = DdeConnectList(idInst, NULL, hszSystem,
NULL,
NULL);
//
Вычисляем количество серверов в списке.
while((hconv = DdeQueryNextServer(hconvList,hconv)) !=
NULL)
cConv++;
//
Выделяем буфер для сохранения идентификаторов строк.
hconv = NULL;
aHsz =
(HSZ *) LocalAlloc(LMEM_FIXED, cConv * sizeof(HSZ));
//
Копируем идентификатор строки в буфер.
pHsz = aHsz;
while((hconv = DdeQueryNextServer(hconvList,hconv)) !=
NULL)
DdeQueryConvInfo(hconv,
QID_SYNC, (PCONVINFO) &ci);
DdeKeepStringHandle(idInst, ci.hszSvcPartner);
*pHsz++ = ci.hszSvcPartner;
.
. // Используем идентификатор: ‘общаемся’ с сервером.
.
//
Освобождаем память и прекращаем диалог.
LocalFree((HANDLE) aHsz);
DdeDisconnectList(hconvList);
Приложение может
оборвать индивидуальный диалог, находящийся в списке диалогов путем вызова
функции DdeDisconnect; приложение может оборвать все диалоги, находящиеся в
списке путем вызова функции DdeDisconnectList.
Обе вышеуказанные функции указывают DDEML
о
необходимости посылки транзакции вида
XTYP_DISCONNECT во
все функции партнеров по диалогу данного
приложения (в
случае использования функции
DdeDisconnectList будет
посылаться транзакция XTYP_DISCONNECT для каждого
элемента
в
списке диалогов).
Обмен
данными между приложениями
Так как DDE
использует области памяти для передачи данных из одного приложения в другое,
DDEML обеспечивает конечного программиста функциями, при помощи которых
DDE-приложения могут создавать и обрабатывать DDE-объекты.
Весь спектр
транзакций, который вызывает обмен данными, требует от приложения,
экспортирующего их, создания некоторого буфера, содержащего эти данные, а затем
вызова функции DdeCreateDataHandle.
Эта функция
создает DDE-объект, копирует данные из буфера в этот объект и возвращает
идентификатор данных для
данного приложения.
Идентификатор
данных-это двойное слово, которое использует DDEML для обеспечения доступа к
данным в DDE-объекте.
Для того,
чтобы разделять данные в DDE-объекте, приложение передает идентификатор данных
DDEML, а затем DDEML передает его в функцию обратного вызова приложения,
получающего данные.
В
нижеприведенном примере показано, как создать DDE-объект и получить его
идентификатор. В процессе обработки транзакции типа XTYP_ADVREQ, функция
обратного вызова конвертирует текущее время в ASCII строку, копирует строку в
вспомогательный буфер, а затем создает DDE-объект, содержащий вышеуказанную
строку. Функция обратного вызова возвращает идентификатор DDE-объекта DDEML,
которая передает этот идентификатор клиентскому приложению.
typedef struct tagTIME
INT hour; // 0 — 11 формат времени для часов.
INT hour12; // 12-ой формат.
INT hour24; // 24-ой формат.
INT minute;
INT second;
INT ampm; // 0 —> AM , 1 —> PM
TIME;
HDDEDATA EXPENTRY DdeCallback
(uType, uFmt, hconv, hsz1, hsz2, hdata, dwData1,
dwData2)
UINT uType;
UINT uFmt;
HCONV hconv;
HSZ hsz1;
HSZ hsz2;
HDDEDATA hdata;
DWORD dwData1;
DWORD dwData2;
CHAR
szBuf[32];
switch (uType)
case
XTYP_ADVREQ:
case XTYP_REQUEST:
if ((hsz1 == hszTime && hsz2 == hszNow)
&&
(uFmt == CF_TEXT))
//
Копируем строку в буфер.
itoa(tmTime.hour, szBuf, 10);
lstrcat(szBuf,
«:»);
if (tmTime.minute < 10)
lstrcat(szBuf, «0»);
itoa(tmTime.minute, &szBuf[lstrlen(szBuf)], 10);
lstrcat(szBuf,
«:»);
if (tmTime.second < 10)
strcat(szBuf,
«0»);
itoa(tmTime.second, &szBuf[lstrlen(szBuf)], 10);
szBuf[lstrlen(szBuf)]
= ‘\0’;
// Создаем глобальный объект и возвращаем его
//
идентификатор
return (DdeCreateDataHandle(
idInst, //
копия приложения
(LPBYTE) szBuf, // исходный буфер
lstrlen(szBuf) + 1,
0, //
смещение от его начала
hszNow, //
item-имя
CF_TEXT, //
формат почтого ящика
0));
else return (HDDEDATA) NULL;
.
. // Обработка других типов транзакций.
.
Клиентское приложение получает указатель на
DDE-объект путем передачи
идентификатора данных функции DdeAccessData. Указатель, возвращаемый этой
функцией, обеспечивает доступ к данным в формате ‘ТОЛЬКО НА ЧТЕНИЕ’. Клиент
должен просмотреть полученные данные при помощи этого указателя и вызвать
функцию DdeUnaccessData для его уничтожения. Клиент может скопировать
полученные данные в заранее приготовленный буфер посредством вызова функции
DdeGetData.
В следующем
примере мы получим указатель на DDE-объект, сохраним его в параметре hData,
скопируем содержимое во временный буфер и уничтожим указатель:
HDDEDATA hdata;
LPBYTE lpszAdviseData;
DWORD cbDataLen;
DWORD i;
char
szData[32];
. . .
case XTYP_ADVDATA:
lpszAdviseData = DdeAccessData(hdata, &cbDataLen);
for (i = 0; i < cbDataLen; i++)
szData[i] = *lpszAdviseData++;
DdeUnaccessData(hdata); return (HDDEDATA) TRUE;
. . .
Обычно, когда
приложение, создающее идентификатор данных, передает его DDEML, этот идентификатор
портится внутри вышеуказанного приложения. В этом нет ничего страшного, если
сервер должен разделять данные только с одним клиентом. Если же сервер должен
разделять данные сразу с несколькими клиентами одновременно, ему придется
указывать флаг HDATA_APPOWNED при вызове функции
DdeCreateDataHandle.
Это делает
возможным получение прав собственности на DDE-объект сервер-приложения и
предотвращает порчу идентификатора данных DDEML. Приложение может передавать
DDEML идентификатор данных любое количество раз, однако вызывать функцию
DdeCreateDataHandle можно лишь однажды.
Если
приложение указывает флаг HDATA_APPOWNED в параметре atCmd при вызове функции
DdeCreateDataHandle, оно обязательно должно вызывать функцию DdeFreeDataHandle
для очистки памяти вне зависимости от того, передавался ли идентификатор данных
DDEML или нет. Перед тем как оборвать диалог, приложение должно вызывать
функцию DdeFreeDataHandle для очистки всех созданных идентификаторов, но
которые так и не были переданы DDEML.
Если приложение
еще не передало идентификатор DDE-объекта DDEML, то оно может добавить данные к
уже существующему объекту или полностью заменить их в нем. Все эти сервисные
функции обслуживаются функцией DdeAddData.
Обычно приложение использует эту
функцию для новой инициализации старых не уничтоженных DDE-объектов. После
того, как приложение передает идентификатор данных DDEML, DDE-объект,
идентифицирующий этот идентификатор НЕ может быть изменен, однако он может быть
уничтожен.
Классы транзакций
DDEML содержит
четыре класса транзакций. Каждый класс описывается некоторой константой,
начинающейся с префикса XCLASS. Эти классы полностью описаны в соответствующем
заголовочном файле DDEML. Каждая константа является комбинацией типов
транзакций и передается функции обратного вызова приложения, получающего данные
от сервера в текущий момент времени.
Вышеописанные классы определяют возвращаемое
значение, которое ожидает получить DDEML от
функции
обратного вызова приложения,
обрабатывающего данную
транзакцию. Ниже представлена сводная таблица
возвращаемых
значений функции обратного вызова,
а также типов
транзакций, связанных с каждым из четырех
классов
транзакций.
Класс |
Возвращ |
е значение |
Транзакция |
||
XCLASS_BOOL |
TRUE или FALSE |
TYP_ADVSTART TYP_CONNECT |
|||
XCLASS_DATA |
Идентификатор данных, CBR_BLOCK или NULL |
XTYP XTYP XTYP |
ADVREQ REQUEST WILDCONNECT |
||
XCLASS_FLAGS |
Флаг транзакций: DDE_FACK DDE_FNOTPROCESSED DDE_FBUSY |
XTYP_ADVDATA XTYP_EXECUTE XTYP_POKE |
|||
XCLASS_NOTIFICATION |
Не возвращает |
XTYP XTYP XTYP XTYP XTYP XTYP XTYP |
ADVSTOP CONNECT_CONFIRM DISCONNECT ERROR REGISTER UNREGISTER XACT_COMPLETE |
||
Определение ошибок
Если исполнение
DDEML-функции завершилось аварийно, приложение может вызвать функцию DdeGetLastError
для определения причины сбоя. DdeGetLastError возвращает код ошибки,
по-которому можно определить причины фатального завершения DDEML-функции.
-49-
СПИСОК
ЛИТЕРАТУРЫ
1. НОРТОН П., ЙАО П. Программирование на
Borland C++ в среде Windows: В 2-х томах. Киев:»Диалектика», 1993.
2. Гладков С.А. Фролов Г.В. Программирование в
Microsoft Windows:
В
2-х частях. М.:»ДИАЛОГ-МИФИ», 1992.
3. Microsoft Windows Software Development Kit. Version
3. Programmer’s Reference, Programming Tools, Windows Extensions.
4.
Charles Petzold. Programming Windows. Microsoft Press.
5. Библия Windows 3.X. М.: И.В.К. — Софт,
1992.
Здравствуйте, начинающие пользователи компьютера! Вместе с вами постараемся разобраться в том, что такое Windows и зачем оно нам нужно.
Windows — это операционная система, сделанная корпорацией Microsoft (Майкрософт). Операционная система (ОС) — это главная программа, которая запускается при включении компьютера. Она позволяет пользователям компьютера работать с файлами, пользоваться Интернетом и запускать в окошках другие программы, игры, фильмы, музыку. Windows переводится как «окна».
Операционная система Windows платная. Если вы покупаете компьютер с уже установленной Windows, то часть денег вы платите за операционную систему. Для подтверждения того, что вы являетесь владельцем Windows, может потребоваться лицензионный ключ. Такое бывает, например, если вы переустановили Windows. Лицензионный ключ это набор символов вида «XXXXX-XXXXX-YYYYY-YYYYY-ZZZZZ». Он может быть указан в наклейке на корпусе вашего компьютера или на диске с Windows. Перепишите лицензионный ключ на листок и сохраните, может пригодиться. Наклейка выглядит примерно так:
Вместе с Windows на компьютер устанавливается набор программ, необходимых для повседневного использования:
- Калькулятор.
- Редактор Notepad (блокнот) для работы с текстовыми файлами.
- Редактор WordPad для работы с документами.
- Редактор картинок Paint.
- Браузер Edge или Internet Explorer для работы в Интернет.
- Проигрыватель видео и музыки.
- Антивирус от Microsoft (защитник).
- другие программы и даже игры.
Можно устанавливать другие программы и игры из Интернета или с дисков. Такие программы также могут быть платные.
История и разновидности Windows
Даты выхода ОС Windows для персональных компьютеров (ПК):
- Windows 1.0 (1985)
- Windows 2.0 — 2.1 (1987-1988)
- Windows 3.0 — 3.2 (1990-1994)
- Windows NT 3.1 — 3.51 (1993-1995)
- Windows 95 — Windows 4.0 (1995)
- Windows NT 4.0 (1996)
- Windows 98 — Windows 4.1 (1998)
- Windows 2000 — Windows NT 5.0 (1999)
- Windows ME — Windows 4.9 (2000)
- Windows XP — Windows NT 5.1 — 5.2 (2001-2005)
- Windows Vista — Windows NT 6.0 (2006)
- Windows 7 — Windows NT 6.1 (2009)
- Windows 8 — Windows NT 6.2 (2012)
- Windows 8.1 — Windows NT 6.3 (2013)
- Windows 10 — Windows NT 10.0 (2015)
- Windows 11 — Windows NT 10.0 (2021)
В последних версиях Windows есть сборки, отличающиеся функционалом и ценой:
- Home Edition — сборка для домашнего использования с простой конфигурацией.
- Professional — сборка с дополнительным функционалом для более продвинутых пользователей.
- Enterprise — корпоративная версия для организаций.
Интерфейс Windows
Интерфейс — это внешний вид операционной системы. У отдельных частей интерфейса есть свои названия.
- Рабочий стол — основное место, занимает большую часть экрана. Здесь можно располагать ярлыки.
- Панель задач — здесь можно закреплять программы, с которыми вы чаще всего работаете. Здесь же показываются открытые в данный момент программы, выбранный язык, дата и время.
- Кнопка ПУСК — при нажатии открывается меню для быстрого доступа к программам.
- Ярлык — картинка, при нажатии на которые открывается соответствующая программа или документ.
Кнопка ПУСК может также находиться на вашей клавиатуре.
Внешний вид меню ПУСК:
Ссылки
Linux — что это такое?
Разновидности операционных систем
Рассмотрим какие ещё бывают операционные системы, кроме Windows. Речь пойдёт об операционных системах для персональных компьютеров. Не будем акцентировать внимание на операционных системах для серверов, мобильных телефонов и специализированной техники.
- MacOS — операционная система от компании Apple. Установлена как основная операционная система на продуктах компании. Платная.
- Linux — операционная система распространяется бесплатно. Сложна в освоении, поэтому мало распространена. Имеет несколько разновидностей (модификаций), которые поддерживаются различными компаниями и сообществами, например:
- Ubuntu
- Fedora
- Elementary OS
- Chrome OS
- OpenSuse
- Linux Mint
- Mageia
- PCLinuxOS
- Manjaro
- Arch
- Puppy
- и ещё много других
- FreeBSD — современная операционная система семейства UNIX, распространяется свободно.
Интересные факты об операционных системах
На одном компьютере может быть установлено одновременно несколько операционных систем. В этом случае при включении компьютера вас спросят, какую операционную систему нужно загрузить.
Microsoft Windows и ядро Linux могут быть запущены одновременно на одной и той же машине с помощью специального программного обеспечения CoLinux. В windows 10 уже появилась встроенная подсистема linux.
Для обучения пользователей обращению с мышкой в Microsoft разработали и внедрили в Windows компьютерную версию игры Reversi. Таким образом пользователи привыкали использовать мышь, кликая с её помощью на фишки. Задумайтесь, для чего сделана игра «сапёр»?
На рекламу Windows 95 было потрачено более 300 миллионов долларов.
В Windows нельзя создать папку с названиями con, prn, aux, nul. Это ограничение восходит относят к временам операционной системы MS-DOS. Некоторые слова были зарезервированы для обозначения устройств ввода-вывода, поэтому нельзя создать папки с такими именами.
Линус Торвальдс использовал операционную систему Minix, однако был недоволен многими ограничениями в ней и решил написать свою систему. Когда была выпущена более-менее стабильная версия, интерес Торвальдса к проекту угас, и он был готов его забросить. Но в тот же период он случайно испортил раздел на жёстком диске, где стояла Minix, и вместо её переустановки Торвальдс решил всё-таки закончить начатое. Так благодаря случайности появилось ядро Linux и впоследствии ОС GNU/Linux.
На данный момент более 75% серверов обеспечивающие надежную работу Интернет работают под управлением Linux.
MenuetOS — самая маленькая операционная система. Написана на ассемблере и помещается на дискету.