» Главная
eXcode.ru » Статьи » С / С++ » Большой FAQ по С++ » Borland C++ » Справочная информация
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 4





Руководство по ObjectWindows для Borland C++




         ОГЛАВЛЕНИЕ

ВЕДЕНИЕ
Комплект поставки ObjectWindows
  Что представляет собой руководства по ObjectWindows
Требования по программному и аппаратному обеспечению
Установка ObjectWindows
  Использование INSTALL
Файл README для ObjectWindows
Файлы помощи ObjectWindows
  Помощь в Windows
  Помощь в ДОС
Соглашения, используемые в данных книгах
  Соглашения по именам в ObjectWindows
Как связаться с фирмой Borland
  Возможности поставляемого пакета
  Возможности фирмы Borland

ЧАСТЬ I. ЗНАКОМСТВО С ObjectWindows

Глава 1. Наследовать окно
Что такое прикладная программа для Windows
  Достоинства Windows
  Требования
Объектно-ориентированное программирование в Windows
  Лучший интерфейс с Windows
     Формирование оконной информации
     Абстрагирование функций Windows
     Автоматический ответ на сообщения
Структура Windows программы
  Структура Windows
  Взаимодействие с Windows и с ДОС
"Hello, Windows" ("Здравствуй Windows")
     Характеристики запуска прикладной программы
     Характеристики главного окна
  Процесс создания прикладной программы

Глава 2. Шагаем по Windows
Создание прикладной программы ObjectWindows: предварительные рассуждения
  Библиотека контейнерных классов
  Каталоги
  Указание необходимой библиотеки
     Программы ObjectWindows, использующие DLL
     Создания файла ресурсов
Создание прикладной программы ObjectWindows: специфика
  Использование ИСР для создания приложения ObjectWindows
  Использование утилит командной строки для создания прикладных программ
  ObjectWindows
Шаг 1: Простая Windows программа
  Требования прикладной программы
     Определение класса прикладная программа
Шаг 2: Класс главного окна
  Что такое оконный объект ?
     Дескрипторы
     Родительские и дочерние окна
  Создание объекта главное окно.
  Ответы на сообщения
  Завершение работы прикладной программы

Глава 3. Вывод информации в окно
Что такое контекст вывода ?
Шаг 3 : Вывод в окно текстовой информации
  Структура сообщения
  Очистка экрана
Шаг 4 : Рисование линий в окне
  Модель перемещения
  Реакция на сообщения перемещения
Шаг 5 : Изменение толщины линий
  Выбор нового карандаша
     Замена карандаша
  Реализация диалога ввода
Шаг 6 : Вывод графической информации
  Модель рисования
  Хранение графики как объекта
  Перерисовка сохраненной графической информации

Глава 4. Дабавление меню
Ресурсы меню
Шаг 7 : Меню для главного окна
Перехват сообщений меню
Ответ на сообщение меню

Глава 5. Поддержка диалога
Шаг 8 : Добавление всплывающего окна
  Создание всплывающего окна
  Функция MakeWindow
Добавление блока диалога
  Добавление компоненты данных
  Инициализация блока диалога
Шаг 9 : Сохранение графической информации в файле
  Отслеживание статуса
  Открытие и сохранение файлов

Глава 6. Всплывающие окна
Шаг 10 : Вывод всплывающего окна помощи
Использование модулей с ObjectWindows
  Модификация главной программы
  Создание модуля
Добавление управляющих элементов к окну
  Что такое управляющие элементы
  Создание управляющих элементов окна
  Упраляющие объекты как компоненты данных
  Организация работы управляющих элементов
  Реакция на события управляющих элементов

ЧАСТЬ 2. ИСПОЛЬЗОВАНИЕ ObjectWindows

Глава 7. Обзор ObjectWindows
Соглашения ObjectWindows
Иерархия ObjectWindows
  Object
  TModule
  TApplication
  Интерфейсные объекты
     TWindowsObject
  Оконные объекты
     TWindow
     TEditWindow
     TFileWindow
  Диалоговые объекты
     TDialog
     TFileDialog
     TInputDialog
  Управляющие объекты
     TControl
     TButton
     TCheckBox
     TRadioButton
     TListBox
     TComboBox
     TGroupBox
     TStatic
     TEdit
     TScrollBar
  Объекты MDI
     TMDIFrame
     TMDIClient
  Прокручивающиеся объекты
Функции Windows API.
  ObjectWindows вызывает функции Windows
  Доступ к функциям Windows
  Комбинирование стилевых констант
  Типы функций Windows
     Интерфейсные функции управления окнами
     Функции интерфейса с графическими устройствами (GDI)
     Функции интерфейса с системными средствами
  Функции с обратным вызовом
     Функции подсчета
        Использование интеллектуальных обратных вызовов
Сообщения Windows
  Параметры сообщений Windows
  Типы сообщений Windows
     Сообщения управления окнами
     Инициализационные сообщения
     Сообщения ввода
     Системные сообщения
     Сообщения буфера информационного обмена (Clipboard)
     Сообщения о системной информации
     Сообщения манипулирования управляющими элементами
     Сообщения уведомления управляющих элементов
     Уведомляющие сообщения линеек прокрутки
     Сообщения не из области пользователя
     Сообщения мультидокументального интерфейса
  Обработка сообщений по умолчанию
  Посылка сообщений
  Диапазоны сообщений
  Сообщения, определяемые пользователем

Глава 8. Объекты прикладная программа и модуль
Поток прикладной программы
Инициализация приложений
  Инициализация главного окна
  Инициализация каждого экземпляра прикладной программы
  Инициализация первого экземпляра прикладной программы
Запуск прикладных программ
Закрытие прикладных программ

Глава 9. Интерфейсные объекты
TWindowsObject
Почему интерфейсные объекты ?
Отношение родители-дети между окнами
  Списки дочерних окон
  Итерация по дочерним окнам
Обработка сообщений
  Ответы на сообщения
  Командные сообщения и сообщения дочерних окон
     Обработка командных сообщений
     Обработка сообщений дочерних окон
  Обработка сообщений по умолчанию

Глава 10. Оконные объекты
Класс ТWindows
Инициализация и создания оконных объектов
  Инициализация оконных объектов
  Создание оконных элементов
  Обобщение информации о создании и инициализации
Регистрация оконного класса
  Атрибуты регистрации
     Компонента стиля класса
     Компонента иконки
     Компонента курсора
     Компонента цвета фона
     Компонента меню по умолчанию
Прокручиваемые окна
  Атрибуты прокрутки
  Организации прокрутки в окне
  Пример с прокруткой
  Авто-прокрутка и отслеживание местоположения
  Модификация единиц прокрутки и диапазона
  Модификация положения прокрутки
  Установка размера страницы
  Оптимизация функций-компонент Paint при организации прокрутки
Окна редактирования и окна работы с файлами
  Окна редактирования
  Окна работы с файлами

Глава 11. Диалоговые объекты
Использование ресурсов диалога
Использование дочернего диалогового объекта
  Конструирование и инициализация дочерних диалоговых объектов
  Создание и выполнение диалогов
     Модальные и немодальные диалоги
  Закрытие дочернего диалога
  Использование диалога как главного окна
     Определение класса Windows для вашего немодального диалога
  Работа с управляющими элементами и обработка сообщений
     Работа с управляющими элементами диалога
     Ответы на сообщения уведомления управляющих элементов
     Пример связи диалог/управляющий элемент
  Усложненный пример использования диалогов
Диалоги ввода
Файловые диалоги

Глава 12 Объекты управления
Использование объектов управления
  Конструирование и создание объектов управления
  Уничтожение и удаление управляющих элементов
  Управляющие элементы и обработка сообщений
     Манипулирование управляющими элементами окон
     Реакция на предупреждающие сообщения управляющих элементов
Фокус управления и клавиатура
Управляющие элементы блоков списков
  Конструирование и создание блоков списков
  Модификация блоков списков
  Запросы к блокам списков
  Получение выборов из блока списка
Статичные управляющие элементы
  Конструирование статичных управляющих элементов
  Запросы к статичным управляющим элементам
  Модификация статичных управляющих элементов
  Пример: Приложение StatTest
Управляющие элементы кнопок нажатия
  Реакция на сообщения кнопок
Блоки проверки и селективные кнопки
  Конструирование блоков проверки и селективных кнопок
  Запрос состояния селективного блока
  Модификация состояния селективного блока
  Реакция на сообщения блоков проверки и селективных кнопок
Блоки группы
  Конструирование блока группы
  Реакция на сообщения блока группы
  Пример программы: BtnTest
Линейки прокрутки
  Конструирование объектов линеек прокрутки
  Запросы линейкам прокрутки
  Модификация линеек прокрутки
  Реакция на события линейки прокрутки
  Пример: SBarTest
Редактируемые управляющие элементы
  Конструирование редактируемых управляющих элементов
  Буфер информационного обмена и операции редактирования
  Запросы к редактируемым управляющим элементам
  Модификация редактируемых управляющих элементов
     Удаление текста
     Вставка текста
     Принудительный выбор и прокрутка текста
  Пример программы: EditTest
Комбинированные блоки
  Три разновидности комбинированных блоков
     Простые комбинированные блоки
     Выпадающие комбинированные блоки
     Выпадающие списковые комбинированные блоки
     Выбор типов комбинированных блоков
  Конструирование комбинированных блоков
  Модификация комбинированных блоков
  Пример приложения: CBoxTest
