Робота з буфером обміну Clipboard

ALTE DOCUMENTE

VirtualDub 1.7.7.28312 UA
ІА: Бібліарії Космічно
З дисципліни « Філософия
Передача мови по IP-мережах
Розмір, що сприймається (apparen
Відеотехніка в психолог&

Робота з буфером обміну Clipboard

Буфер обміну являє собою область пам'яті, до якої мають доступ усі програми, що працюють у системі. Програма може взаємодіяти з буфером обміну, записуючи в нього інформацію або читаючи її звідти, або виконуючи те й інше. Більше того, одна програма може записати дані в буфер обміну, а інша – прочитати їх. Обидві ці ситуації продемонстровані у наведеному нижче прикладі.

Підсистема роботи з буфером обміну. Робота з буфером обміну здійснюється за допомогою підсистеми API, що складається з 16 функцій (найчастіше Вам можуть знадобитися далеко не всі з них). Імена цих функцій та їх призначення наводяться у табл. 13.3.

Функції підсистеми Clipboard

Закрити доступ до буфера обміну

Отримати кількість форматів даних, що зберігаються в буфері обміну на даний момент

Очистити буфер обміну

Перерахувати формати даних, доступні на даний момент у буфері обміну

Отримати дескриптор пам'яті, де зберігаються дані буфера обміну

Отримати ім'я формату даних користувача

Отримати дескриптор вікна, що працює з буфером обміну зараз

Отримати дескриптор вікна, що відкрив буфер обміну

Отримати найбільш підходящий формат для даних

Визначити, чи заданий формат доступний у буфері обміну на даний момент.

Відкрити буфер обміну

Зареєструвативласний формат даних у буфері обміну

Записати дані в буфер обміну

Буфер обміну є однією з найпростіших можливостей Windows , оскільки вимагає лише двох основних операцій: помістити дані в буфер обміну і прочитати дані з нього. У наступних розділах розглядається, як виконуються ці операції.

Запис даних у буфер обміну. Загальна процедура запису даних у буфер обміну складається з наступних кроків:

1) виділити блок глобальної пам'яті, достатній для того, щоб 9; зберігати в ньому дані, які необхідно помістити в буфер обміну;

2) скопіювати дані у виділений блок пам'яті;

3) відкрити буфер обміну;

4) очистити буфер обміну;

5) налаштувати буфер обміну на виділений блок пам'яті;

6) закрити буфер обміну.

Ці кроки виконуються у наступному фрагменті програми:

// Виділити блок глобальної пам'яті та отримати

