- •Содержание
- •Часть 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. Функция рабочего потока
- •Литература к первой части
- •Литература ко второй части
7.3.6. Системные метрики
Метрики системных компонент Windows можно определить при помощи функции
int GetSystemMetrics(int nIndex)
Единственный аргумент этой функции задает параметр, значение которого необходимо определить. Значение требуемого параметра возвращается данной функцией.
Для определения того или иного компонента в заголовочных файлах Windows имеются константы с префиксом SM_. Здесь перечислены некоторые из них:
SM_CXCURSOR , SM_CYCURSOR – ширина и высота курсора.
SM_CXICON, SM_CYICON – ширина и высота пиктограммы.
SM_CXSCREEN, SM_CYSCREEN – разрешение экрана.
SM_CYCAPTION – высота заголовка окна.
SM_CYMENU – высота одной строки в полосе меню.
SM_CYHSCROLL – высота горизонтальной полосы прокрутки.
SM_CXVSCROLL – ширина вертикальной полосы прокрутки.
7.4. Определение расположения окна wm_move
При обсуждении сообщения WM_SIZE было показано, как следует определять размеры окна. Другая важная задача – определение расположения окна на экране.
При завершении перемещения окна его функция получает сообщение WM_MOVE (в отличие от сообщения WM_MOVING, которое поступает во время перемещения), а вместе с ним – новые координаты окна в параметре lParam:
xPos = LOWORD(lParam); yPos = HIWORD(lParam);
Для окон, имеющих стили WS_OVERLAPPED и WS_POPUP, координаты отсчитываются от верхнего левого угла экрана. Для окон стиля WS_CHILD эти координаты отсчитываются от верхнего левого угла внутренней области родительского окна.
В любом обработчике, а не только в WM_MOVE, можно узнать расположение окна на экране с помощью функции
GetWindowRect(HWND hWnd, RECT* lpRect)
которая заполняет поля структуры RECT текущими координатами окна с дескриптором hWnd.
7.5. Использование оконных полос прокрутки
Нередко возникает ситуация, когда выводимая в окно информация, допустим, многострочный документ, превышает текущие размеры окна. Стандартным решением этой задачи в Windows программировании является использование полос прокрутки, которые позволяют проводить вертикальный или горизонтальный скроллиг содержимого окна.
Добавить в окно приложения вертикальную или горизонтальную полосу прокрутки не представляет затруднений. Все, что необходимо сделать, это включить битовые маски WS_VSCROLL и WS_HSCROLL в список стилей окна, создаваемого функцией CreateWindowEx(). Следует заметить, что клиентская область окна не включает в себя пространство, занятое полосами прокрутки. Ширина вертикальной полосы и высота горизонтальной полос прокрутки постоянны для конкретного дисплейного драйвера. Эти значения можно получить с помощью функции GetSystemMetrics().
Заметим, что после создания окна с полосами прокрутки, они будут присутствовать на экране, но будут бездействовать, т.к. программирование логики их работы – ваша задача.
Заметим также, что Windows обеспечивает только логику работы мыши с полосами прокрутки. Однако у полос прокрутки отсутствует клавиатурный интерфейс. Если приложение желает дублировать клавишами клавиатуры некоторые функции полос прокрутки, оно должно самостоятельно реализовать эту логику при обработке клавиатурных сообщений.
7.5.1. Диапазон и положение полос прокрутки
Каждая полоса прокрутки имеет соответствующий диапазон – два целых числа, отражающих минимальное и максимальное значение, и положение бегунка – его местоположение внутри диапазона. При этом, положение бегунка всегда дискретно. Например, для полосы прокрутки с диапазоном от 0 до 4 имеется пять возможных положений бегунка.
Win32 API содержит две функции, которые позволяют выполнить все операции с полосами прокрутки. Это:
GetScrollInfo(HWND hwnd, int fnBar, SCROLLINFO* lpsi)
SetScrollInfo(HWND hwnd, int fnBar, SCROLLINFO* lpsi, BOOL fRedraw)
Первая из них возвращает, через поля заполненной структуры SCROLLINFO, всю необходимую информацию о полосе прокрутки, а вторая – позволяет установить новые значения для полосы.
В качестве первого параметра этих функций задается дескриптор окна, владеющего полосой прокрутки. Параметр fRedraw устанавливается в TRUE, если необходимо, чтобы Windows перерисовала полосы в соответствии с новыми значениями. Параметр fnBar указывает на горизонтальную (SB_HORZ) или вертикальную (SB_VERT) полосу. Третий параметр lpsi является указателем на структуру SCROLLINFO, которая имеет следующие поля:
cbSize размер структуры в байтах. Вы можете указать cbSize=sizeof(SCROLLINFO);
fMask флаг, определяющий какие из полей структуры будут заполнены. Так, если fMask=SIF_RANGE, будут заполнены значения диапазона полосы, если fMask=SIF_PAGE, то поле nPage, если fMask=SIF_POS, то поле nPos. Можно комбинировать значения, принимаемые флагом, для того, чтобы выбрать (или установить) интересующую информацию за одно обращение к функции.
nMin минимальное значение диапазона полосы.
nMax максимальное значение диапазона полосы.
nPage объем информации, укладывающийся на одной странице.
nPos текущее положение бегунка. nMin <= nPos <= nMax.
nTrackPos текущее положение бегунка при протаскивании его мышью.
При создании полосы Windows, по умолчанию, устанавливает минимальное значение диапазона в 0, а максимальное – в 100.
Если вам требуется убрать полосу просмотра у окна, установите nMin=0 и nMax=0.
Значение параметра nPage влияет на размер бегунка полосы, что вы можете наблюдать в ряде современных Windows приложений. Чтобы этого достичь в вашем приложении, рассчитайте сколько, например, строк документа размещается в видимой части окна и установите это значение вызовом SetScrollInfo(). Windows определит сколько страниц укладывается во всем документе и, в соответствии с этим, установит размер бегунка – чем меньше размер, тем больше исходный документ. Если хотите сохранить постоянные размеры бегунка при любом объеме документа, установите nPage=0.
Прежде, чем перейти к обработке сообщений полос просмотра, укажем сферы ответственности Windows и приложения при поддержке полос прокрутки.
Сферы ответственности Windows:
-
Управление логикой работы мыши с полосой прокрутки.
-
Обеспечение временной “инверсии цвета” при нажатии на кнопку мыши в полосе прокрутки.
-
Перемещение бегунка в соответствие с тем, как внутри полосы прокрутки его перемещает пользователь с помощью мыши.
-
Отправка сообщений полосы прокрутки в оконную процедуру окна, содержащего полосу.
Сферы ответственности приложения по поддержке полос покрутки:
-
Инициализация диапазона полосы прокрутки.
-
Обработка сообщений полосы прокрутки.
-
Обновление положения бегунка полосы прокрутки.