Передача данных управляющих элементов
  Определение буфера передачи
  Конструирование управляющих элементов и разрешение передачи
  Передача данных
  Модификация передачи для управляющих элементов
  Примеры передачи

Глава 13. Адаптированные объекты управления
Модификация предопределенных управляющих элементов
  Модификация стилей создания
     Как сделать предопределенный управляющий элемент рисуемым
  Модификация предопределенных реакций на сообщения
     Задание дополнительной обработки для предопределенного управляющего
     элемента
     Обход реакции предопределенного управляющего элемента
Использование адаптированного управляющего элемента
  Разработка адаптированного управляющего элемента
     Описание адаптированного управляющего элемента

Глава 14. Объекты MDI
Компоненты приложений MDI
  Каждое окно MDI является объектом
Конструирование окон MDI
  Конструирование окон рамки MDI
  Конструирование дочерних окон MDI
Обработка сообщений в приложениях MDI
Управление дочерними окнами MDI
  Активизация дочерних окон
  Меню дочерних окон
Пример приложения MDI

Глава 15. Объекты, которые возможно использовать в потоках
Библиотека iostream
Перегруженные операторы << и >>
Классы, имеющие возможность участвовать в потоках, и TStreamable
Менеджер потоков
Конструкторы классов, имеющих возможность участвовать в потоках
Имена классов, имеющих возможность участвовать в потоках
Использование менеджера потоков
  Установление связей в программе менеджера потоков
  Создание потокового объекта
  Использование потокового объекта
Совокупности в потоках
  Придание массивам возможности участвовать в потоках
  Построительная функция класса, имеющего возможность участвовать в
  потоках
  Функция-компонента streamableName
  Функция-читатель, имеющая возможность работы с потоками

ЧАСТЬ 3. ПРОГРАММИРОВАНИЕ ДЛЯ WINDOWS

Глава 16. Управление памятью
Использование менеджера памяти
Как Windows управляет памятью
  Дескрипторы и адреса
     Особенности реального режима
     Особенности защищенного режима
Локальная и глобальная память
Использование локальной области динамически распределяемой памяти
  Размещение и доступ к локальной памяти
  Освобождение и отбрасывание блоков локальной памяти
  Переразмещение и модификация блоков локальной памяти
  Запросы к блокам локальной памяти
  Замечания по программированию
Использование глобальной области динамически распределяемой памяти
  Размещение и доступ к глобальной памяти
  Другие способы блокировки блоков глобальной памяти
  Освобождение и отбрасывание блоков глобальной памяти
  Переразмещение и модификация блоков глобальной памяти
  Запросы к блокам глобальной памяти
  Изменение глобального отбрасывания
  Получение предупреждений о недостаточной памяти
  Замечания по программированию

Глава 17. Взаимодействие процессов
Буфер информационного обмена Windows
  Форматы Буфера информационного обмена
  Помещение данных в Буфер информационного обмена
  Получение данных из Буфера информационного обмена
  Задержка преобразования
Обмен сообщениями между процессами
Динамический обмен данными
  Термины
  Установка диалога
  Прекращение диалога
  Функции-компоненты обмена данными
  Запрос одного элемента данных
  Событийное преобразование данных
  Запрос к серверу на изменение значения данных
  Выполнение команд макросов в сервере
  Системная тема

Глава 18. Введение в GDI
Контекст представления
  Управление контекстом представления
  Что находится в контексте представления?
     Побитовая графика
     Цвет
     Режимы отображения
     Области усечения
     Средства рисования
Средства рисования
  Имеющиеся средства
  Логические средства
     Логические карандаши
     Логические кисти
     Логические шрифты
Представление графики в окнах
  Рисование в окнах
     Управление контекстом представления
     Вызов оконных графических функций
  Отрисовка окон
  Стратегии графики
  Использование средств рисования
Функции рисования GDI
  Рисование текста
  Рисование линий
     Move To и LineTo
     Polyline
     Arc
  Рисование форм
     Rectangle
     RoundRect
     Ellipse
     Pie и Chord
     Polygon
Использование палитр
  Установка палитры
  Рисование с помощью палитр
  Запросы к палитрам
  Модификация палитры
  Реакция на изменение палитры

Глава 19. Ресурсы в подробностях
Создание ресурсов
Добавление ресурсов к выполняемому файлу
Использование Компилятора ресурсов
  Файлы описания Компилятора ресурсов
  Советы по работе с Компилятором ресурсов
Загрузка ресурсов в приложении
  Загрузка меню
  Загрузка таблиц акселераторов
  Загрузка блоков диалога
  Загрузка курсоров и пиктограмм
  Загрузка ресурсов строк
  Загрузка побитовых отображений
  Использование побитового отображения для создания кисти
  Представление побитовых отображений в меню

Глава 20. Стандартные руководящие принципы разработки приложений
Принципы разработки
  Предоставление реакции, ожидаемой пользователем
  Возможность пользователя управлять ходом событий
Стандартные внешний вид и режим работы
  Общее представление
  Взаимодействие с помощью мыши и клавиатуры
  Меню
  Блоки диалога
  Другие соглашения разработки
Написание надежных программ
  Элементарные операции
     Пул безопасности
     Другие ошибки при создании окон
  Проверка потребителей памяти

         ТАБЛИЦЫ

Таблица 2.1 Каталоги INCLUDE по умолчанию
Таблица 2.2 Библиотеки для каждой модели памяти
Таблица 2.3 DLL и библиотеки импорта
Таблица 2.4 Классы ObjectWindows, которые требуют файлов ресурсов
Таблица 3.1 Наиболее часто получаемые сообщения "мыши".
Таблица 3.2 Сообщения, используемые в Шаге 4.
Таблица 7.1 Диапазоны сообщений Windows
Таблица 10.1 Компоненты данных TWindowAttr.
Таблица 10.2 Атрибуты регистрации окна
Таблица 10.3 Типичные установки компонент данных окна редактирования
Таблица 10.4 Функции-компоненты окна работы с файлами и идентификаторы
             меню
Таблица 12.1 Управляющие элементы Windows, поддерживаемые ObjectWindows
Таблица 12.2 Предупреждающие сообщения блоков списков
Таблица 12.3 Общие стили редактируемых управляющих элементов
Таблица 12.4 Идентификаторы меню и вызываемые ими функции-компоненты
Таблица 12.5 Функции-компоненты, определяемые TScrollBar
Таблица 12.6 Компоненты данных TListBoxData
Таблица 12.7 Компоненты данных TComboBoxData
Таблица 14.1 Стандартные действия, команды и функции-компоненты MDI
Таблица 17.1 Форматы буфера информационного обмена
Таблица 18.1 Имеющиеся средства рисования
Таблица 18.2 Простые RGB-значения цветов
Таблица 18.3 Константы шага и семейства шрифта
Таблица 19.1 Параметры командной строки Компилятора ресурсов
Таблица 20.1 Значения ошибок создания окон

         РИСУНКИ

Рисунок 1.1 Экранные компоненты приложения Windows
Рисунок 1.2 Как приложение Windows взаимодействует с Windows и ДОС
Рисунок 2.1 Полное приложение ObjectWindows.
Рисунок 2.2 Реализация первого Шага вашего приложения ObjectWindows
Рисунок 2.3 Наша прикладная программа отвечает на событие
Рисунок 2.4 Шаг приложения с переопределенной реакцией на завершение
            работы
Рисунок 3.1 Вывод координат точки нахождения указателя "мыши" в момент
            нажатия левой клавиши.
Рисунок 3.2 Изменение толщины линии.
Рисунок 4.1 Прикладная программа с ресурсом меню.
Рисунок 4.2 Прикладная программа с системой помощи
Рисунок 5.1 Группа связанных родительских и дочерних окон
Рисунок 5.2 Прикладная программа с блоком файлового диалога.
Рисунок 6.1 Система помощи созданной нами прикладной программы
Рисунок 7.1 Иерархия классов ObjectWindows
Рисунок 8.1 Функция-компонента осуществляет вызовы, организуя поток
            прикладной программы
Рисунок 8.2 Главное окно
Рисунок 8.3 Последовательная инициализация экземпляров приложения
Рисунок 10.1 Атрибуты окна
Рисунок 10.2 Программа, использующая класс IBeamWindow.
Рисунок 10.3 Окно редактирования
Рисунок 11.1 Прикладная программа с диалогом
Рисунок 11.2 Диалог, проверяющий допустимость ввода пользователя
Рисунок 11.3 Диалог ввода
Рисунок 11.4 Файловый диалог
Рисунок 12.1 Некоторые простые управляющие элементы
Рисунок 12.2 Заполненный блок списка
Рисунок 12.3 Реакция на выбор пользователем элемента блока списка
Рисунок 12.4 Три типа комбинированных блоков и блок списка
Рисунок 12.5 Выпадающий списковый комбинированный блок
Рисунок 12.6 Статичные управляющие элементы
Рисунок 12.7 Окно с редактируемыми управляющими элементами
Рисунок 12.8 Редактируемый управляющий элемент создается без рамки
Рисунок 12.9 Окно с различными кнопками
Рисунок 12.10 Управляющий элемент линейки прокрутки
Рисунок 12.11 Окно с различными линейками прокрутки
Рисунок 14.1 Компоненты примера приложения MDI
Рисунок 15.1 Иерархия классов, имеющих возможность участвовать в потоках и
             использующихся в ObjectWindows
