- •Методические рекомендации
- •План лекции
- •Интерфейс графического устройства
- •Программирование, основанное на ресурсах
- •Управления памятью
- •Документы и их представление
- •Контрольные вопросы
- •Редактирование функций.
- •Изучение работы приложения.
- •Самостоятельная работа.
- •Добавление своего класса.
- •Домашняя работа.
- •Лекция 2. Основы программирования. Работа с классом Вид. Методические рекомендации:
- •Интерфейс графического устройства
- •Работа с gdi объектами
- •Пример создания нового gdi объекта
- •Режимы преобразования координат
- •Режимы преобразования координат с постоянным масштабом
- •Режимы преобразования координат с переменным масштабом
- •Замечание
- •Координатные пространства mfc
- •Пример использования режимов преобразования координат
- •Работа с окнами, содержащими полосы прокрутки
- •Линейки прокрутки
- •Различные способы прокрутки
- •Прием ввода с клавиатуры
- •Контрольные вопросы
- •Обработка сообщений от мыши.
- •Задание для самостоятельной домашней разработки.
- •Лекция 3. Меню. Панели инструментов и строки состояния Методические рекомендации
- •Меню Windows
- •Обновление командного пользовательского интерфейса
- •Класс cMenu
- •Создание контекстных меню
- •Панели элементов управления и каркас приложений
- •Панель инструментов
- •Растровое изображение панели инструментов
- •Состояния кнопок Любая кнопка может находиться в следующих состояниях
- •Всплывающие подсказки
- •Строка состояния
- •Определение секций в строке состояния
- •Строка сообщений
- •Индикатор состояния
- •Управление строкой состояния
- •Контрольные вопросы:
- •Добавление переменных-членов.
- •Добавление функции OnMouseMove.
- •Программирование команд контекстного меню.
- •Программирование команд главного меню.
- •Домашняя работа.
- •Лекция 4. Диалоговые окна и стандартные элементы управления Методические рекомендации
- •Работа с модальным диалоговым окном
- •Стандартные элементы управления
- •Работа с немодальными диалоговыми окнами
- •Пользовательские сообщения
- •Принадлежность диалогового окна
- •Контрольные вопросы
- •Создание класса “диалогового окна”.
- •Добавление переменных-членов класса вашего диалогового окна.
- •Написание инициализирующего кода
- •Присваивание переменным начальных значений.
- •Самостоятельная работа.
- •Домашнее задание.
- •Лекция 5. Обработка сообщений Windows и программирование многопоточных приложений Методические рекомендации
- •Обработка сообщений в однопоточной программе
- •Передача управления
- •Таймеры
- •Обработка в периоды простоя
- •Программирование многопоточных приложений
- •Функция рабочего потока и запуск потока
- •Общение основного потока с рабочим
- •Общение рабочего потока с основным
- •Синхронизация потоков с использованием событий
- •Блокировка потоков
- •Критические секции
- •Потоки пользовательского интерфейса
- •Контрольные вопросы
- •Домашнее задание.
- •Задание для самостоятельной работы
- •Управление процессом Пример 1.
- •2. Замена образа процеса Пример 2. Использование функции exec.
- •Пример 3. Использование неименованного канала.
- •Пример 4. Создание именованного канал с именем "fifo".
- •3. Сигналы.
- •Пример 5. Использование сигналов.
- •Пример 6. Сообщения.
- •Пример 7. Сообщения.
- •Пример 8. Разделение памяти.
- •Пример 9. Использование семафоров.
- •Пример 10. Создание процесса вWindows.
- •Пример 11. Использование неименованного канала.
- •Пример 12. Использование именованного канала.
- •Пример 13. Использование разделяемой памяти File Mapping.
- •Пример 14. Использование Mailslot.
- •Пример 15. Использование событий.
Работа с немодальными диалоговыми окнами
Известно, что при создании модальных диалоговых окон сначала надо воспользоваться конструктором CDialog с параметром-идентификатором прикрепленного ресурса, чтобы сконструировать объект “диалоговое окно”, а потом вывести модальное диалоговое окно на экран, вызвав функцию-член DoModal. И как только происходит возврат из DoModal, окно прекращает свое существование.
Процесс создания немодальных диалоговых окон сложнее. Начинать необходимо с вызова конструктора CDialog по умолчанию, создавая, тем самым, объект “диалоговое окно”, а вот нужное диалоговое окно создается вызовом функции-члена CDialog::Create, а не функции DoModal. Create получает идентификатор ресурса как параметр и немедленно возвращает управление; при этом диалоговое окно остается на экране. Так что теперь именно программист должен заботиться о том, когда конструировать объект “диалоговое окно”, когда создавать само диалоговое окно, когда его уничтожать и когда обрабатывать данные, введенные пользователем.
Между созданием модальных и немодальных диалоговых окон есть следующие различия.
|
Модальное диалоговое окно |
Немодальное диалоговое окно |
Используемый конструктор |
Конструктор с параметром-идентификатором ресурса. |
Конструктор по умолчанию (без параметра) |
Функция, используемая для создания окна |
DoModal |
Create с параметром-идентификатором ресурса. |
Пользовательские сообщения
Допустим, Вы хотите, чтобы немодальное диалоговое окно уничтожалось, когда пользователь щелкает в этом окне кнопку ОК. Тут сразу же возникает проблема. Как объект “вид” узнает, что пользователь щелкнул кнопку ОК? Диалоговое окно могло бы напрямую обратиться к какой-либо функции-члену класса “вид”, но это бы связало данное диалоговое окно с конкретным классом “вид”. Более удачное решение — диалоговое окно при вызове обработчика кнопки ОК отправляет объекту “вид” пользовательское сообщение (user-defined message). Получив это сообщение, объект “вид” сможет уничтожить диалоговое окно (но не сам объект). Итак, вырисовывается сценарий создания нового диалогового окна
Есть два варианта отправки Windows-сообщений, через функции CWnd::SendMessage или PostMessage. Первая немедленно вызывает функцию-обработчик сообщения, а вторая отправляет сообщение в очередь сообщений Windows. Поскольку PostMessage вносит лишь небольшую задержку, можно считать, что функция-обработчик кнопки ОК уже завершилась, когда объект “вид” получает сообщение. |
Принадлежность диалогового окна
Теперь предположим, что Вы приняли стиль диалогового окна по умолчанию, т.е. диалоговое окно не ограничено клиентской областью окна представления.
Поскольку речь идет о Windows, “владелец” диалогового окна — основное окно рамка приложения, а не объект “вид”. Но надо знать, какой именно объект “вид” сопоставлен с диалоговым окном, чтобы отправить этому объекту сообщение. Поэтому ваш класс “диалоговое окно” должен отслеживать свой объект “вид” через переменную член, которую устанавливает конструктор. Параметр pParent конструктора CDialog в данном случае не играет никакой роли. |