- •Часть 2 (продолжение): Прикладное программирование в Windows
- •Глава 8. Виртуальное окно: работа с текстом
- •8.1. Оконные координаты, цвета, отображение строк
- •Кодировка rgb-значений
- •Размеры системных метрик
- •8.2. Виртуальное окно
- •Способы заполнения прямоугольной области
- •8.3. Изменение шрифтов
- •Макроимена распространенных шрифтов
- •8.4. Создание собственных шрифтов
- •Глава 9. Программирование графики
- •9.1. Логическая система координат
- •Рекомендуемый самый яркий состав цветов
- •9.2. Пиксели, линии, дуги, прямоугольники, эллипсы и секторы
- •9.3. Работа с перьями и кистями
- •Типы линий, создаваемых пером
- •9.4. Технология виртуального окна
- •9.5. Режимы отображения и области вывода
- •Текущий режим отображения (mappind mode)
- •Глава 10. Работа с панелями инструментов
- •10.1. Общие элементы управления
- •Общие элементы управления
- •10.2. Подключение и инициализация общих элементов управления
- •10.3. Работа с панелью инструментов
- •Начальные состояния кнопок панели инструментов
- •Стиль кнопки определяется (значения поля fsStyle)
- •Сообщения к панели инструментов
- •10.4. Создание растрового изображения для панели инструментов
- •10.5. Включение подсказок
- •Глава 11. Спины, ползунки и индикаторы процессов
- •11.1. Работа со спином
- •Стили «up-down control»
- •Сообщения, которые можно посылать спину
- •11.2. Создание спина с «приятельским» окном
- •11.3. Работа с ползунком
- •Значения стилей для ползунка
- •Перечень сообщений, которые можно посылать ползунку
- •Перечень нотификационных сообщения ползунка
- •11.4. Индикатор процесса
- •Управляющие сообщения индикатору
- •Глава 12. Многозадачность: процессы и потоки
- •12.1. Создание нового процесса (отдельной задачи)
- •Разрешенные значения поля dwFlags
- •12.2. Многопотоковые программы
- •12.3. Работа с несколькими потоками
- •12.4. Синхронизация процессов и потоков: семафоры
- •12.5. Обработка событий
- •Глава 13. Приемы программного управления вычислительным процессом
- •13.1. Использование функций Проводника Explorer для работы в файловой системе
- •Управляющая информация Проводника
- •Режимы обработки файлов
- •13.2. Создание собственных динамических библиотек (dll-файлов)
- •13.3. Работа с буфером обмена Clipboard
- •Функции подсистемы Clipboard
- •Свойства выделяемого блока памяти
- •Форматы и типы данных
- •Литература
Свойства выделяемого блока памяти
№ |
Макрос |
Значение |
1 |
GHND |
Блок может перемещаться и заполняется нулями |
2 |
GMEM_DDESHARE |
Память может использоваться для операций c буфером обмена |
3 |
GMEM_DISCARDABLE |
Память может быть выгружена |
4 |
GMEM_LOWER |
Память не перемещается |
5 |
GMEM_NOCOMPACT |
Блок может перемещаться в памяти |
6 |
|
Блок не может изменять размер при операциях сборки мусора |
7 |
GMEM_NODISCARD |
Блок не может быть выгружен |
8 |
GMEM_SHARE |
To же, что и GMEM_DDESHARE |
9 |
GMEM_ZEROINIT |
Выделенный блок памяти заполняется нулями |
10 |
GPTR |
Блок памяти не может перемещаться и заполняется нулями |
Память, выделенная при помощи функции GlobalAlloc(), становится глобальным системным объектом. Память, выделяемая для использования в буфере обмена, должна быть перемещаемой и разделяемой.
Как уже упоминалось, функция GlobalAlloc() возвращает дескриптор, а не указатель на выделенную память. Для получения указателя на область памяти, выделенную при помощи GlobalAlloc(), следует использовать функцию GlobalLock():
LPVOID GlobalLock(HGLOBAL hObj);
Функция GlobalLock() фиксирует в памяти объект (блок), дескриптор которого передается в параметре hObj. Зафиксированный объект не перемещается в памяти и не выгружается. Функция GlobalLock() возвращает адрес начала блока в случае успешного завершения или NULL при возникновении ошибки. Чтобы осуществить обращение к глобальным блокам памяти, эти блоки нужно обязательно зафиксировать. Таким образом, вызов функции GlobalLock() – это способ получения указателя на блок глобальной памяти. Фиксация блока также предохраняет память от обращения к ней других программ, пока с этой памятью работает Ваша программа.
После получения указателя на глобальный блок памяти необходимо скопировать в этот блок данные, которые Вы хотите поместить в буфер обмена. Когда копирование завершится, блок памяти можно разблокировать, вызвав функцию GlobalUnlock():
BOOL GlobalUnlock(HGLOBAL hObj);
Функция GlobalUnlock() возвращает нулевое значение в случае успешного завершения и ненулевое при возникновении ошибки. Дескриптор разблокируемого объекта передается в параметре hObj.
После копирования данных в глобальный блок памяти нужно открыть буфер обмена при помощи вызова функции OpenClipboard():
BOOL OpenClipboard(HWND hWnd) ;
Функция OpenClipboard() разрешает вызывающей программе доступ к буферу обмена (т.е. открывает его). После того как программа открыла буфер обмена, другие приложения использовать его не могут. Функция возвращает ненулевое значение, если буфер обмена успешно открыт, и нуль, если в данный момент буфер открыть невозможно. Параметр hWnd задает дескриптор окна, открывающего буфер обмена.
Когда буфер обмена успешно открыт, приложение должно очистить буфер обмена, вызвав функцию EmptyClipboard():
BOOL EmptyClipboard(void);
Функция EmptyClipboard() уничтожает всю ранее хранившуюся в буфере обмена информацию, освобождая все выделенные блоки памяти, и предоставляет буфер обмена текущему приложению. Перед вызовом этой функции буфер обмена должен быть открыт. Функция возвращает ненулевое значение в случае успешного завершения и нуль при возникновении ошибки.
Чтобы записать данные в буфер обмена, его следует настроить на память, содержащую эти данные. Это делается при помощи вызова функции SetClipboardData():
HANDLE SetClipboardData(UINT Format, HANDLE hData);
Функция SetClipboardData() настраивает буфер обмена на использование глобальной памяти, дескриптор которой указывается в параметре hData. Она возвращает новый дескриптор памяти, на которую настроен буфер обмена, либо NULL в случае возникновения ошибки.
Формат данных, записываемых в буфер обмена, задается параметром Format. Этот параметр может принимать предопределенные значения из таблицы 13.5, либо задавать собственный формат данных пользователя.
Таблица 13.5