Рисунок 16.1 Пример уплотнения
Рисунок 18.1 Стили линий для средств карандаша
Рисунок 18.2 Стили штриховки для средств кисти
Рисунок 18.3 Результат работы функции TextOut
Рисунок 18.4 Результат работы функции LineTo
Рисунок 18.5 Результат работы функции Polyline
Рисунок 18.6 Результат работы функции Arc
Рисунок 18.7 Результат работы функции Rectangle
Рисунок 18.8 Результат работы функции RoundRect
Рисунок 18.9 Результат работы функции Ellipse
Рисунок 18.10 Результат работы функции Pie
Рисунок 18.11 Результат работы функции Chord
Рисунок 18.12 Результат работы функции Polygon
Рисунок 19.1 Шаблон с полосками, заполняющий область дисплея
Рисунок 19.2 Ресурс побитового отображения для создания кисти для шаблона,
             показанного на Рис. 19.1
Рисунок 19.3 Меню, использующее побитовое отображение в качестве одного из
             своих пунктов
Рисунок 20.1 Стандартная линейка меню CUA
Рисунок 20.2 Пункты меню Файл, рекомендованные CUA
Рисунок 20.3 Пункты меню Редактирование, рекомендованные CUA
Рисунок 20.4 Пункты меню Просмотр, рекомендованные CUA
Рисунок 20.5 Пункты меню Опции, рекомендованные CUA
Рисунок 20.6 Пункты меню Подсказка, рекомендованные CUA




    ВЕДЕНИЕ

    ObjectWindows обеспечивает совершенно новый великолепный способ
создания прикладных программ для Microsoft Windows. До последнего времени
программирование для среды Windows требовало компилятора Microsoft C и
большого числа отдельных, и достаточно сложных, прикладных утилит. В
результате чего, создание программ под Windows являлось относительно
медленным, сложным и кропотливым делом. С появлением прикладного
программного продукта ObjectWindows программирование для Windows стало
намного более приятным занятием.
    Программирование в Windows требует от вас знания многих новых
тонкостей, о которых, возможно, вы и не должны были думать до этого.
Например, манипулирование с текстом и графикой в изменяющихся по размеру
окнах, взаимодействие с другими программами в многозадачной среде и
манипулирование более чем 600 функциями в Интерфейсе Программирования
Приложения Windows (Windows Application Programming Interface API).
Возможно, что большая часть всего этого может только прояснить, какие
основные вещи ваша программа должна делать для того, чтобы функционировать
как прикладная программа Windows и затем убедиться, что вы реализовали все
из них.
    ObjectWindows позволяет все это выполнить. Это объектно ориентированная
библиотека классов, которая формирует механизм (на уровне прикладных
программ и на уровне окон), реализуемый обычными прикладными программами
Windows. ObjectWindows упрощает создание программ под Windows из-за
    - согласующегося, интуитивного и упрощенного интерфейса с Windows;
    - обеспечения механизма управления окнами и обработки сообщений;
    - базового набора оконных элементов для структурирования прикладной
программы под Windows.
    Вы автоматически получаете эти базовые функциональные возможности,
которые позволяют вам сосредоточить основные усилия на специфических
требованиях вашей прикладной программы.
    ObjectWindows не предоставляет классы для исчерпывающего формирования
всех логических элементов прикладной программы для Windows. Но, посредством
модификации имеющихся в ObjectWindows классов, вы существенно сократите
время создания вашей прикладной программы и обеспечите получение гораздо
более компактного кода.

         Комплект поставки ObjectWindows

    Комплект поставки ObjectWindows состоит из набора дискет и двух
руководств:
    - ObjectWindows для С++. Руководство программиста (Данное руководство).
    - ObjectWindows для С++. Справочное руководство.
    На дисках имеются все необходимые программы ObjectWindows для начала
написания приложений для Windows с использованием объектно-ориентированного
подхода ObjectWindows. На них содержаться и все примеры программ, на
которые имеются ссылки в книге ObjectWindows для С++ Руководство
программиста, а также другие полезные программы, которые вы можете изучить
и использовать в дальнейшем. На дисках содержаться два файла Помощи (Help):
    - OWLWHELP.HLP для системы помощи Windows Help.
    - OWLTHELP.OWH для ДОСовского THELP.

         Что представляет собой руководства по ObjectWindows

    Так как ObjectWindows использует некоторые новые технические методы, то
данное Руководство программиста включает в себя большое количество
пояснительного материала. Оно состоит из трех частей:
    - Часть 1, Знакомство с ObjectWindows, описывает принципы написания
прикладных программ для Windows. Она представляет собой учебник,
прослеживающий весь процесс написания и расширения возможностей приложения
ObjectWindows.
    - Часть 2, Использование ObjectWindows, посвящена в основном
детальному описанию элементов самого ObjectWindows. Она включает в себя
обзор иерархии классов и объясняет как взаимодействовать со средой Windows.
    - Часть 3, Программирование в Windows, дает описание аспектов
программирования в Windows, которые ObjectWindows не поддерживает, такие
как, графика, связь между процессами, использование ресурсов, управление
памятью, разделение кодов и данных и управляющие строки в Windows.
    В "ObjectWindows для С++ Справочное руководство" вы найдете справочные
материалы по классам ObjectWindows, типам ObjectWindows, константам
ObjectWindows, функциям Windows, типам Windowsи константам Windows. Все
материалы приводятся в алфавитном порядке и для удобства пользования имеют
закладки.

         Требования по программному и аппаратному обеспечению

    Так как ObjectWindows является графическим инструментальным средством
для создания прикладных программ под Windows, то основные требования по
аппаратному обеспечению для прикладных программ ObjectWindows совпадают с
аналогичными требованиями для Windows:
    - жесткий диск;
    - 2 Мб и более оперативной памяти;
    - совместимый с Windows графический дисплей;
    - Windows 3.0 и выше в стандартном или расширенном режиме процессора
386.
    Вы можете компилировать приложения ObjectWindows (и исходные коды
самого ObjectWindows) с помощью любого компилятора Borland C++, который
создает программы для Windows.

         Установка ObjectWindows

    ObjectWindows поставляется с программой автоматической установки
INSTALL. Так как для хранения файлов на дистрибутивных дискетах мы
используем технологии их сжатия, то вы обязательно должны использовать эту
программу; вы не можете просто скопировать файлы ObjectWindows с дискет на
ваш жесткий диск. Программа INSTALL автоматически копирует и производит
декомпрессию файлов ObjectWindows. На установочной дискете в файле
FILELIST.DOC для справки приводится списки всех дистрибутивных файлов.
    До начала инсталляции сделайте полные рабочие копии всех ваших
дистрибутивных дисков, и положите оригинальные диски в безопасное место.
    Найдите время для изучения соглашения, включаемого в пакет поставки
ObjectWindows, и вышлите нам заполненную регистрационную карточку; это
гарантирует вам получение информации об изменениях и новых версиях
ObjectWindows.

    Использование INSTALL

    Программа INSTALL создает каталоги для хранения файлов ObjectWindows и
перемещает эти файлы с дистрибутивных дисков на ваш жесткий диск. Все что
вам необходимо знать приводится ниже.
    Для установки ObjectWindows:
    1. Установите инсталляционный диск (диск 1) в дисковод А. Наберите
следующую команду и нажмите Ввод (Enter):
     A:INSTALL
    2. Нажмите Ввод (Enter) при появлении установочного экрана.
    3. Следуйте выдаваемым приглашениям.

         Файл README для ObjectWindows

    Файл README содержит последнюю информацию, которая может быть и не
включена в прилагаемые руководства.
    Для получения доступа к файлу README сделайте следующее:
    1. Установите инсталляционный диск ObjectWindows в дисковод А. Если вы
уже установили ObjectWindows, то перейдите к пункту 3.
    2. Наберите А: и нажмите Ввод (Enter).
    3. Наберите README и нажмите Ввод (Enter). Вы окажитесь в программе
просмотра файла, используйте ключи управления курсором Стрелка Вверх и
Стрелка Вниз для перемещения по файлу.
    4. Нажмите Esc для выхода.

         Файлы помощи ObjectWindows

    Мы поставляет два файла помощи для ObjectWindows: OWLWHELP.HLP и
OWLTHELP.OWH. OWLWHELP.HLP обеспечивает помощь в Windows, а OWLTHELP.OWH
предоставляет помощь в среде ДОС. Информация в этих файлах является
полностью идентичной, за исключением формата хранения.

    Помощь в Windows

    OWLWHELP.HLP является файлом помощи для прикладной программы помощи в
Windows WINHELP.EXE. Может оказаться полезным создать иконку в Program
Manager со следующими описателями:
    - Description: ObjectWindows Help
    - Command line: WINHELP.EXE C:BORLANDCOWLOWLWHELP.HLP
    Двойное нажатие кнопки "мыши" на этой иконке автоматически загружает
файл OWLWHELP.HLP под управлением WINHELP.EXE. Если вы установили
ObjectWindows не в каталоги по умолчанию, то вам необходимо изменить имя
каталога, в котором находится файл OWLWHELP.HLP.

    Помощь в ДОС

    Программа THELP представляет собой резидентную утилиту, обеспечивающую
доступ к помощи по ObjectWindows во время выполнения прикладных программ в
ДОС. Например, когда вы пишите свою прикладную программу ObjectWindows в
интегрированной среде Borland C++ вы можете загрузить THELP и в любой
момент работы с прикладной программой вам будет доступна помощь по
ObjectWindows.
    Загрузка THELP осуществляется из командной строки ДОС путем набора