hGout = GlobalAlloc ( GHND GMEM _ DDESHARE ,

// Оператори копіювання тексту

// у світову пам'ять

Тут hGout є дескриптором глобальної пам'яті, а змінна р - покажчик. Давайте докладно розглянемо цей фрагмент. У першому його рядку виділяється блок глобальної пам'яті за допомогою функції GlobalAlloc (), прототип якої має такий вигляд:

HGLOBAL GlobalAlloc (UINT How, DWORD dwSize);

Функція GlobalAlloc() виділяє пам'ять та повертає дескриптор виділеного блоку. Якщо пам'ять може бути виділено, ця функція повертає значення NULL . Розмір виділеного блоку в байтах визначається параметром dwSize . Якщо система не має достатньої кількості вільної пам'яті, функція також повертає NULL. Властивості виділеного блоку пам'ятізадаються параметром How , який може бути будь-якою з комбінацій макросів, що мають сенс, наведених у таблиці 13.4.

Властивості виділеного блоку пам'яті

Блок може переміщатися та заповнюється нулями

Пам'ять може використовуватися для операцій з буфером обміну

Пам'ять може бути вивантажена

Пам'ять не переміщається

Блок може переміщатися у пам'яті

Блок не може змінювати розмір при операціях збирання сміття

GMEM _ NODISCARD

Блок не може бути вивантажений

Те саме, що і GMEM _ DDESHARE

GMEM _ ZEROINIT

Виділений блок пам'яті заповнюється нулями

Блок пам'яті не може переміщатися та заповнюється нулями

Пам'ять, виділена за допомогою функції GlobalAlloc () стає глобальним системним об'єктом. Пам'ять, що виділяється для використання в буфері обміну, повинна бути переміщуваною та розділюваною.

Як згадувалося, функція GlobalAlloc () повертає дескриптор, а чи не покажчик на виділену пам'ять. Для отримання вказівника на область пам'яті, виділену за допомогою GlobalAlloc(), слід використовувати функцію GlobalLock():

LPVOID GlobalLock (HGLOBAL hObj);

BOOL GlobalUnlock (HGLOBAL hObj);

Функція GlobalUnlock () повертає нульове значення у разі успішного завершення та ненульове у разі виникнення помилки. Дескриптор об'єкта, що розблокується, передається в параметрі hObj.

Після копіювання даних у глобальний блок пам'яті потрібно відкрити буфер обміну за допомогою виклику OpenClipboard () :

BOOL OpenClipboard (HWND hWnd);

Функція OpenClipboard () дозволяє програмі, що викликає, доступ до буфера обміну (тобто відкриває його). Після того, як програма відкрила буфер обміну, інші програми використовуватийого не можуть. Функція повертає ненульове значення, якщо буфер обміну успішно відкритий, і нуль, якщо буфер відкрити неможливо. Параметр hWnd визначає дескриптор вікна, що відкриває буфер обміну.

Коли буфер обміну успішно відкритий, програма повинна очистити буфер обміну, викликавши функцію EmptyClipboard () :

BOOL EmptyClipboard (void);

Функція EmptyClipboard () знищує всю інформацію, що раніше зберігалася в буфері обміну, звільняючи всі виділені блоки пам'яті, і надає буфер обміну поточному додатку. Перед викликом цієї функції буфер обміну має бути відкритим. Функція повертає ненульове значення у разі успішного завершення та нуль у разі виникнення помилки.

Щоб m 858n137i 9; записати дані в буфер обміну, його слід налаштувати на згадку, яка містить ці дані. Це робиться за допомогою виклику функції SetClipboardData():

HANDLE SetClipboardData (UINT Format, HANDLE hData);

Функція SetClipboardData () налаштовує буфер обміну використання глобальної пам'яті, дескриптор якої вказується в параметрі hData . Вона повертає новий дескриптор пам'яті, яку налаштований буфер обміну, чи NULL у разі виникнення помилки.

Формат даних, що записуються в буфер обміну, визначається параметром Format . Цей параметр може набувати визначених значень з таблиці 13.5, або задавати власний формат даних користувача.

Формати та типи даних

Растр (bitmap) у чистому вигляді

Растр (bitmap) із заголовком BITMAPINFO

Універсальний формат обміну (Data Interchange Format)

Користувальницьке растрове зображення

Користувальницький розширений метафайл

Метафайл у стилі METAFILEPICT

Текст у кодуванні OEM

Користувальницький формат даних

Формат для даних, пов'язаних з електронним пером

Файл ресурсів (Resource Interchange File Format)

Графіка у форматі TIFF

Звук у форматі WAVE

CF _ UNICODETEXT

Текст у кодуванні UNICODE

Для форматів CF _ TEXT , CF _ OEMTEXT і CF _ UNICODETEXT текстові блоки повинні закінчуватися нульовим символом, а рядки – комбінацією CR/LF – «повернення каретки»/«новий рядок». Значення в діапазоні від CF _ PRTVATEFIRST до CF _ PRIVATELAST резервуються для локальних форматів даних, а значення в діапазоні від CF _ GDIOBJFIRST до CF _ GDIOBJLAST - для користувацьких графічних об'єктів.

Після запису даних програма має відразу звільнити буфер обміну за допомогою функції CloseClipboard () :

BOOL CloseClipboard (void);

Ця функція повертає ненульове значення у разі успішного завершення та нуль у разі виникнення помилки.

Читання даних аз буфера обміну. Для читання даних із буфера обміну використовується така процедура, що складається з чотирьох кроків:

1) відкрити буфер обміну;

