- •История 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
Битовые образы
Битовые образы(bitmap)- этопроизвольные графические изображения.
Использование: для создания кисти фона рабочей области, для внешнего вида окон приложения, они открывают широкие возможности для разработки дизайна приложения
Windows.
Создание: с помощью графических редакторов можно нарисовать графическое изображение типа bitmap. Изображение записывается в файл с расширением имени *.bmp.
Включение в файл описания ресурсов: оператор BITMAP
MyBmp BITMAP bmpfile.bmp
Получение дескриптора: используется функция LoadBitmap.
Способы загрузки битовых образов, определенных в ресурсах приложения:
аналогично, как и для значков:
Описание ресурсов: MyBmp BITMAP bmpfile.bmp
Текст программы: HBITMAP hBitmap=LoadBitmap(hInst,”MyBmp”);
Другие способы, показанные для значков (использование идентификаторов и MAKEINTRESOURCE), также работают и для битовых изображений.
Кисть.
Этот описатель используется для создания шаблонной кисти (pattern brush). Основой кисти является битовый образ:
hBrush = CreatePatternBrush (hBitmap);
Когда Windows закрашивает этой кистью область экрана, битовый образ повторяется по горизонтали и вертикали через каждые восемь пикселей.
Кисть необходима для придания фону рабочей области того цвета, который подобран при определении класса окна:
wndclass.hbrBackground = hBrush;
! Битовые образы являются объектами GDI.
Удаление битового образа: при помощи функции DestroyObject.
Символьные строки
Использование: предназначены для облегчения перевода приложения на другие языки.
Включение в файл описания ресурсов: с помощью ключевого слова STRINGTABLE: STRINGTABLE
{
id1, "character string 1" id2, "character string 2"
[определенияостальныхстрок]
}
Идентификаторы строк, которые предшествуют каждой строке, должны быть или числами, или идентификаторами макроопределений, которые задаются в заголовочном файле. В описании ресурсов может быть только одна таблица строк. Максимальный размер каждой строки – 255 символов.
!Символьные строки могут содержать восьмеричные константыуправляющие символы, распознаваемые, функциями DrawText и MessageBox.
# define IDS_HELLO |
1 |
|
#define IDS_BYE |
2 |
|
STRINGTABLE |
|
|
{ |
|
|
IDS_HELLO |
“Hello” |
|
IDS_BYE |
“Good bye” |
|
} |
|
|
Копирование строки из ресурсов приложения в буфер в сегменте данных приложения: используется функция LoadString, затем этот буфер используется как обычная строка:
char szBuffer[256]; LoadString(hInst,id,szBuffer,iMaxLength);
MessageBox(hWnd, szBuffer,”Text from stringtable”,MB_OK);
Ресурсы, определяемые пользователем
Ресурсы, определяемые пользователем (user-defined resource) - это пользовательские типы ресурсов.
Использование: для включения самых разнообразных данных в загрузочный файл и для получения доступа в приложении к этим данным. Данные могут содержаться в любом формате – текстовом или бинарном.
Включение в файл описания ресурсов: операторы для пользовательских ресурсов могут быть:
•однострочные - используются для указания пользовательских ресурсов, которые хранятся в отдельных файлах;
MyData TEXT filedata.dat
•многострочные - используются для внедрения определений пользовательских ресурсов в файл ресурсов;
имя тип [опции] BEGIN
[Неструктурированные данные] // 8/16-тиричные значения или строки
END
Вместо имен и типов в описании пользовательского ресурса можно использовать числа. Числа могут быть преобразованы в указатели при вызове функции FindResource с использованием MAKEINTRESOURCE. Числа, используемые в качестве типа ресурса, должны быть больше 255 (меньшие числа использует Windows).
Получение дескриптора: используется функция LoadResource:
HGLOBAL hResource=LoadResource(hInst,FindResource(hInst,”TEXT”,”MyData”));
LoadResource не загружает ресурс сразу в оперативную память.
Получение доступа к ресурсу: вызов функции LockResource, которая загружает ресурс в память и возвращает указатель на него:
ТИП *ptr=(ТИП *)LockResource(hResource);
Окончание работы с ресурсом и освобождение оперативной памяти: вызов функции
FreeResource.
Таблица акселераторов
Акселераторы(ACCELERATORS) – сочетание клавиш, представляющие быстрые клавиши для определенной задачи и генерирующие сообщения WM_COMMAND (в некоторых случаях WM_SYSCOMMAND).
Использование: применяются для дублирования действий обычных опций меню.
Включение в файл описания ресурсов: при помощи таблицы ACCELERATORS или нескольких таблиц ACCELERATORS, они идентифицируются или строковым именем, или числовым идентификатором:
Идентификатор или Имя ACCELERATORS BEGIN
[определения быстрых клавиш] END
Для каждой определяемой быстрой клавиши необходима отдельная строка таблицы.
Типы определения быстрых клавиш:
• |
“char”, |
id, |
[, SHIFT] [, CONTROL] [, ALT] |
• |
“^char”, |
id, |
[, SHIFT] [, CONTROL] [, ALT] |
• |
nCode, |
id, |
ASCII [, SHIFT] [, CONTROL] [, ALT] |
• |
nCode, |
id, |
VIRTKEY [, SHIFT] [, CONTROL] [, ALT] |
Пример таблицы акселераторов, в которой определяются быстрые клавиши <Shift+F1>:
MyAccel ACCELERATORS BEGIN
VK_F1, ID_HELP, VIRTKEY, SHIFT "I", ID_INFO,
VK_F6, ID_ITEM1, VIRTKEY, CONTROL
END
Получение дескриптора: используется функция LoadAccelerators:
HACCEL hAccel=LoadAccelerators(hInst,"MyAccel");
Вместо имени таблицы быстрых клавиш можно использовать число (идентификатор таблицы), которое затем будет использоваться в инструкции, содержащейся функцию
LoadAccelerators и макрос MAKEINTRESOURCE:
HACCEL hAccel=LoadAccelerators(hInst,MAKEINTRESOURCE(IDR_ACCEL1));
Удаление таблицы акселераторов: загруженная таблица акселераторов автоматически уничтожается при завершении работы приложения.
Меню
Типы меню:
•главным меню окна (main menu) или меню верхнего уровня (top-level menu)-это строка выводящаяся непосредственно под строкой заголовка меню, оно содержит отдельные элементы, расположенные в полосе меню (menu bar).
•всплывающее меню (popup menu) или подменю (submenu).
•плавающее меню (floating menu)-это меню в любом месте экрана, независимое всплывающее меню.
•системное меню (system menu) - это всплывающее меню.
Создание:
•описание шаблона меню в файле ресурсов приложения:
•создать меню “с нуля” при помощи специальных функций Windows
•подготовить шаблон меню непосредственно в оперативной памяти и создать меню на базе этого шаблона при помощи LoadMenuIndirect.
Включение в файл описания ресурсов (первый способ создание меню):
MyMenu MENU BEGIN
[список элементов меню (пунктов или всплывающих меню)] END
Другие способы, показанные для значков, курсоров и т.д. (использование идентификаторов и MAKEINTRESOURCE), также работают и для меню.
Создание меню верхнего уровня: внутри блока BEGIN-END описания главного меню можно использовать либо инструкцию MENUITEM, либо POPUP.
•Инструкция MENUITEM имеет следующий формат: MENUITEM текст_элемента, идентификатор [, атрибуты]
•Формат инструкции всплывающего окна POPUP таков:
POPUP текст_элемента [, атрибуты] BEGIN
[список пунктов подменю] END
Создание всплывающего меню (подменю): Следующий за инструкцией POPUP блок
BEGIN-END всплывающего меню ограничивает список пунктов этого подменю.
MENUITEM текст_пункта, идентификатор [, атрибуты]
или
MENUITEM SEPARATOR
или
POPUP текст_пункта [, атрибуты]
Подключение меню:
•ссылка на меню при определении структуры класса окна перед регистрацией этого класса:
wndclass.lpszMenuName=”MyMenu”;
или wndclass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU);
•если при регистрации класса окна было определено меню, то можно создать окно с этим меню, а можно указать для создаваемого окна другое меню, для этого задаётся дескриптор нужного меню при создании окна функцией CreateWindow.
Получение дескриптора: используя функцию LoadMenu:
HMENU hMenu=LoadMenu(hInst,”MyMenu”);
или
HMENU hMenu=LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU));
Полученный дескриптор меню указывается в качестве девятого параметра функции CreateWindow:
hWnd = CreateWindow("MyClass","Caption", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,hMenu,hInst,NULL);
•динамическое подключение меню:
HMENU hMenu=LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU));
. . .
SetMenu(hWnd,hMenu);
Вызов GetMenu - можно узнать дескриптор меню, присоединенного в текущий момент:
HMENU hMenu=GetMenu(hWnd);
Динамическое создание меню (второй способ создания меню):
Создание меню:
•Создание пустого меню верхнего уровня следует - функция CreateMenu:
static HMENU hMenu;
. . .
hMenu=CreateMenu();
К созданному пустому всплывающему меню можно добавить элементы - пункты или всплывающие меню (вложенные):
AppendMenu(hMenuPopup,MF_STRING,ID_ITEM1,”Текст пункта 1 вспл.
Меню”);
AppendMenu(hMenuPopup,MF_STRING,ID_ITEM2,”Текст пункта 2 вспл.
Меню”);
•Создания всплывающего меню (подменю) - функция CreatePopupMenu:
static HMENU hMenuPopup;
. . .
hMenuPopup=CreatePopupMenu();
Добавление в меню верхнего уровня всплывающие меню или отдельные пункты - вызов функции AppendMenu:
AppendMenu(hMenu,MF_POPUP,(UINT)hMenuPopup,”Текст заголовка вспл.
Меню”);
AppendMenu(hMenu,MF_STRING,ID_ITEM3,”Текст пункта главного меню”);
Идентификаторы добавляемых пунктов ID_ITEM1-3 должны быть заранее определены при помощи директивы #define.
Подключение меню верхнего уровня к созданному ранее окну hWnd - функция SetMenu
Отображение новое меню окна - функция DrawMenuBar.
SetMenu(hWnd,hMenu);
DrawMenuBar(hWnd);
!Если окно hWnd еще не создано, то указать, что у него будет меню hMenu, можно при создании окна следующим способом:
hWnd = CreateWindow("MyClass","Caption",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT
,
NULL,hMenu,hInst,NULL);
Плавающее меню.
Создание плавающего меню:
•Сначала при помощи функции CreatePopupMenu создается пустое всплывающее меню. Это меню заполняется обычным образом при помощи функции AppendMenu, но затем оно не привязывается к главному меню приложения или какому-либо другому меню.
•Вместо этого создается плавающее меню. Для этого идентификатор этого меню передается функции TrackPopupMenu. Эта функция выводит на экран плавающее меню и создает свой собственный цикл обработки сообщений, завершающий работу после выбора строк. Поэтому функция TrackPopupMenu не возвращает управление до тех пор, пока работа с меню не будет завершена либо выбором строки, либо отказом от выбора.
•После выбора пункта плавающего меню (или отказа от выбора) само меню исчезает, а оконной процедуре окна, к которому присоединено это меню, посылается сообщение WM_COMMAND (аналогично сообщениям обычного оконного меню).
Функции для работы с меню:
•AppendMenu – добавляет новый элемент в конец меню.
•DeleteMenu – удаляет существующий пункт (если это всплывающее меню, то оно уничтожается).
•InsertMenu – вставляет в меню новый пункт.
•ModifyMenu – изменяет существующий пункт меню.
•RemoveMenu – удаляет существующий пункт меню (если это всплывающее меню, то оно не уничтожается).
•DrawMenuBar-перерисовка полосы меню окна.
•GetSubMenu- получение дескриптор всплывающего меню, являющегося элементом другого меню hMenu, по дескриптору “родительского” меню.
•CheckMenuItem, EnableMenuItem - установление или удаление метки пункта меню
Удаление меню: при помощи функции DestroyMenu.