команды:
    THELP /FC:BORLANDCOWLOWLHELP.OWH
    Эта команда загружает THELP и задает файл OWLTHELP.OWH, как файл для
использования в Turbo Help. Для вызова THELP после ее загрузки, нажмите
клавишу 5 на блоке цифровой клавиатуры. THELP активизируется и пытается
найти в индексе помощи слово, на которое (или около которого) установлен
курсор. Если она находит слово, то высвечивается экран помощи,
соответствующий этому топику; в противном случае, появляется индекс помощи
для выбора нужного вам топика.
    !!! Вы можете изменять "горячие" клавиши, задаваемые по умолчанию; смотри
файл помощи THELP.DOC.
    Ниже приводится краткая справки по возможностям THELP:
-------------------------------------------------------------------
 Клавиша   Действие
-------------------------------------------------------------------
 Tab       перемещение курсора к следующему ключевому слову
 Shift+Tab перемещение курсора к предшествующему ключевому слову
 Home      перейти к началу строки
 End       перейти к концу строки
 Enter     выбрать элемент Помощи для подсвеченного ключевого слова
           на текущем экране Помощи
 Esc       выйти из THELP
 F1        вывести Индекс Помощи
 Alt+F1    вывести в обратном порядке последние 20 экранов Помощи,
           которые вы уже просматривали
 Ctrl+F1   выдать экран помощи по "горячим" клавишам THELP
 Ctrl+P    поместить текст примера в прикладную программу
-------------------------------------------------------------------
    Вы можете изменять опции THELP путем задания различных параметров в
командной строке. Более подробно эта процедура описана в файле THELP.DOC.

         Соглашения, используемые в данных книгах

    Все шрифты и иконки, используемые в данном руководстве, были созданы с
помощью Borland′s Sprint: The Professional Word Processor на лазерном
принтере PostScript.
    Тонкий шрифт - этот шрифт используется для представления текста,
который появляется на экран или в программе. Он также используется для
указания на то, что вы должны набрать на клавиатуре.
    ВСЕ ЗАГЛАВНЫЕ - все заглавные буквы используются для наименований
констант (например, WM_MOUSEMOVE).
    МАЛЕНЬКИЕ ЗАГЛАВНЫЕ - маленькие заглавные буквы используются для имен
файлов и каталогов (например, STEP1.CPP).
    [] - квадратные скобки в тексте и командных строках ДОС указывают на
необязательные элементы, которые зависят от вашей системы. Текст такого
типа не должен набираться дословно.
    Жирный (Bold) - зарезервированные слова С++, имена функций, классов и
структур появляются в тексте (но не в примерах программ) выделенные жирным
шрифтом. Этот шрифт используется и для опций утилит командной строки (такой
как -W).
    Италик (Italic) - шрифт италик указывает на идентиикаторы данных,
которые появляются в тексте. Идентификаторы данных включают в себя имена
переменных и компонент данных класса. Этот тип используется и для выделения
определенных слов, например новых терминов.
    Выделенный италик (Keycaps) - этот шрифт указывает на клавиши вашей
клавиатуры. Он обычно выделяет определенную клавишу или набор клавиш,
которые вы должны нажать; например, "Нажмите Shift+Ins для вставки данных
из буфера Clipboard".
    Иконка с указывающим пальцем - эта иконка используется для выделения
важной информации , на которую вы обязательно должны обратить внимание.
    Примечание переводчика !!!
    Вместо этой иконки мы будем использовать слово "Внимание !!!".
    Примечание переводчика !!!
    Мы будем выделять тремя восклицательными знаками (!!!) замечания,
вынесенные на поля книги.

    Соглашения по именам в ObjectWindows

    Многие классы и структуры в иерархии ObjectWindows имеют имена,
начинающиеся с буквы Т (например TWindow). Для всех всех классов с Т
ObjectWindows так же определяет следующие связанные типы:
    - Pclass, тип указатель на класс class. (Например, PTWindow
определяется как указатель на ТWindow).
    - Rclass, тип ссылки на класс class. (Например, RTWindow определяется
как ссылка на TWindow).
    - RРclass, ссылка на указатель на класс class. (Например, RРTWindow
определяется как ссылка на указатель на TWindow).
    - РСclass, тип указатель на константу const классa class. (Например,
PCTWindow определяется как указатель на const TWindow).
    - RClass, тип ссылки на константу const классa class. (Например,
RCTWindow определяется как ссылка на const TWindow).
    Мы включили эти типы для облегчения некоторых сложных процедур
программирования в Windows. Например, в противном случае динамически
связываемые библиотеки в Windows (DLL) требовали бы объявлений, подобных
    TWindow _FAR *           !!! Это эквивалентно РТWindow.
, где требовался бы указатель на ТWindow, или
    TWindow _FAR * _FAR &    !!! Это эквивалентно RРТWindow.
для ссылки на указатель на ТWindow.
    Использование типов P, R, RP, PC и RC облегчает преобразование вашей
прикладной программы, если позднее вы решите сделать ее частью DLL. Мы
широко используем эти типы в примерах программ в ObjectWindows.

         Как связаться с фирмой Borland

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

    Возможности поставляемого пакета

    Данный продукт содержит широкие возможности для помощи:
    - руководства предоставляют исчерпывающую информацию по всем аспектам
программ. Используйте их как главный источник информации;
    - вы можете использовать файлы интерактивной помощи.

    Возможности фирмы Borland

    Отдел технической поддержки фирмы Borland публикует информационные
беллютени по различным темам и доступен для ответа на любые ваши вопросы.
    !!! 800-822-4269 (звуковой) TechFax
    TechFax является круглосуточной автоматической справочной службой,
которая посылает техническую информацию на ваш факс бесплатно. Вы можете
запросить по телефону запрос на три документа за один звонок.
    !!! 408-439-9096 (модем) File Download BBS
    Электронная почта фирмы Borland File Download BBS имеет простые файлы,
прикладные программы и техническую информацию, к которой вы можете получить
доступ с помощью вашего модема. При этом не требуется никаких специальных
настроек.
    Абоненты информационных служб CompuServe, GEnie или BIX могут получать
техническую поддержку посредством модема. Для контактов с фирмой Borland с
получением доступа к информационному серверу используйте команды из
следующей таблицы.
-------------------------
 Сервис      Команда
-------------------------
 CompuServe  GO BORLAND
 BIX         JOIN BORLAND
 GEnie       BORLAND
-------------------------
    Адресуйте электронное сообщение к SYSOP или All. Не включайте ваш
серийный номер; сообщения не являются закрытыми, если не посылаются
электронной почтой. Включайте как можно больше информации по интересующему
вас вопросу; отдел технической поддержки ответит на ваше сообщение в
течении одного рабочего дня.
    !!! 408-438-5300 (звуковой) Техническая Поддержка (Technical Support)
    До звонка в Техническую Поддержку (Technical Support), просмотрите
внимательно ваш файл README; возможно это поможет разрешить проблему. В нем
содержится достаточно много информации по различным возникающим проблемам.
Если вы все же решили позвонить, то вы можете связаться с отделом
Технической Поддержки фирмы Borland с 6.00 до 17.00. Пожалуйста, звоните
недалеко от вашего компьютера. На руках вам следует иметь следующую
информацию:
    - имя продукта, серийный номер и номер версии;
    - типы и модели всех аппаратных частей вашей системы;
    - операционную систему и ее версию (используйте команду ДОС VER для
установления номера версии);
    - содержимое ваших файлов AUTOEXEC.BAT и CONFIG.SYS (расположенных в
корневом каталоге () вашего загрузочного диска);
    - содержимое ваших файлов WIN.INI и SYSTEM.INI (расположенных в
каталоге для Windows);
    - номер телефона, по которому с вами можно связаться в дневное время;
    - если звонок касается некоторой проблемы, постарайтесь воспроизвести
ее по шагам.

    ЧАСТЬ I. ЗНАКОМСТВО С ObjectWindows
    -----------------------------------
    Глава 1. Наследовать окно

    В этой части описывается программирования для Microsoft Windows с
упором на объектоно-ориентированное программирование. Вы узнаете что
является составляющими частями Windows программы и как она работает. Вы
изучите требуемые свойства прикладной программы для Windows и как
объектно-ориентированное программирование с помощью ObjectWindows
автоматизирует решение многих задач и облегчает выполнение других.

         Что такое прикладная программа для Windows

    На Рисунке 1.1 показаны основные компонента приложения Windows. Для
успешного понимания и использования ObjectWindows вы должны быть знакомы с
этими компонентами.

    Рисунок 1.1 Экранные компоненты приложения Windows

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

    Достоинства Windows

    Windows предоставляет многие преимущества и для пользователей и для
создателей программ. Преимущества для пользователя включают в себя:
    - стандартные и предопределенные операции. Если вы знаете как
использовать одну прикладную программу для Windows, то вы знаете как
использовать их все.
    - нет необходимости устанавливать устройства и драйверы для каждой
программы. Windows предоставляет драйверы для поддержки переферийных
устройств.
    - взаимодействие и связь между процессами.
    - многозадачность: возможность выполнять несколько программ сразу.
    - доступ к большей памяти. Windows поддерживает защищенный режим на
процессорах 80286, 80386 и 80486; она поддерживает виртуальную память на
процессорах 80386 и 80486.
    Достоинства для разработчиков включают в себя следующие:
    - независимую от устройств графику, поэтому графические прикладные
программы могут работать со всеми стандартными дисплейными адаптерами.
    - встроенную поддержку широкого круга принтеров, мониторов и
