- •Содержание
- •Управление памятью: хорошо, плохо и ужасно
- •Сегментированная память
- •Промежуточные решения
- •И, наконец, 32 бита
- •Выделение памяти
- •Библиотечные функции C
- •Фундаментальное выделение памяти в Windows 95
- •Перемещаемая память
- •Удаляемая память
- •Другие функции и флаги
- •Хорошо ли это?
- •Функции работы с "кучей"
- •Файловый ввод/вывод
- •Старый путь
- •Отличия Windows 95
- •Ввод/вывод с использованием файлов, проецируемых в память
- •Режимы многозадачности
- •Многозадачность в DOS
- •Невытесняющая многозадачность
- •Решения, использующие многопоточность
- •Многопоточная архитектура
- •Коллизии, возникающие при использовании потоков
- •Преимущества Windows
- •Новая программа! Усовершенствованная программа! Многопоточная!
- •Многопоточность в Windows 95
- •И снова случайные прямоугольники
- •Задание на конкурсе программистов
- •Решение с использованием многопоточности
- •О пользе использования функции Sleep
- •Синхронизация потоков
- •Критический раздел
- •Объект Mutex
- •Программа BIGJOB1
- •Объект Event
- •Локальная память потока
- •Печать, буферизация и функции печати
- •Контекст принтера
- •Формирование параметров для функции CreateDC
- •Измененная программа DEVCAPS
- •Вызов функции PrinterProperties
- •Проверка возможности работы с битовыми блоками (BitBlt)
- •Программа FORMFEED
- •Печать графики и текста
- •Каркас программы печати
- •Прерывание печати с помощью процедуры Abort
- •Реализация процедуры прерывания
- •Добавление диалогового окна печати
- •Добавление печати к программе POPPAD
- •Обработка кодов ошибок
- •Техника разбиения на полосы
- •Разбиение на полосы
- •Реализация разбиения страницы на полосы
- •Принтер и шрифты
- •Глава 16 Буфер обмена
- •Простое использование буфера обмена
- •Стандартные форматы данных буфера обмена
- •Передача текста в буфер обмена
- •Получение текста из буфера обмена
- •Открытие и закрытие буфера обмена
- •Использование буфера обмена с битовыми образами
- •Метафайл и картина метафайла
- •Более сложное использование буфера обмена
- •Использование нескольких элементов данных
- •Отложенное исполнение
- •Нестандартные форматы данных
- •Соответствующая программа просмотра буфера обмена
- •Цепочка программ просмотра буфера обмена
- •Функции и сообщения программы просмотра буфера обмена
- •Простая программа просмотра буфера обмена
- •Основные концепции
- •Приложение, раздел и элемент
- •Типы диалогов
- •Символьные строки и атомы
- •Программа сервер DDE
- •Программа DDEPOP1
- •Сообщение WM_DDE_INITIATE
- •Оконная процедура ServerProc
- •Функция PostDataMessage программы DDEPOP1
- •Сообщение WM_DDE_ADVISE
- •Обновление элементов данных
- •Сообщение WM_DDE_UNADVISE
- •Сообщение WM_DDE_TERMINATE
- •Программа-клиент DDE
- •Инициирование диалога DDE
- •Сообщение WM_DDE_DATA
- •Сообщение WM_DDE_TERMINATE
- •Управляющая библиотека DDE
- •Концептуальные различия
- •Реализация DDE с помощью DDEML
- •Элементы MDI
- •Windows 95 и MDI
- •Пример программы
- •Три меню
- •Инициализация программы
- •Создание дочерних окон
- •Дополнительная информация об обработке сообщений в главном окне
- •Дочерние окна документов
- •Освобождение захваченных ресурсов
- •Сила оконной процедуры
- •Основы библиотек
- •Библиотека: одно слово, множество значений
- •Пример простой DLL
- •Разделяемая память в DLL
- •Библиотека STRLIB
- •Точка входа/выхода библиотеки
- •Программа STRPROG
- •Работа программы STRPROG
- •Разделение данных между экземплярами программы STRPROG
- •Некоторые ограничения библиотек
- •Динамическое связывание без импорта
- •Библиотеки, содержащие только ресурсы
- •Глава 20 Что такое OLE?
- •Основы OLE
- •Связь с библиотеками OLE
- •Расшифровка кода результата
- •Интерфейсы модели составного объекта (COM-интерфейсы)
- •Услуги интерфейса IUnknown
- •Является ли OLE спецификацией клиент/сервер?
- •Сервер закрытого компонента
- •IMALLOC.DLL
- •Теперь о макросах
- •Услуги, предоставляемые интерфейсом IUnknown
- •Клиент закрытого компонента
- •Сервер открытого компонента
- •Назначение реестра
- •Способы генерации и использования идентификаторов CLSID
- •Компонент фабрика классов
- •Управление временем жизни сервера
- •Клиент открытого компонента
- •Заключение
67
{
short nMask;
char *szMask; char *szDesc;
}
BITS;
DEVCAPS2.RC
/*-----------------------------
DEVCAPS2.RC resource script
-----------------------------*/ |
|
#include "devcaps2.h" |
|
DevCaps2 MENU |
|
{ |
|
POPUP "&Device" |
|
{ |
|
MENUITEM "&Screen", |
IDM_SCREEN, CHECKED |
} |
|
POPUP "&Capabilities" |
|
{ |
|
MENUITEM "&Basic Information", |
IDM_BASIC, CHECKED |
MENUITEM "&Other Information", |
IDM_OTHER |
MENUITEM "&Curve Capabilities", |
IDM_CURVE |
MENUITEM "&Line Capabilities", |
IDM_LINE |
MENUITEM "&Polygonal Capabilities", |
IDM_POLY |
MENUITEM "&Text Capabilities", |
IDM_TEXT |
} |
|
} |
|
Рис. 15.3 Программа DEVCAPS2
Поскольку программа DEVCAPS2 получает информационный контекст принтера, вы можете выбирать принтеры из меню программы DEVCAPS2, хотя каждый из принтеров в качестве выходного порта может иметь "none". При необходимости сравнить возможности разных принтеров вы можете использовать папку Printers для добавления различных драйверов принтеров.
Вызов функции PrinterProperties
Вменю Device программы DEVCAPS2 включена опция Properties (свойства). Для ее использования нужно сначала выбрать принтер из меню Device. При выборе опции Properties появляется всплывающее окно диалога. Откуда берется это окно диалога? Оно вызывается драйвером принтера, который требует, как минимум, задать размер листа. В большинстве драйверов принтера также предлагается выбор режима печати: portrait или landscape. Режим portrait (часто задаваемый по умолчанию) подразумевает, что узкая сторона листа находится сверху; а в режиме landscape вверху находится широкая сторона листа. При изменении режима, оно отражается в информации, которую программа DEVCAPS2 получает от функции GetDeviceCaps: горизонтальные размер и разрешающая способность меняются на вертикальные размер и разрешающую способность. Диалоговые окна свойств цветных плоттеров могут быть достаточно громоздкими, в которых задаются цвета установленных в плоттере перьев и тип используемой бумаги.
ВWindows 95 во всех драйверах принтера имеется экспортируемая функция ExtDeviceMode, которая вызывает окно диалога и сохраняет заданную пользователем информацию. Некоторые драйверы принтера сохранят полученную информацию в реестре или в их собственной секции файла WIN.INI. Те, которые сохраняют эту информацию, получают к ней доступ и в следующем сеансе работы Windows.
Впрограммах для Windows, в которых у пользователя есть возможность выбора принтера, для этого обычно применяется вызов функции PrintDlg. Эта полезная функция берет на себя всю заботу о взаимодействии с пользователем и обрабатывает все внесенные пользователем при подготовке к печати изменения. Кроме этого, функция PrintDlg вызывает диалоговое окно свойств, когда пользователь нажимает кнопку Properties. Попытайтесь проделать это в программе WORDPAD. Вы увидите то же самое окно диалога, которое появляется в программе DEVCAPS2.
Программа может также вывести на экран окно диалога свойств принтера напрямую, вызывая из драйвера принтера функции ExtDeviceMode или ExtDeviceModePropSheet. Однако, это не рекомендуется. Гораздо лучше вызывать окна диалога косвенно, с помощью функции PrinterProperties. Эта функция GDI может обеспечить