- •История 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
Диалоговые окна
Диалоговое окно – это окно, содержащее множество элементов управления (они являются его дочерними окнами), через которые проходит обмен данными между пользователем и приложением.
Для расположения элементов управления на поверхности диалоговой панели используется:
•включение в файл ресурсов приложения текстового описания шаблона диалоговой панели.
•использование специального редактора диалогов. Этот редактор позволяет нарисовать диалоговую панель и сохранить ее текстовое описание в файле ресурсов приложения.
•создание шаблона диалоговой панели в памяти во время работы приложения.
Создание диалогового окна:
•Создать шаблон диалога.
•Определить функцию диалога.
•Вызвать одну из функций создания диалога.
Шаблон диалоговой панели:
Включение в файл описания ресурсов: для определения типов и внешнего вида элементов управления в окне диалога приложения использует ресурс шаблона диалогового окна. Операторы диалогового окна DIALOG определяет его размещение и внешний вид, а также список всех его элементов управления.
Имя или Идентификатор DIALOG x, y, ширина, высота // левый верхний угол [необязательные операторы, определяющие свойства диалога]
BEGIN
[операторы, определяющие элементы управления] END
!Информация о размере и расположении в операторе диалогового окна измеряется в диалоговых единицах
Необязательные операторы:
•оператор CAPTION - указывает заголовок диалогового окна.
•оператор STYLE - определяет стиль диалогового окна.
•оператор CLASS - используется для указания определенного класса окна для диалога, переопределяет поведение диалогового окна.
•оператор FONT - определяет используемый в диалоговом окне шрифт.
•оператор MENU - указывает ресурс меню, определяющий меню этого диалогового окна.
Операторы, определяющие элементы управления:
•оператор определения конкретного элемента управления – содержит параметры типа элемента управления (edittext, combobox, listbox, scrollbar и т.д.),
текста, идентификатора элемента управления (текстового или числового), его расположения, стиля и расширенного стиля:
оператор_элемента_управления "text", id, x, y, width, height [, style]
•оператора CONTROL - содержит параметры класс окна для данного элемента управления(edit, combobox, listbox, scrollbar, static, button и т.д.), идентификаторы стиля окна, идентификаторы посылки сообщений дочерними окнами родительскому окну, его расположения.
CONTROL "text", id, classname, style, x, y, width, height
! Диалоговая процедура приложения обрабатывает сообщения, получаемые окном диалога. Она очень сильно напоминает оконную процедуру, но настоящей оконной процедурой не является.
Типы диалоговых окон:
•модальные окна – диалоговые окна, при выводе на кран которых работа приложения приостанавливается, т.е. функции главного окна приложения и всех дочерних окон перестают получать сообщения от мыши и клавиатуры – они попадают в окно диалоговой панели.
Модальная диалоговая панель позволяет пользователю переключиться на работу с другими приложениями.
Создание: при помощи функции DialogBox и отображает это окно как модальное диалоговое окно.
int iCode=DialogBox(hInst,MAKEINTRESOURCE(IDR_DIALOG1),hWnd,DlgProc);
Для вызова этой функции необходим дескриптор копии приложения и hWnd – дескриптор родительского окна диалоговой панели.
Приложение, вызывающее функцию DialogBox, передает адрес функции обратного вызова; DialogBox не возвращает управления, пока диалоговое окно не закроется посредством вызова функции EndDialog.
Даже при выведенном окне диалога, оконная процедура родительского окна может продолжать получать сообщения, даже и из диалоговой процедуры. Для посылки сообщения из диалоговой процедуры в оконную функцию родительского окна вызов функции SendMessage (или PostMessage в случае постановки сообщения в очередь):
SendMessage(GetParent(hDlg),. . .);
•немодальные окна – диалоговые окна, при выводе на экран которых работа приложения не приостанавливается, делая при этом недоступным владельца диалогового окна.
Однако немодальные диалоговые окна остаются над поверхностью своих оконвладельцев, даже если это окно-владелец получает фокус.
Создание: с помощью функции CreateDialog, сразу возвращает управление, а ее возвращаемым значением является дескриптор окна диалога. Немодальные окна не возвращают значения своему владельцу.
HWND hDlgModaless=NULL; // глобальная переменная, дескриптор окна диалога
. . .
hDlgModaless=CreateDialog(hInst,MAKEINTRESOURCE(IDR_DIALOG2),hWnd, DlgModalessP roc);
Однако немодальные диалоговые окна и их владельцы могут обмениваться через вызовы SendMessage. Для этого необходимо изменить цикл обработки сообщений:
while(GetMessage(&msg, NULL, 0, 0))
{
if(hDlgModaless==NULL||!IsDialogMessage(hDlgModaless,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Немодальный диалог разрушается при вызове функции DestroyWindow. Приложение отвечает за разрушение всех немодальных диалоговых окон перед своим завершением.
case WM_CLOSE:
{DestroyWindow(hDlg);
hDlgModaless=NULL;
}; return TRUE;
Отличия между диалоговой процедурой и оконной процедурой:
•Возвращаемое значение: оконная процедура возвращает значение LRESULT; а диалоговая процедура – значение типа BOOL (определяемого как int).
•Обработка некоторых сообщений: процедура диалога не обрабатывает сообщения WM_PAINT и WM_DESTROY. Процедура диалога не получит сообщения
WM_CREATE; вместо этого она выполняет инициализацию при обработке специального сообщения WM_INITDIALOG.
•Обработка сообщений по умолчанию: если оконная процедура не обрабатывает какое-то сообщение, она вызывает DefWindowProc; процедура диалога, если она не обрабатывает сообщение, возвращает FALSE (0), а если обрабатывает, то TRUE (не
0).
Работа с элементами управления диалога.
Большинство дочерних окон элементов управления посылают своему родительскому окну сообщения WM_COMMAND. Родительское окно может изменять состояние своих дочерних окон элементов управления, посылая дочерним окнам управления сообщения.
Для посылки сообщений от родительского окна дочернему окну управления с дескриптором hWndControl используется оператор следующего вида:
SendMessage(hWndControl, сообщение, параметр_wParam, параметр_lParam);
В Windows существует функция, которая позволяет получить дескриптор окна элемента управления диалоговой панели hDlg по идентификатору id элемента управления.
SendMessage(GetDlgItem(hDlg,id), сообщение, параметр_wParam, параметр_lParam);
Для работы в процедурах диалога с элементами управления диалоговых окон в программном интерфейсе Windows существует ряд функций.
Функция SendDlgItemMessage. Следующие вызовы эквивалентны:
SendDlgItemMessage(hDlg, id, iMsg, wParam, lParam);
и
SendMessage(GetDlgItem(hDlg, id),iMsg, wParam, lParam);
Функции, облегчающие работу с элементами управления в процедуре диалога:
•Для заполнения списка LISTBOX именами файлов, каталогов и дисковых устройств, предназначена функция DlgDirList.
•Для списка COMBOBOX определена аналогичная функция DlgDirListComboBox.
•Функция DlgDirSelect предназначена для получения из списка LISTBOX строки, выбранной пользователем.
•Аналогичная функция предусмотрена для списка COMBOBOX – DlgDirSelectComboBox.