указательных устройств, таких как "мышь" и т.п.
    - богатую библиотеку графических подпрограмм;
    - больший объем памяти для больших программ;
    - поддержку меню, иконок, побитовых изображений и т.д.

    Требования

    Список достоинств, предоставляемых Windows, требует достаточно сложного
аппаратного обеспечения: Windows обычно требует для выполнения программ,
сравнимых по производительности с ДОС программами, лучшее графическое
аппаратное обеспечение, больше памяти и более быстрый процессор. Если у
вас машина с 80286 процессором или лучше с по крайней мере с 2Мб памяти, то
Windows будет работать превосходно.

         Объектно-ориентированное программирование в Windows

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

    Лучший интерфейс с Windows

    ObjectWindows использует объектно-ориентирование возможности Borland
C++ для формирования частей API Windows, изолируя вас от деталей
программирования в Windows. В результате, вы можете писать Windows
программы с гораздо меньшими затратами времени и энергии. Проще говоря,
ObjectWindows обеспечивает три полезные возможности:
    - формирование оконной информации;
    - абстракцию многих функцийAPI Windows;
    - автоматический ответ на сообщения.

    Формирование оконной информации

    ObjectWindows содержит объекты, которые определяют свойства и хранение
данных для окон, диалоговых блоков и управляющих средств прикладных
программ под Windows. В прикладной программе ObjectWindows интерфейсный
объект выступает как представитель явного интерфейсного элемента Windows.
Хотя интерфейсный объект и интерфейсный элемент работают в тесной
взаимосвязи, важно понимать различие между ними.
    Интерфейсный объект связывается с новым интерфейсным объектом
посредством вызова (неявно) его функции-компоненты Create. Create вызывает
соответствующую функцию Windows для создания нового интерфейсного элемента.
Компонента данных интерфейсного объекта, передаваемые вызову Windows,
определяют физические атрибуты создаваемого интерфейсного элемента. Windows
возвращает дескриптор, или идентификатор, созданного интерфейсного объекта.
Интерфейсный объект хранит этот дескриптор как его компоненту данных
HWindow.
    Функции Windows, которые оперируют с окном, требуют передачи его
дескриптора; хранение дескриптора как компоненты данных делает его легко
доступным. Аналогично, компоненты данных могут использоваться для хранения
инструментальных средств рисования или информации о состоянии для
определенного окна.

         Абстрагирование функций Windows

    Прикладные программы в Windows формируют свой внешний вид и поведение
путем вызова набора из более 600 функций , составляющих Windows API. Каждая
функция может иметь различное число параметров многих типов. Хотя вы можете
вызывать любую функцию Windows непосредственно из Borland C++,
ObjectWindows облегчает эту задачу, путем предоставления функций-компонент
объектов, которые абстрагируют многие вызовы функций.
    Как замечалось выше, многие параметры для функций Windows уже хранятся
в компонентах данных интерфейсных объектов. Поэтому, функции-компоненты
могут использовать эти данные для передачи их функциям Windows в качестве
параметров. В дополнение, ObjectWindows группирует связанные вызовы функций
в одни функции-компоненты, которые обслуживают задачи более высокого
уровня. Результатом этого является направленный, легкий в использовании
интерфейс с Windows.
    Хотя этот подход достаточно сильно снижает вашу зависимость от сотен
функций API Windows, он не исключает возможности их прямого вызова из API.
ObjectWindows содержит лучшее из двух миров: высокоуровневое,
объектно-ориентированное написание программ плюс максимальный контроль за
графической средой.

    Автоматический ответ на сообщения

    Большему числу Windows программ в дополнение к тому, что они должны
указывать среде Windows что ей делать, необходимо уметь реагировать на
сотни сообщений Windows, которые являются результатом действий пользователя
(например, нажатие кнопки "мыши"), других программ или других источников.
Помним, что Windows посылает вашей программе сообщение каждый раз, когда
пользователь нажимает кнопку "мыши" или передвигает ее указатель. Ваша
прикладная программа возможно будет получать сотни сообщений в течении
всего нескольких минут. Обработка и корректный ответ на сообщения является
важным фактором правильного функционирования вашей программы.
    Объекты, с их способностью наследовать и переопределять поведение
(функции-компоненты), являются наиболее удобными для решения задачи ответа
на входящие стимуляторы (сообщения Windows). ObjectWindows берет сообщения
Windows и превращает их в вызовы функций-компонент Borland C++. Поэтому,
используя ObjectWindows, вы просто определяете функцию-компоненту для
ответа на каждое сообщение, на которое ваша программа должна реагировать.
Например, когда пользователь нажимает левую кнопку "мыши", то Windows
генерирует сообщение WM_LBUTTONDOWN. Если вы хотите, чтобы окно или
управляющий блок в вашей программе ответил на это нажатие, вы просто
определяете функцию-компоненту WMLButtonDown, являющеюся ключевой для
сообщения WM_LBUTTONDOWN. Затем, при посылке Windows этого сообщения, ваш
объект автоматически вызовет функцию-компоненту, определенную ранее.
    Компоненты-функции такого тип называются функциями ответа на сообщения.
Вы коммутируете определенное сообщение Windows с функцией ответа на
сообщение использованием возможности компиляторов Borland C++, называемой
виртуальными таблицами динамического диспетчирования (DDVT). При объявлении
динамически диспетчируемой функции-компоненты вы также задаете и
целочисленный индекс диспетчирования. Например, в
    virtual void Test() = [100];
Test определяется как динамически диспетчируемая функция-компонента класса
с индексом диспетчирования 100.
    Если вы просмотрите файл WINDOWS.H, то вы увидите, что сообщениям
Windows даются описательные имена типа WM_LBUTTONDOWN, но в
действительности используются только целочисленные значения, поэтому вы
можете использовать DDVT с сообщениями Windows.
    ObjectWindows направляет сообщение Windows той функции, чей индекс
диспетчирезации равен значению сообщения. Например,
    virtual void WMLButtonUp(RTMessage Msg) = [WM_FIRST + WM_LBUTTONUP];
     !!! Сумма констант WM_FIRST и WM_LBUTTONUP является целочисленной,
         поэтому Windows использует его для идентификации сообщения.
объявляет функцию void, которая отвечает на сообщение Windows WM_FIRST +
WM_LBUTTONUP. Вам больше нечего делать - ObjectWindows знает когда вы
добавили новую функцию ответа на сообщение и автоматически начинает
отслеживание сообщений для нее. ObjectWindows ожидает, что функции ответа
на сообщения имеют тип параметра RTMessage. Помним, что RTMessage является
ссылкой на TMessage. Объекты TMessage содержат всю информацию, которую
Windows передает вместе с сообщением.
    Внимание !!!
    Существует несколько ограничений на использование динамически
диспетчируемых функций-компонент:
    - При переопределении в производном классе динамически диспетчируемой
функции базового класса должен обязательно использоваться тот же индекс
диспетчирования. Например, следующее определение ошибочно:
    class TestBase
    {
      virtual void sample()  = [100];
    };

    class TestDerived : public TestBase
    {
      virtual void sample()  = [299];
    };
    !!! Это определение ошибочно, так как индексы диспетчирования различны.

    - Каждая динамически диспетчируемая функция в иерархии классов должна
иметь уникальный индекс диспетчирования. Например, следующее определение
ошибочно:
    class TestBase
    {
      virtual void sample1()  = [100];
      virtual void sample2()  = [200];
      virtual void sample3()  = [100];
    };
    !!! Это определение ошибочно, так как тут пытаются присвоить двум
различным функциям одинаковые индексы диспетчирования.

    - "Обычная" (не динамически диспетчируемая) виртуальная функция в
базовом классе не может быть переопределена в производном классе
динамически диспетчируемой функцией. Например, следующее определение
ошибочно:
    class TestBase
    {
      virtual void sample();
    };

    class TestDerived : public TestBase
    {
      virtual void sample()  = [100];
    };
    !!! Это определение ошибочно, так как тут пытаются переопределить
обычную функцию динамически диспетчируемой.

    - Динамически диспетчируемая функция в базовом классе не может быть
переопределена в производном классе "обычной" виртуальной функцией.
Например, следующее определение ошибочно:
    class TestBase
    {
      virtual void sample() = [100];
    };

    class TestDerived : public TestBase
    {
      virtual void sample();
    };
    !!! Это определение ошибочно, так как тут пытаются переопределить
динамически диспетчируемую функцию обычной.

    - Когда класс является производным из более чем одного базового класса,
то говорят, что этот производный класс имеет множественное наследование.
Только первый базовый класс для производного класса со множественным
наследованием может иметь динамически диспетчируемые функции. Например,
следующее определение класса является допустимым:
    class A
    {
      virtual void AA() = [100];
    };

    class B
    {
    };

    class C : public A, public B
    {
    };
    !!! Здесь динамически диспетчируемые функции находятся в первом базовом
класс и все нормально.

    Но это определение является недопустимым:
    class A
    {
    };

    class B
    {
      virtual void ВВ() = [100];
    };

    class C : public A, public B
    {
    };
    !!! Это определение ошибочно, так как второй базовый класс, класс В,
имеет динамически диспетчируемые функции-компоненты.

    - Когда объект класса указывается посредством указателя и не
используется конкретного переопределения контекста, вы не можете вызывать
динамически диспетчируемые функции. Например, следующий пример является
ошибочным:
    class Base
    {
      virtual void sample()  = [100];
    };

    int main(void)
    {
      Base b;
      Base *BasePtr = &b;

      BasePtr->sample();
    }
    !!! Это выражение является ошибочным, так как вы не можете вызывать
