- •Содержание
- •Часть 1. Общие сведения о технологии программирования 5
- •Часть 2. Windows программирование 24
- •Введение
- •Часть 1. Общие сведения о технологии программирования
- •1. Задачи технологии программирования
- •1.1. Базовые определения
- •1.2. Невозможность доказательства отсутствия программных ошибок
- •1.3. Надежность программного средства
- •1.4. Технология программирования как способ создания надежных программных средств
- •1.5. Этапы развития технологии программирования
- •1.6. Технология программирования и информатизация общества
- •2. Общие принципы разработки программных средств
- •2.1. Специфика разработки программных средств
- •2.2. Основные подходы при создании пс
- •2.3. Жизненный цикл программного средства
- •2.4. Понятие качества программного средства
- •2.5. Обеспечение надежности – основной критерий разработки программных средств
- •2.5.1. Методы борьбы со сложностью
- •2.5.2. Обеспечение точности перевода
- •2.5.3. Преодоление барьера между пользователем и разработчиком
- •2.5.4. Контроль принимаемых решений
- •3. Архитектура программного средства
- •3.1. Понятие архитектуры программного средства
- •3.2. Основные классы архитектур программных средств
- •3.3. Архитектурные функции
- •4. Тестирование и отладка программного средства
- •4.1. Основные понятия
- •4.2. Принципы и виды отладки программного средства
- •4.3. Заповеди отладки программного средства
- •4.4. Автономная отладка программного средства
- •4.5. Комплексная отладка программного средства.
- •Часть 2. Windows программирование
- •5. Основные характеристики Windows платформ
- •5.1. Краткая история Windows
- •5.2. Отличия и общие свойства Windows платформ
- •5.2.1. Общие свойства Windows платформ
- •5.2.2. Отличия Win32 платформ
- •5.2.3. Окна и сообщения
- •5.2.4. Приложения, потоки и окна
- •5.2.5. Классы окон
- •5.2.6. Венгерская нотация
- •5.2.7. Типы сообщений
- •5.2.8. Сообщения и многозадачность
- •5.2.9. Очереди сообщений
- •5.2.10. Процессы и потоки
- •5.2.11. Потоки и сообщения
- •5.2.12. Оконная функция – функция обратного вызова
- •5.2.13. Синхронные и асинхронные сообщения
- •5.2.14. Функции Windows
- •5.2.15. Другие api
- •6. Структура Windows приложений
- •6.1. Файлы заголовков
- •6.2. Глабальные переменные
- •6.3. Точка входа в приложение
- •6.4. Необходимые переменные
- •6.5. Регистрация класса окна
- •6.6. Создание главного окна
- •6.7. Отображение главного окна
- •6.8. Цикл обработки сообщений
- •6.9. Функция окна
- •7. Обработка сообщений в оконной функции
- •7.1. Создание окна wm_create
- •7.2. Определение размера окна wm_size
- •7.3. Отображение содержимого окна wm_paint
- •7.3.1. Случаи генерации сообщения wm_paint
- •7.3.2. Особенность сообщения wm_paint
- •7.3.3. Правила обработки wm_paint
- •7.3.4. Отрисовка вне wm_paint
- •7.3.5. Определение возможностей контекста устройства
- •7.3.6. Системные метрики
- •7.4. Определение расположения окна wm_move
- •7.5. Использование оконных полос прокрутки
- •7.5.1. Диапазон и положение полос прокрутки
- •7.5.2. Сообщения полос прокрутки
- •7.6. Клавиатурный ввод
- •7.6.1. Фокус ввода и активное окно
- •7.6.2. Генерация клавиатурных сообщений
- •7.6.3. Аппаратные сообщения
- •7.6.3.1. Системные аппаратные сообщения
- •7.6.3.2. Несистемные аппаратные сообщения
- •7.6.3.3. Битовые поля параметра lParam
- •7.6.3.4. Виртуальные коды клавиш
- •7.6.4. Символьные сообщения
- •7.6.5. Обработка сообщения wm_char
- •7.6.6. Определение состояния управляющих клавиш
- •7.6.7. Наборы символов
- •7.7. Системный таймер
- •7.7.1. Использование таймера. Первый способ
- •7.7.2. Использование таймера. Второй способ
- •7.8. Удаление окна, сообщение wm_destroy
- •8. Ресурсы приложения и их использование
- •8.1. Меню приложения
- •8.1.1. Виды меню
- •8.1.2. Возможные состояния пунктов меню
- •8.1.3. Сообщения от пунктов меню
- •8.1.4. Создание главного меню приложения
- •8.1.5. Функции для работы с меню
- •8.2. Стандартные элементы управления
- •8.2.1. Создание стандартных элементов управления
- •8.2.2. Разрушение элементов управления
- •8.2.3. Функции для работы с элементами управления
- •8.2.4. Сообщения дочерних окон
- •8.2.5. Сообщения родительского окна дочерним окнам
- •8.2.6. Расширенное управление дочерними окнами
- •8.2.7. Оконные процедуры элементов управления
- •8.2.8. Элемент управления кнопка
- •8.2.8.1. Стили кнопок
- •8.2.8.2. Сообщения от кнопок, получаемые родительским окном
- •8.2.8.3. Сообщения от родительского окна к кнопке
- •8.2.8.4. Кнопки-переключатели
- •8.2.8.5. Сообщение от переключателей
- •8.2.8.6. Сообщение от родительского окна к переключателям
- •8.2.9. Структура drawitemstruct
- •8.2.10. Стандартный элемент управления окно ввода
- •8.2.10.1. Стили окна редактирования
- •8.2.10.2. Сообщения от редактора к родительскому окну
- •8.2.10.3. Сообщения от родительского окна к редактору
- •8.2.11. Стандартный элемент управления статический текст
- •8.2.11.1. Стили элемент управления static
- •8.2.11.2. Сообщения от статического элемента управления
- •8.2.11.3. Сообщения от родительского окна к static
- •8.2.12. Стандартный элемент управления список
- •8.2.12.1. Стили элемента управления список
- •8.2.12.2. Сообщения от списка к родительскому окну
- •8.2.12.3. Сообщения от родительского окна к списку
- •8.2.13. Стандартный элемент управления список с вводом
- •8.2.13.1. Стили элемента управления combobox
- •8.2.13.2. Сообщения от combobox к родительскому окну
- •8.2.13.3. Сообщения от родительского окна к combobox
- •9. Создание и использование диалоговых окон
- •9.1. Этапы создания диалога
- •9.1.1. Создание шаблона диалога
- •9.1.2. Функция диалога
- •9.1.2.1. Сходства между диалоговой функцией и оконной процедурой
- •9.1.2.2. Различия между диалоговой функцией и оконной процедурой
- •9.2. Типы диалоговых панелей
- •9.3. Создание модального диалога
- •9.4. Закрытие модального диалога
- •9.5. Окна сообщений.
- •9.6. Немодальные диалоги
- •9.7. Диалоговые окна общего пользования
- •10. Управление файлами
- •10.1. Доступ к файловой системе
- •10.2. Потоковый ввод/вывод
- •10.3. Функции ядра Windows для работы с файлами
- •10.4. Специализированные функции для работы с файлами
- •11. Печать документов
- •11.1. Последовательность печати документа
- •11.2. Контекст устройства принтера
- •11.3. Диалог отмены печати
- •11.4. Запуск процесса печати
- •11.5. Печать страницы документа
- •11.6. Завершение печати документа
- •12. Процессы и потоки
- •12.1. Диспетчеризация потоков
- •12.2. Проблемы многопоточной технологии
- •12.3. Создание рабочего потока
- •12.4. Организация взаимодействия потоков
- •12.4.1. Рабочий поток – процесс
- •12.4.2. Процесс – рабочий поток
- •12.5. Общая схема взаимодействия потоков
- •13. Приложение "Тестер файлов"
- •13.1. Функция WinMain()
- •13.2. Функция главного окна
- •13.3. Вспомогательные функции
- •13.4. Функция рабочего потока
- •Литература к первой части
- •Литература ко второй части
10.4. Специализированные функции для работы с файлами
Одним из компонентов Windows являются так называемые файлы инициализации, имеющие расширение .INI. Это обычные текстовые файлы, однако их отличительная особенность состоит в том, что они имеют специальную структуру:
[Section] Key=Value
Количество секций в файле не ограничено, не лимитируется также и количество ключей в каждой секции. Одним из требований является обеспечение уникальности ключей внутри каждой секции.
Чтение значения ключа szKey из секции szSection файла szFilePath проводится функцией
GetPrivateProfileString( LPCTSTR szSection, LPCTSTR szKey, LPCTSTR szDefVal, LPTSTR szValue, DWORD nValue, LPCTSTR szFilePath)
если ключ в указанной секции отсутствует, в буфер szValue будет записано значение по умолчанию, указанное в szDefVal.
Запись нового значения szValue ключа szKey в секции szSection осуществляется функцией
WritePrivateProfileString( LPCTSTR szSection, LPCTSTR szKey, LPCTSTR szValue, LPCTSTR szFilePath);
Как правило, *.INI файлы расположены в той директории, в которую была установлена операционная система. Если в строке szFilePath указано только имя файла, то он будет расположен в этой Windows директории. Если же szFilePath содержит полный путь, то Windows директория будет проигнорирована.
Две функции GetProfileString() и WriteProfileString() специально предназначены для работы с Win.ini файлом.
11. Печать документов
В прежние времена разработчикам приходилось много времени тратить на то, чтобы предусмотреть возможность печати различных документов на всевозможных принтерах. Разные типы принтеров, требовали тонкой и специфической настройки, поскольку разные модели использовали различную систему команд. Теперь эта забота входит в зону ответственности Windows. Разработчик же должен получить контекст принтера, и с помощью обычных GDI функций “отрисовать” документ в этом контексте. Другими словами вы имеете “страницу”, отображаете в любой его части, в любой последовательности то, что нужно, и когда эта “страница” полностью сформирована, отправляете ее на печать. Только в этот момент происходит проигрывание созданного Windows метафайла в контексте устройства принтера, а не тогда когда вы делаете отрисовку.
11.1. Последовательность печати документа
1. Получить или создать контекст устройства принтера.
2. Создать немодальный диалог для отмены печати.
3. Активизировать процесс “спуллинга” печати.
4. “Нарисовать” каждую страницу документа, отправляя ее на печать по мере готовности.
5. Завершить процесс “спуллинга” печати.
6. Закрыть немодальный диалог и освободить контекст устройства принтера.
Итак, разберем содержание каждого шага. При этом нужно иметь в виду, что для реализации данной задачи потребуются две глобальные переменные
BOOL g_UserBreak = FALSE; HWND hDlgBreak;
Первая – выполняет роль флага, сигнализирующего о том, что пользователь решил отменить печать документа, нажав кнопку отмены в немодальном диалоге, имеющем дескриптор hDlgBreak.
11.2. Контекст устройства принтера
Наиболее простой путь получения дескриптора контекста устройства принтера – это использование стандартного Windows диалога. Программный код может выглядеть примерно так:
// дескриптор контекста принтера HDC PrnDC; // структура инициализации диалога PRINTDLG pd; pd.Flags = PD_RETURNDC; if (PrintDlg(&pd)) { // сохранить дескриптор контекста принтера PrnDC = pd.hDC; }
Второй путь связан с созданием дескриптора контекста принтера с помощью вызова функции CreateDC()
HDC CreateDC(LPCTSTR szDriver, LPCTSTR szDevice, LPCTSTR szOutput, DEVMODE* pInitData),
которая возвращает искомый контекст при задании следующих параметров:
szDriver - имя драйвера, обслуживающего принтер, например, “escp2ms”;
szDevice - имя принтерного устройства, например, “Epson LQ-100”;
szOutput - имя порта, к которому подключен принтер, например, “LPT1:”;
pInitData - указатель на структуру DEVMODE, поля которой содержат дополнительную информацию о специфической настройке принтера. Например, можно изменить размер бумажного листа, его ориентацию при печати, размер полей и прочее.
В Windows 95 получить сведения обо всех установленных принтерах можно из файла Win.ini, который содержит секцию Devices. Эта секция выглядит примерно так:
[Devices] Epson LQ-100=ESCP2MS,LPT1:
что означает, что в системе имеется один принтер с именем Epson LQ-100, который обслуживается драйвером ESCP2MS и подключен принтер к порту LPT1:.
Для Windows NT информация об установленных принтерах располагается в системном реестре.