- •История Windows
- •Windows 1.0
- •Windows 1.3
- •Windows 2.0
- •Windows 3.0
- •Windows 3.1
- •Windows for Workgroups версии 3.11
- •Windows NT
- •Windows 95
- •Windows NT Workstation 4.0 и Windows NT Server 4.0
- •Windows NT 4.0 Server Enterprise Edition
- •Windows 98
- •Windows 98 Second Edition (SE)
- •Windows 2000
- •Windows 98 Millenium Edition (ME)
- •Windows XP
- •Общая архитектура WINDOWS приложения.
- •Каркас приложения
- •Регистрация класса окна
- •Создание окна.
- •Отображение окна.
- •Цикл обработки очереди сообщений.
- •WndProc
- •Обработка сообщений типового приложения.
- •Контрольные вопросы
- •Сообщения
- •Типы сообщений
- •Обработка клавиатурных сообщений
- •Обработка сообщений от мыши
- •Сообщения таймера
- •Контрольные вопросы
- •Организация ввода
- •Разупорядоченный ввод
- •Разделение потоками виртуальных очередей ввода
- •Локальное состояние ввода
- •Ввод с клавиатуры и фокус
- •Управление курсором мыши
- •Контрольные вопросы
- •Окна
- •Окна Windows
- •Иерархия окон
- •Оконная процедура, стандартные оконные процедуры
- •Стиль класса окна
- •Стили окон, окна основных стилей
- •Перекрывающиеся окна
- •Временные окна
- •Дочерние окна
- •Сообщения управления окнами
- •Окна с полосами прокрутки
- •Системные метрики
- •Определение размера окна
- •Определение расположения окна
- •Контрольные вопросы
- •Графический интерфейс устройств(GDI).
- •Создание (получение) контекста устройств.
- •Сохранение контекста устройства.
- •Прямые (отрезки) и кривые
- •Закрашенные области
- •Битовые шаблоны (растровые шаблоны, растровые образы)
- •Текст и шрифты
- •Режимы масштабирования и преобразования
- •Метафайл
- •Регионы
- •Путь
- •Палитры
- •Контрольные вопросы
- •Объекты ядра
- •Что такое объект ядра
- •Учет пользователей объектов ядра
- •Защита
- •Таблица описателей объектов ядра
- •Создание объекта ядра
- •Закрытие объекта ядра
- •Синхронизация объектов
- •Именованные объекты
- •Дублирование описателей объектов
- •Изменение флагов описателя
- •Синхронизация потоков
- •Критическая секция
- •Мьютексы
- •Семафоры
- •События
- •Ожидаемые таймеры
- •Контрольные вопросы
- •Ресурсы Windows приложения
- •Файлы ресурсов приложения
- •Значки (пиктограммы)
- •Курсоры
- •Битовые образы
- •Символьные строки
- •Ресурсы, определяемые пользователем
- •Таблица акселераторов
- •Меню
- •Диалоговые окна
- •Контрольные вопросы
- •Элементы управления
- •Дочерние окна управления
- •Создание дочерних окон
- •Сообщения дочерних окон родительскому окну
- •Сообщения родительского окна дочерним окнам
- •Дочерние окна и фокус ввода
- •Дочерние окна управления и цвет
- •Кнопки различных стилей (класс BUTTON)
- •Нажимаемые кнопки
- •Флажки-переключатели
- •Переключатели
- •Окна групп
- •Кнопки, определяемые пользователем
- •Статические поля (класс static)
- •Текстовые редакторы (класс edit)
- •Списки разных стилей (класс listbox)
- •Комбинированные списки (класс combobox)
- •Полосы прокрутки (класс scrollbar)
- •Контрольные вопросы
- •Расширенные элементы управления
- •Основы общих элементов управления
- •Инициализация библиотеки элементов общего пользования
- •Создание элементов управления общего пользования
- •Посылка сообщений общим элементам управления
- •Уведомляющие сообщения от общих элементов управления
- •Контрольные вопросы
- •Стандартные диалоговые окна.
- •Окна сообщений
- •Диалоговые окна общего пользования
- •Контрольные вопросы
- •Динамически подключаемые библиотеки
- •Создание DLL
- •Проецирование DLL на адресное пространство процесса
- •Функция входа/выхода
- •Функция DllMain и стандартная библиотека С
- •Функция LibEntry
- •Функция LibMain
- •Функция WEP
- •Экспорт функций и переменных из DLL
- •Импорт функций и переменных из DLL
- •Заголовочный файл DLL
- •Разделы в ЕХЕ- и DLL-файлах
- •Контрольные вопросы
- •Файлы, проецируемые в память
- •Контрольные вопросы
- •Классы, определяющие архитектуру приложения
- •Классы приложения и поддержки потоков
- •Классы приложения и потоков
- •Классы фреймов окон
- •Получение информации о приложении
- •Соглашения об именах MFC
- •Включаемые файлы
- •Функция WinMain
- •Класс CWinApp
- •Класс CWnd
- •Класс CFrameWnd
- •Создание главного окна SDI-приложения
- •Примечание
- •Создание главного окна SDI-приложения
- •Создание дочерних окон
- •Ограничение размеров окна
- •Ограничение доступа к окну
- •Создание многодокументных приложений
- •Класс CMDIChildWnd
- •MDI — пример приложения
- •Категории сообщений
- •Карта сообщений
- •Компоненты карты сообщений
- •Класс CCmdTarget
- •Стандартный маршрут команды
- •Команды обновления и класс CCmdlll
- •Функции для работы с сообщениями
- •Основные положения
- •Класс CDocTemplate
- •Класс CSingleDocTemplate
- •Роль фреймов в архитектуре "документ/представление"
- •Документ и его представления
- •Документы
- •Класс CDocument
- •Класс CArchive
- •Представления
- •Класс CView
- •Панели элементов управления
- •Класс CStatusBar
- •Класс CStatusBarCtrl
- •Класс CDialogBar
- •ControlBars — пример приложения
- •НЕКОТОРЫЕ КЛАССЫ MFC
- •Класс CObject - основной класс MFC
- •Конструкторы класса
- •Оператор присваивания
- •Диагностика
- •Проверка целостности объектов класса
- •Получение дампа объекта класса
- •Сохранение и восстановление состояния объекта
- •Метод IsSerializable
- •Виртуальный метод Serialize
- •Информация о классе
- •Виртуальный метод GetRuntimeClass
- •Метод IsKindOf
- •Класс CPoint - точка на плоскости
- •Класс CSize - относительные координаты
- •Класс CString - текстовые строки
- •Конструктор класса
- •Коллекции
- •Массивы - шаблон CArray
- •Списки - шаблон CList
- •Словари - шаблон CMap
- •Класс CTime - дата и время
- •Файловая система - класс CFile
- •Открытие и создание файлов
- •Идентификатор открытого файла
- •Закрытие файлов
- •Чтение и запись файлов
- •Метод Flush
- •Операции с файлами
- •Блокировка
- •Позиционирование
- •Характеристики открытого файла
- •Файловая система - классы CMemFile и CStdioFile
- •Модификация класса CMemFile
- •Файловая система - класс CStdioFile
- •Запись и восстановление объектов
- •Запись в архивный файл
- •Чтение из архивного файла
- •Исключения - класс CException
- •Класс CException
- •Класс CMemoryException
- •Класс CFileException
- •Приложение Except
- •Класс CArchiveException
- •Класс CNotSupportedException
- •Класс CResourceException
- •Класс CUserException
Property page |
Нет |
|
CreatePropertySheetPage |
|
|
Property sheet |
Нет |
PropertySheet |
•Элементы управления Windows Explorer
Tree view |
WC_TREEVIEW |
Нет |
List view |
WC_LISTVIEW |
Нет |
•Другие элементы управления
Animation |
ANIMATE_CLASS |
Нет |
Drag list |
“listbox” или L“listbox” MakeDragList |
|
Header |
WC_HEADER |
Нет |
Hot key |
HOTKEY_CLASS |
Нет |
Image list |
Нет |
ImageList_Create |
Progress bar |
PROGRESS_CLASS |
Нет |
Rich edit |
“RichEdit” илиL”RichEdit” Нет |
|
Tab |
WC_TABCONTROL |
Нет |
Trackbar |
TRACKBAR_CLASS |
Нет |
Up-Down |
UPDOWN_CLASS |
|
CreateUpDownControl
Посылка сообщений общим элементам управления
После создания окна общего элемента для управления его действиями ему посылаются сообщения. Для этого требуется вызов функции SendMessage с ее традиционными четырьмя параметрами: дескриптор-окна получателя, идентификатор сообщения, значение wParam и lParam. Так же как существуют специфические флаги стилей общих элементов управления, так и существуют специфические сообщения.
Альтернативой вызовам функции SendMessage является использование наборов макросов языка С, определенных в файле commctrl.h, которые получают специфичный для сообщения набор параметров, осуществляют необходимые преобразования, а затем вызывают функцию SendMessage. Возвращаемое значение также преобразуется к нужному типу, поскольку часто значение типа LRESULT, возвращаемое функцией SendMessage, не совпадает с ожидаемым типом возвращаемого значения.
• Несмотря на то, что макросы очень удобны и полезны, заголовочные файлы
Windows, к сожалению, включают определения лишь для половины элементов управления общего пользования: для анимационного изображения, заголовка списка просмотра, списка просмотра, набора страниц свойств, дерева просмотра и набора закладок для выбора.
Уведомляющие сообщения от общих элементов управления
Как и предопределенные элементы управления, общие элементы управления посылают своему родительскому окну уведомляющие сообщения. Уведомляющие сообщения информируют родительское окно о том, что что-то произошло с окном элемента управления.
• В отличие от предопределенных элементов управления, которые посылают уведомления как сообщения WM_COMMAND, общие элементы управления обычно посылают уведомления как сообщения WM_NOTIFY. Таким образом, если добавить общий элемент управления к существующему уже коду приложения, то смешивания обработки уведомляющих сообщений от предопределенных элементов управления и общих элементов в программе не произойдет. Сообщения WM_NOTIFY также предотвращают путаницу с уведомляющими сообщениями от меню, которые тоже выражаются в виде сообщений
WM_COMMAND.
Вместе с сообщением WM_NOTIFY через параметры сообщения приходит необходимая приложению информация. Через параметр wParam передается идентификатор элемента управления, пославшего это сообщение. Параметр lParam содержит указатель на структуру типа NMHDR, в которой содержатся код уведомления и другая дополнительная информация.
Приведем фрагмент программы, в котором демонстрируется последовательность действий при обработке события WM_NOTIFY:
case WM_NOTIFY: |
|
|
|
|
int idCommonCtrl=(int)wParam; |
|
// |
идентификатор |
элемента |
управления |
|
|
|
|
LPNMHDR pNMH=(LPNMHDR)lParam; |
|
// указатель на |
||
структуру |
|
|
|
|
int iCode= pNMH->code; |
// код уведомления |
|
||
HWND hWndFrom= pNMH->hwndFrom; |
// |
дескриптор |
элемента |
|
управления |
|
|
|
|
if(idCommonCtrl== ID_TOOLBAR)
{
//обработка сообщения от элемента управления
//с идентификатором ID_TOOLBAR
. . .
}
return 0l;
Однако не все уведомления общих элементов приходят как сообщения
WM_NOTIFY.
• В частности, панель инструментов, использующая сообщения WM_NOTIFY для большинства уведомлений, посылает сообщения WM_COMMAND, когда нажимается кнопка. Поскольку панель инструментов обычно используется для поддержки выбора из меню,
тот же код обработки сообщений WM_COMMAND, что для поддержки меню и быстрых клавиш, будет обрабатывать сообщения от панели инструментов.
• И еще одно исключение – «полоса прокрутки» Track bar, связанная с окном редактирования для изменения значения, которая также посылает сообщения WM_VSCROOL и WM_HSCROLL при нажатии на стрелки.
Хотя каждый общий элемент управления имеет свой собственный набор кодов уведомления, существует общий набор уведомлений:
•NM_CLICK – пользователь сделал щелчок левой кнопкой мыши.
•NM_DBLCLK – пользователь сделал двойной щелчок левой кнопкой мыши.
•NM_KILLFOCUS – элемент управления потерял фокус ввода.
•NM_OUTOFMEMORY – ошибка нехватки памяти.
•NM_RCLICK – пользователь сделал щелчок правой кнопкой мыши.
•NM_RDBLCLK – пользователь сделал двойной щелчок правой кнопкой мыши.
•NM_RETURN – пользователь нажал клавишу <Enter>.
•NM_SETFOCUS – элемент управления получил фокус ввода.
Не все общие элементы управления обязательно посылают каждое из этих уведомляющих сообщений. Например, набор закладок для выбора не посылает уведомлений, связанных с изменением фокуса ввода.
• При работе с каждым элементом управления общего пользования следует
разобраться с тем, какие уведомляющие события он посылает.
Контрольные вопросы
1.Что относят к элементам управления главного окна, составным диалоговым элементам управления, элементам управления Windows Explorer и другим элементам управления?
2.Все ли элементы управления общего пользования реализованы как класс окна?
3.Что является общим, а что нет между элементами управления общего пользования и предопределенными элементами управления?
4. Какие преимущества от использования элементов управления общего пользования? Появляется ли больше возможностей для разработчика?
5.С чего начинается работа с элементом управления общего пользования? Какие функции при этом используются?
6.При помощи какой (каких) функций создаются элементы управления общего пользования?
7.Могут ли эти элементы создаваться как дочерние окна?
8.Что нужно после создания окна общего элемента для управления его действиями?
9.Что содержится в сообщении WM_NOTIFY?
10.Перечислите общий набор уведомлений.