динамически диспетчируемые функции-компоненты непосредственно через
указатель.

    - Виртуальный базовый класс не может иметь динамически диспетчируемых
функций-компонент. Например, следующий пример является ошибочным:
    class Base
    {
      virtual void sample()  = [100];
    };

    class derived : virtual public Base
    {
    };
    !!! Это определение является ошибочным, так как виртуальный базовый
класс не может иметь динамически диспетчируемых функций-компонент.

    Альтернативным методом ответа на сообщения Windows, которого
ObjectWindows избегает (но при программировании на Microsoft C требуется
обязательно), является использование длинных операторов switch с
ветвью case для каждого сообщения Windows, требующего обработки вашей
программой. Следующий пример приложения Windows взят из программы на С; как
вы можете видеть он имеет операторы switch внутри операторов switch.

    switch (message)
    {
      case WMU_DDE_CLOSE:
        CloseMsgWnd();
        break;

      case WM_COMMAND:
        switch (wParam)
        {
          case IDM_QUIT:
            // Пользователь выбрал QUIT из меню
            PostMessage(hWnd, WM_CLOSE, 0, 0L);
            break;

         case IDM_HOME:
            // Нажата клавиша Home
            SendMessage(hWnd, WM_HSCROLL, SB_TOP, 0L);
            SendMessage(hWnd, WM_VSCROLL, SB_TOP, 0L);
            break;

         case IDM_ABOUT:
            // Пользователь выбрал ABOUT из меню
            lpproc = MakeProcInstance(About, hInst);
            DialogBox(hInst, MAKEINTRESOURCE(ABOUT), hWnd, lpproc);
            FreeProcInstance(lpproc);
            break;
            ...

    !!! В этом примере показан не-объектно-ориентированный подход к
реализации ответов на сообщения Windows.

    Очевидно, что с 200 различными сообщениями Windows эти операторы switch
станут быстро практически неуправляемыми. Используемый ObjectWindows DDVT
является более простым.

         Структура Windows программы

    Так как много элементов программного обеспечения, такого как ДОС,
Windows, ваша прикладная программа и другие прикладные программы,
одновременно взаимодействуют друг с другом, будет полезным знать, какая
часть вашей Windows программы взаимодействует с окружающей ее средой. В
этой части рассматривается структура Windows программы и приводится пример
типичной Windows программы, написанный на Botland C++ с помощью
ObjectWindows.

    Структура Windows

    Ко времени исполнения выполняемые функции Windows и его API находятся в
трех внешних библиотечных модулях, которые вызываются выполняемым в
настоящий момент приложением:
    - KERNEL.EXE - отвечает за управление памятью и ресурсами, планирование
и взаимодействие с ДОС.
    - GDI.EXE - отвечает за вывод графики на экран и принтер.
    - USER.EXE - отвечает за управление окнами, ввод пользователя и
взаимодействия.
    Эти модули являются частью поставляемой версии Windows. Мы
предполагаем, что ваши пользователи имеют Windows и данные модули уже
загружены на их компьютеры. Вы будете поставлять программы, которые
используют эти библиотечные модули, но не содержат их в себе.

    Взаимодействие с Windows и с ДОС

    Из-за ограниченной области действия операционной системы ДОС легко
упустить из виду тот вклад, который она вносит в успешное функционирование
ее прикладных программ. Тем не менее, ДОС программа работает благодаря
взаимодействию между вашей прикладной программой и элементами операционной
системы. То же самое относится и Windows программам. Так как Windows
предоставляет гораздо больше функций операционной системы, то гораздо
сложнее упустить взаимосвязь между Windows и прикладной программой. Ваша
программа должна постоянно взаимодействовать с операционной системой (ДОС
плюс Windows).
____________________________________________________________%
_   Прикладная программа Windows  ^                         _
_           ________________________________________________"
_           _                     V                         _
_    ^      _ Модули Windows: GDI, USER и KERNEL            _                                _
____________<____________%                               ^  _
_ ^  V   ДОС             ___________________________________"
_________________________"                               V  _
_ VДрайверы устройсв ДОС _ ^ Драйверы устройств Windows  ^  _
_________________________<__________________________________"
_ V                        V                             V  _
_        Компьютер и перефирийное оборудование              _
____________________________________________________________T

    "Hello, Windows" ("Здравствуй Windows")

    Традиционным способом презентации нового языка или среды является
написание на этом языке или для этой среды программы "Hello, World". Эта
программа содержит только несколько команд, необходимых для вывода на
экран строки "Hello, World".
    Конечно в Windows вам придется сделать достаточно много операций, чтобы
достигнуть результата. Вы должны высветить окно, написать в нем, и затем
задать порядок взаимодействия окна с окружающей его средой, по крайней мере
пока, достаточно просто закрыть его и удалить. Если вы будете это делать в
лоб, то решение этой простой задачи приведет к созданию достаточно длинной
программы.
    Это происходит из за того, что Windows имеет ряд требований, которым
должна удовлетворять прикладная программа прежде чем она может быть
запущена. Даже простейшая программа реализуется достаточно большим исходным
кодом. К счастью, программы, написанные с помощью ObjectWindows,
автоматически удовлетворяют большему числу этих требований, включая
создание и вывод главного окна. Поэтому программа HelloWorld упрощается до
приведенной ниже:

    !!! Это программа HELLOAPP.CPP
    #include 

    // Определяем класс, являющийся производным от TApplication
    class THelloApp :public TApplication
    {
    public:
      THelloApp(LPSTR AName, HANDLE hInstance, HANDLE hPrevInstance,
                LPSTR lpCmdLine, int nCmdShow) : TApplication(AName,
                hInstance, hPrevInstance, lpCmdLine, NCmdShow) {};
      virtual void InitMainWindow();
    };

    // Конструктор компоненты данных MainWindow класса THelloApp
    void THelloApp::InitMainWindow()
    {
       MainWindow = new TWindow(NULL, "Hello World!");
    }
    int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
      LPSTR lpCmdLine, int nCmdShow)
    {
      THelloApp HelloApp ("HelloApp", hInstance, hPrevInstance,
                          lpCmdLine, nCmdShow);
      HelloApp.Run();
      return Hello.App.Status;
    }

    Характеристики запуска прикладной программы

    В начале исполнения прикладной программы, Windows передает ей четыре
параметра. В программе ObjectWindows эти параметры передаются конструктору
объекта прикладная программа, производного от класса TApplication. Эти
параметры также заносятся в компоненты данных объекта прикладная программа,
для обеспечения удобного доступа к ним из кода программы.
    Компоненты данных приложения имеют следующее назначение:
    - hInstance хранит дескриптор экземпляра приложения.
    - hPrevInstance хранит дескриптор предыдущего экземпляра этого же
приложения.
    - lpCmdLine хранит LPSTR на строку, соответсвующее командной строке
запуска приложения, включающую имена файлов и опции. Например, "CALC.EXE
/M" или "WORDPROC.EXE LETTER1.DOC".
    - nCmdShow хранит целое число, представляющее начальный режим дисплея
для главного окна. Оно используется при вызове функции-компоненты Show.
    Первым делом прикладная программа ObjectWindows должна сконструировать
объект прикладная программа из базового класса TApplication. В нашем
примере мы используем THelloApp.
    Для первого экземпляра прикладной программы ObjectWindows, Run вызывает
InitApplication для проведения необходимых инициализаций для всего
приложения. Run инициализирует все экземпляры (включая первый) вызовом
InitInstance. Затем InitInstance вызывает функцию-компоненту InitMainWindow
для конструирования и инициализации объекта главное окно.
    В заключении, Run запускает цикл главного сообщения вашей прикладной
программы ObjectWindows. Возврат Run происходит только при завершении
программы. Код возврата приложения заносится в компоненту данных Status,
которую вы должны возвратить в Windows, аналогично тому, как мы делали в
показанной ранее функции WinMain.

    Характеристики главного окна

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

         Процесс создания прикладной программы

    Поскольку существуют определенный набор требований для любой Windows
программы (например, инициализация главного окна), то проще всего начинать
создание вашей прикладной программы с переделки для ваших целей уже
существующих Windows программ. ObjectWindows предоставляет широкий набор
простых программ; выберете из них наиболее подходящую для вас. Затем вам
придется пройти следующие этапы:
    1. Создание нового программного кода.
    2. Создание ресурсов для меню, блоков диалога и так далее.
    3. Компиляция программы.
    4. Отладка программы.

    Глава 2. Шагаем по Windows

    Теперь, когда вы познакомились с библиотекой ObjectWindows, вы готовы
к написанию первых простых программ ObjectWindows. В следующих нескольких
частях вы узнаете как создавать графические, интерактивные Windows
программы, поддерживающие меню, загрузку и сохранение файлов, вывод графики
и текста и , даже, имеющие собственные простейшие системы помощи. Вместе с
этим, мы расскажем вам об основных принципах создания приложений под
Windows, например, обработка сообщений, управление связями между
родительскими и "дочерними" окнами и автоматическая перерисовка графики.
    Наше путешествие по Windows будет состоять из 10 шагов, описываемых в
частях со 2 по 6:
    - шаг 1: простейшая Windows программа;
    - шаг 2: класс главного окна;
    - шаг 3: вывод текста в окно;
    - шаг 4: рисование линий в окне;
    - шаг 5: изменение толщины линий;
    - шаг 6: вывод графики;
    - шаг 7: меню для главного окна;
    - шаг 8: добавление всплывающего окна;
    - шаг 9: занесение изображения в файл;
    - шаг 10: всплывающее окно помощи.
    Если вы не поменяли имена каталогов, задаваемые по умолчанию, то
исходные тексты программ будут находится в подкаталоге EXAMPLESSTEPS
главного каталога OWL. Они имеют названия STEP1.CPP, STEP2.CPP и так далее,
соответствую номеру описываемого в данной книге шага.
    На рисунке 2.1 показан внешний вид приложения, получаемого в конце 10
шага нашего путешествия по Windows.

    Рисунок 2.1 Полное приложение ObjectWindows.

         Создание прикладной программы ObjectWindows: предварительные
         рассуждения

    До того как мы начнем, мы обязаны сделать несколько общих замечаний по
программированию с использованием ObjectWindows. Первое, вы должны точно
задавать имена каталогов, с тем, чтобы компилятор и Компилятор Ресурсов
могли найти все необходимые файлы. Второе, вы должны точно задавать все
каталоги библиотек, иначе, TLINK не сможет найти все необходимые вашему
приложения библиотеки. И последнее, вы должны создать файл ресурсов,
содержащий соответствующие ресурсы ObjectWindows, и затем привязать этот
файл ресурсов к вашей прикладной программе.

    Библиотека контейнерных классов

    Библиотека классов ObjectWindows зависит от библиотеки контейнерных
классов в подкаталоге CLASSLIB. Все объекты ObjectWindows совместно
используют класс Object (определяемый в библиотеке контейнерных классов)
как свой базовый класс. В классах ObjectWindows также используются
некоторые другие классы из этой библиотеки. В ваших программах
ObjectWindows вы можете использовать любые из контейнерных классов.

    Каталоги

    Помимо стандартных для С++ файлов заголовка , как STDIO.H, вашей
прикладной программе возможно потребуются дополнительные файлы заголовков
ObjectWindows, например OWL.H. В этом случае для вспомогательных утилит вы
будете обязаны указывать их местонахождение. Для написания программ с
использованием библиотеки ObjectWindows вы обязательно должны включать, по
крайней мере, файл OWL.H. Более сложные приложения требуют включения и
других файлов заголовков. Например, программа, использующая класс TButton,
должна включать BUTTON.Н. Прикладные программы ObjectWindows и сама
ObjectWindows основываются на библиотеке контейнерных классов, поставляемой
с ObjectWindows, поэтому вы обязательно должны включать путь поиска
включаемой библиотеки контейнерных классов ObjectWindows.
    Всем прикладным программам необходим доступ к стандартным библиотекам
Borland C++, плюс, к созданным вами самими и полученным от третьих лиц.
Кроме этого, приложения ObjectWindows требуют доступа к поставляемым
библиотекам контейнерных классов ObjectWindows и стандартным библиотекам
ObjectWindows.
    В следующей таблице приведены создаваемые установочными утилитами по
умолчанию имена каталогов ObjectWindows или Borland C++. Если в
установочной утилите вы зададите другие имена, то вам нужно будет внести
соответствующие изменения в MAKE файлы и файлы проектов.

    Таблица 2.1 Каталоги INCLUDE по умолчанию
------------------------------------------------------------------------
 Тип                   Каталог INCLUDE            Каталог библиотек
                       по умолчанию               по умолчанию
------------------------------------------------------------------------
 ObjectWindows         BORLANDCOWLINCLUDE      BORLANDCOWLLIB
 Библиотека            BORLANDCCLASSLIBINCLUDE BORLANDCCLASSLIBLIB
 контейнерных классов
 Borlan C++            BORLANDCINCLUDE          BORLANDCLIB
------------------------------------------------------------------------

    Указание необходимой библиотеки

    Существует три различных библиотеки ObjectWindows и библиотеки
контейнерных классов - одна для каждой из моделей памяти: small (малой),
medium (средней) и large (большой). Эти библиотеки располагаются в каталогах
библиотек и приведены в следующей таблице:

    Таблица 2.2 Библиотеки для каждой модели памяти
------------------------------------------------------
 Модель памяти  Библиотека     Библиотека контейнерных
                ObjectWindows  классов
------------------------------------------------------
 Small          OWLWS.LIB      TCLASSWS.LIB
 Medium         OWLWM.LIB      TCLASSWM.LIB
 Large          OWLWL.LIB      TCALSSWL.LIB
------------------------------------------------------

    Программы ObjectWindows, использующие DLL

    Динамически связываемые библиотеки (DLL), библиотеки импорта для
ObjectWindows и библиотека времени выполнения Borland C++ доступны как
показано в таблице 2.3. Если вы хотите, чтобы ваша прикладная программа
использовала одну из этих DLL, то вы должны связать ее с соответствующей
библиотекой импорта.

    Таблица 2.3 DLL и библиотеки импорта
---------------------------------------------
 Тип            DLL        Библиотека импорта
---------------------------------------------
 ObjectWindows  OWL.DLL    OWL.LIB
 Borland C++    BCRTL.DLL  CRTLL.LIB
---------------------------------------------
    Внимание !!!
    Вы можете использовать одну, обе или ни одну из этих DLL; однако, если
вы используете по крайней мере одну DLL, то вы обязательно должны
компилировать вашу программу в модели памяти large (-ml) и с опцией
интеллектуальных об
К началу статьи





Добавил: LedWormДата публикации: 2006-07-16 15:12:45

Рейтинг статьи:0.00 [Голосов 0]Кол-во просмотров: 4450
Оцените статью:

Комментарии читателей

Всего комментариев: 105

2018-07-09 18:58:41
Danielslivy
Наш онлайн-магазин пневматического вооружения и продукции для активного отдыха предлагает огромный ассортимент пневматических пистолетов и пневматических винтовок (воздушек) и сопутствующих товаров к ним. Мы предлагаем товары для активного отдыха - для охоты, рыбалки, туризма, спортивной стрельбы и т.п. [url=http://gun54.ru]пневмо оружие интернет магазин[/url]. Мы также реализуем необходимые товары, такие как шарики BB, свинцовые пули, баллончики СО2, чистящие средства для оружия. У нас в онлайн-магазине богатый ассортимент арбалетов и луков, оптики, биноклей, товаров для туристов и охотничьих ножей.

В большом ассортименте также имеется одежда для охотников, рыболовов и туристов, включающая костюмы, тёплое бельё, обувь, перчатки, свитера. [url=http://gun54.ru/price.html]пневматическая винтовка кросман оптимус[/url]. Для рыболовов мы можем предложить очень популярные сейчас недорогие эхолоты.

Вебсайт GUN54.RU есть также справочно-информационным ресурсом города Новосибирск. У нас вы сможете узнать всю детальную информацию о любом из изделий, которые у нас продаются. [url=http://gun54.ru/page_9.html]газовые пружины для пневматики[/url]. Сделать заказ можно на страницах нашего сайта или непосредственно по телефону, указанному в разделе Контакты. Доставка продукции нами осуществляется по всей Российской Федерации посредством почтово-транспортных компаний.

2018-07-07 04:49:23
LesterEnund
Магазин здоровья - натуральные алтайские и крымские травы, природные средства для красоты и здоровья.
[url="http://happyshop232.ru/catalog/ukhod-za-litsom/"]уход лицо[/url]

2018-06-07 08:10:02
gepatitu-c.net
Лечение гепатита новогиреево


http://gepatitu-c.net/page/lechenie-gepatita-novogireevo/

.

2018-01-13 16:37:00
Inyxzhd
Мы платим за лайки! - Ежедневные выплаты!

Наш сервис предоставляет настоящие лайки на фотографии заказчиков, которые готовы платить за качество.

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

Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

Вам достаточно просто зарегистрироваться на нашем сервисе. > www.click-likes.tk <

Вывод заработанных средств ежедневно в течении нескольких минут.

2017-09-06 02:58:50
Patrickclern
Наш вебресурс имеет детальную информацию о том, как в короткий срок получить кредит онлайн в Украине, как за полчаса получить на свою кредитку денежные средства. [url=http://onlinecredit.in.ua/pochti-polovine-ukraintsev-ne-hvataet-deneg-do-zarplaty/]http://onlinecredit.in.ua/speshite-imenno-vy-mozhete-stat-schastlivchikom-mesyaca-ot-moneyveo/[/url]. У нас на вебсайте описаны все необходимые условия и требования для того, чтобы получить кредит в каком-нибудь из имеющихся сервисов. Мы расскажем всё о микрокредитах, о банках и сервисах, предлагающих кредиты онлайн без справок о доходах и других документов.
У нас есть информация по получению кредитных карточек в каком-либо из банков, для получения потребительских и онлайн-кредитов. [url=http://onlinecredit.in.ua/bank-zolotye-vorota/]http://onlinecredit.in.ua/dengi-v-kredit-onlajn-kogda-luchshe-brat/[/url]. У нас на портале вы сможете узнать как быстро взять деньги онлайн на выгодных для вас условиях в короткое время и с минимальным комплектом документации.
Мы описываем каждый сервис по предоставлению онлайн-кредитов и кредитных карт для пользователей, не желающих терять время на получение кредитных карт в банках. [url=http://onlinecredit.in.ua/kak-vyrosli-ceny-na-medicinskie-straxovki-v-ukraine/]http://onlinecredit.in.ua/bankid-legalizovan-nacbankom/[/url]
С помощью нашего ресурса вы сможете оформить и получить средства онлайн в очень короткое время и без каких-либо документов, имея всего лишь реквизиты вашей карты. С помощью нашего сервиса можно оформить страховки КАСКО и ОСАГО, автогражданку, заказать кредитную историю.

2016-04-18 10:57:23
RichardType
[url=http://aviaseller.su/raspisanie-aviakompanii-pobeda/]расписание авиакомпании победа из москвы[/url]

Наш ресурс считается одним из лидирующих поисковиков бюджетных авиабилетов. Наш сайт один из незаменимых помощников при поиске недорогих билетов на самолёт онлайн. Мы не реализуем авиабилеты, мы помогаем найти лучшие предложения от более чем 700 авиакомпаний Европы и Азии. Никаких комиссий за свои услуги мы не требуем.

[url=http://aviaseller.su/]дешевые авиабилеты от 17 тысяч рублей[/url]

Мы предлагаем только комфортный поисковик недорогих билетов на самолёт, а где приобрести авиабилеты — решать пользователю. Посредством нашего поисковика вы можете летать с удобством в государства Европы или Азии. Наш поисковик сможет помочь легко отыскать авиабилеты недорого по вашему кошельку, это очень практично и экономит драгоценное время.

[url=http://aviaseller.su/aviakompaniya-ikar-pegas-fly/]авиабилеты авиакомпания икар хабаровск симферополь[/url]

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

[url=http://aviaseller.su/bez-vizy/]безвизовые страны для пляжного отдыха[/url]

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

2016-04-17 21:22:24
RichardType
[url=http://aviaseller.su/]купить дешевые билеты онлайнбилет на самолет[/url]

Наш вебсайт считается одним из лидирующих поисковых систем бюджетных авиабилетов. Это один из незаменимых помощников при поиске недорогих билетов онлайн. Мы не реализуем билеты на самолёт, мы помогаем найти лучшие предложения от 728 авиакомпаний Европы и Азии. Никаких комиссий за наши сервисы мы не требуем.

[url=http://aviaseller.su/bez-vizy/]безвизовые страны для паломничества[/url]

Мы предлагаем самый удобный поисковик недорогих авиабилетов, а где купить билет на самолет — решать вам. При помощи данного поисковика вы сможете летать с удобством в страны Европы или Америки. Наш сайт поможет легко отыскать билеты на самолёт дешево по вашему кошельку, это очень удобно и экономит драгоценное время.

[url=http://aviaseller.su/visa/]список стран разрешенных к выезду без визы[/url]

Посредством данного портала вы можете приобрести недорого билет на самолёт онлайн, для этого необходимо только найти максимально подходящее для вас предложение и заплатив за билет, осуществить распечатку его на бумаге формата А4. На этом электронном авиабилете будет вся нужная информация о рейсе, а ваши данные и маршрут транспорта сохранятся в базе данных. Чтобы пройти регистрацию на рейс, вам нужно будет предъявить данный авиабилет и паспорт.

[url=http://aviaseller.su/]купить авиабилет очень дешево[/url]

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

2015-12-09 19:24:47
RobertOl
Наш туристический вебсайт расскажет всему миру всё увлекательном и захватывающем острове Шри-Ланка. [url=http://srilankanlife.ru/index.php/sri-lanka-south-beach-excursion]шри ланка юг экскурсии[/url]. На этих страницах вы узнаете всё об экскурсиях по Шри-Ланке – экскурсиях с берега и из отеля, обо всех спецпредложениях. [url=http://srilankanlife.ru/index.php?option=com_content&view=article&id=51&Itemid=27]местные обычаи шри ланки[/url]. Сможете узнать, что можно посмотреть на острове и чем там сможете ещё заняться на досуге, какие имеются на острове развлечения, кафе, салоны, достопримечательности, бутики и многое другое. Из активных видов отдыха на Шри-Ланке популярны сафари, рыбалка, походы и много ещё интересного.. Мы покажем вам график всех экскурсий, фото курортных зон и природных пейзажей, отелей и их номеров, музеев и архитектурных памятников истории. Всё это вы сможете увидеть на качественных фото с детальными описаниями. А онлайн-консультант позаботится о том, дабы вы знали ответы на любые впоросы, которые связаны с подготовкой к путешествию, поможет при подборе экскурсии и т.д. Во время экскурсий с вами постоянно будет рядом знающий Шри-Ланку русскоговорящий сотрудник, который сможет ответить на любые вопросы, связанные c островом, во время экскурсий рассказывая об истории, культуре и самобытности Шри-Ланки.

Шри-Ланка – идеальное в мире место для незабываемого экзотического времяпрепровождения! [url=http://srilankanlife.ru/]унаватуна русско говорящий гид[/url]. Это удивительный мир, где на такой небольшой территории располагается множество различных культур, это удивительные пейзажи и захватывающие красоты побережья. [url=http://srilankanlife.ru/index.php?option=com_content&view=article&id=196&Itemid=580]шри ланка снять деньги[/url]. Это остров с богатой культурой, природой, множеством климатических зон.

2015-12-09 18:53:36
RobertOl
Наш увлекательный ресурс расскажет всему миру всё о замечательном и захватывающем месте Шри-Ланка. [url=http://srilankanlife.ru/index.php?Itemid=640&option=com_jea&view=properties]шри ланка отдых летом восточное побережье[/url]. На наших страницах вы узнаете обо всех экскурсиях по этому прекрасному острову – экскурсиях с побережья и из гостиниц, обо всех специальных предложениях. [url=http://srilankanlife.ru/index.php?Itemid=487&catid=66&func=listcat&option=com_kunena]расказы отзывы шриланка[/url]. Узнаете, что можно посмотреть на Шри-Ланке и чем там можно заняться на досуге, какие есть развлечения, рестораны, SPA-комплексы, памятники архитектуры, магазины и многое другое. Из активного отдыха на Шри-Ланке популярны сафари, рыбалка, походы и много ещё интересного.. На нашем вебсайте напечатан график всех экскурсий, фото курортных зон и природных красот, отелей и их номеров, музейных и архитектурных памятников истории. Всё это увидите на качественных фото с подробными описаниями. А наш онлайн-помощник позаботится о том, чтобы вы знали ответы на все впоросы, связанные с подготовкой к поездке, поможет при подборе экскурсии и т.д. Во время путешествия с вами всегда будет рядом знающий Шри-Ланку русскоговорящий специалист, который сможет ответить на разные вопросы, которые связаны c островом, во время экскурсий повествуя об истории, культуре и самобытности Шри-Ланки.

Шри-Ланка – наилучшее в мире место для захватывающего экзотического отдыха! [url=http://srilankanlife.ru/index.php?option=com_content&view=article&id=73&Itemid=213]шри ланка рубины[/url]. Это удивительный мир, где на этой маленькой территории соседствуют множество различных культур, это удивительные пейзажи и захватывающие красоты побережья. [url=http://srilankanlife.ru/index.php?option=com_content&view=article&id=51&Itemid=645]индивидуальные экскурсии по шри ланке[/url]. Это остров с богатой культурой, флорой и фауной, разнообразием климатических зон.

2015-12-09 09:56:17
RobertOl
Наш увлекательный сайт расскажет пользователям всё о замечательном и захватывающем месте Шри-Ланка. [url=http://srilankanlife.ru/mailorder.pdf]сигирия и дамбулла[/url]. На наших страницах вы сможете узнать всё об экскурсиях по этому прекрасному острову – экскурсиях с берега и из гостиниц, обо всех спецпредложениях. [url=http://srilankanlife.ru/index.php?option=com_content&view=article&id=62&Itemid=172]вип шри ланка[/url]. Сможете узнать, что можно посмотреть на острове и чем там можно заняться в свободное время, какие есть развлечения, кафе, SPA-комплексы, достопримечательности, бутики и многое другое. Из активного отдыха на острове популярны сафари, рыбалка, походы и много ещё интересного.. На нашем вебсайте напечатан график всех экскурсий, фотографии курортных пляжей и природных красот, отелей и их номеров, музейных и архитектурных объектов истории. Всё это увидите на качественных фотографиях с подробными описаниями. А онлайн-консультант позаботится о том, дабы вы знали ответы на любые впоросы, связанные с подготовкой к путешествию, поможет при выборе экскурсии и т.д. Во время экскурсий с вами постоянно будет на связи знающий Шри-Ланку гид, который сможет ответить на различные вопросы, касающиеся c островом, во время маршрута повествуя об истории, культуре и самобытности Шри-Ланки.

Шри-Ланка – идеальное в мире место для увлекательного экзотического времяпрепровождения! [url=http://srilankanlife.ru/index.php?option=com_content&view=article&id=74&Itemid=156]праздники на шри ланке в августе[/url]. Это своеобразный мир, где на такой небольшой территории соседствуют множество различных культур, это красивейшие пейзажи и захватывающие красоты побережья. [url=http://srilankanlife.ru/index.php?option=com_jea&view=properties&Itemid=90]однодневные экскурсии шри ланка[/url]. Данный остров с богатой культурой, природой, множеством климатических зон.
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Каким способом вы подключены к интернету
Dial-Up
26% (59)
ISDN
1% (2)
Выделенная линия
27% (61)
ADSL
32% (71)
Спутниковый интернет
2% (5)
GPRS-интернет
8% (17)
Другое
4% (9)

Проголосовало: 224
В офисе два программиста беседуют:
Первый:
- У меня самый матовый монитор!!!
Второй:
- Это потому, что его неоднократно покрывали матом!!!
Рейтинг: 0/10 (0)
Посмотреть все анекдоты