2) отримати покажчик на дані, записані у буфер обміну;

3) скопіювати дані з буфера обміну;

4) закрити буфер обміну.

Перелічені кроки виконуються у наступному фрагменті програми:

Щоб m 858n137i 9; отримати доступ до даних, що зберігаються в буфері обміну, останній має бути відкритим. Після цього необхідно отримати дескриптор глобальної пам'яті, у якій зберігаються дані хбуфера обміну. Це робиться за допомогою функції GetClipboardData():

HANDLE GetClipboardData (UINT Format);

Функція GetClipboardData() повертає дескриптор глобальної пам'яті, що містить інформацію у заданомуформаті. Необхідний формат даних задається у параметрі Format. Якщо в буфері обміну на момент запиту немає даних, що мають необхідний формат, функція повертає значення NULL . У наведеному фрагменті програми запитуваний формат даних CF_TEXT. Для отримання вказівника по дескриптору, що повертається функцією GetClipboardData (), використовується функція GlobalLock (), описана вище.

Тепер програма має скопіювати дані з пам'яті буфера обміну у свій локальний буфер. Оскільки функція GetClipboardData () повертає дескриптор пам'яті, на яку налаштовано буфер обміну, програма повинна скопіювати дані до того, як керування буде повернуто Windows. Причину цього легко зрозуміти: після повернення керування Windows вміст буфера обміну може бути змінений іншою програмою.

Приклад 13-3. Програма роботи з буфером обміну Clipboard

// Демонстрація роботи з буфером обміну Clipboard

#define Maxsize 100

LRESULT CALLBACK WindowFunc(HWND, UINT,

char szWinName[]="МоєВікно"; // Ім'я класу вікна

HGLOBAL hGout, hGin;

char text[]="Це текст для буфера обміну";

int WINAPI WinMain(HINSTANCE hThisInst,

return msg. wParam;

// Наступна функція викликається операційною

// системою Windows і отримує як

// параметрів сполучення 109 858n137i 7;ення з черги поєднань 109 858n137i 7;

LRESULT CALLBACK WindowFunc(HWND hwnd,

case WM _ DESTROY // Завершення програми

// Всі повідомлення, не оброблювані в

// цієї функції, скеровуються на обробку

Для цієї програми необхідний наступний файл ресурсів Clipboard . rc:

Крім того, знадобиться файлвизначень C lip. h :

#define ID_READFROMCLIP 102

буфером
Роботу цієї програми ілюструє рис. 13.3.

Мал. 13.3. Приклад роботи з буфером обміну Clipboard

1. Ємельянов А.А., Власова Є.А., Денисов Д.В., Ємельянова Н.З. Основи програмування для інформатиків та інженерів. Частина 1: Алгоритмізація та програмування мовою «С». - М: ММІЕІФП, 2004. - 208 с.

2. Керніган Б., Рітчі Д. Мова програмування Сі. – М.: Фінанси та статистика, 2001. – 352 с.

3. Круглінські Д. Дж., Уінгоу С., Шеферд Дж. Програмування на Microsoft Visual C++ 6.0 для професіоналів. - СПб.: Пітер; М.: українська редакція, 2001. – 864 с.

4. Крупник А.Б. Вивчаємо Сі. – СПб.: Пітер, 2002. – 256 с.

5. Крупник А.Б. Вивчаємо С++. – СПб.: Пітер, 2002. – 251 с.

6. Ламот А. Програмування ігор для Windows: поради професіонала. – М.: Видавничий дім «Вільямс», 2004. – 880 с.

7. Шілдт Г. Програмування на С та С++ для Windows. – К.: Торгово-видавниче бюро BHV, 2001. – 408 с.

* Селекторні кнопки іноді називають "радіокнопками" (Прим. ред.)