Работа с клипборда Клипборд
АЛТЕ ДОКУМЕНТ
VirtualDub 1.7.7.28312 EN |
IA: Библиотекари Космически |
В дисциплината „Философия я |
Глас през IP мрежи |
Възприеман размер (привиден |
Видео оборудване в психолог & усилвател; |
Работа с клипборда Клипборд
Клипбордът е област от паметта, до която имат достъп всички приложения, работещи в системата. Програмата може да взаимодейства с клипборда, като записва информация в него или я чете от там, или прави и двете. Освен това една програма може да записва данни в клипборда, докато друга може да ги чете. И двете ситуации са демонстрирани в примера по-долу.
Подсистема на клипборда. Работата с клипборда се извършва с помощта на подсистемата API, състояща се от 16 функции (най-често може да не се нуждаете от всички). Имената на тези функции и тяхното предназначение са дадени в табл. 13.3.
Функции на подсистемата Clipboard
Затворете достъпа до клипборда
Вземете броя формати на данни, съхранявани в момента в клипборда
Изчистване на клипборда
Избройте наличните в момента формати на данни в клипборда
Вземете манипулатор на паметта, където се съхраняват данни от клипборда
Вземете името на потребителския формат на данните
Вземете манипулатор на прозореца, който в момента държи клипборда
Вземете манипулатор на прозореца, който отвори клипборда
Вземете най-добрия формат за данни
Определете дали дадения формат в момента е наличен в клипборда
Отворете клипборда
Регистрирамродния формат на данните в клипборда
Запис на данни в клипборда
Клипбордът е една от най-простите функции на Windows, защото изисква само две основни операции: поставяне на данни в клипборда и четене на данни от него. Следващите раздели обсъждат как се изпълняват тези операции.
Записване на данни в клипборда. Общата процедура за запис на данни в клипборда се състои от следните стъпки:
1) разпределете блок от глобална памет, достатъчно голям заm 858n137i 9; съхранявайте в него данните, които са ви необходими за m 858n137i 3;
2) копиране на данните в разпределения блок памет;
3) отворен клипборд;
4) изчистете клипборда;
5) настройте клипборда на разпределения блок памет;
6) затворете клипборда.
Тези стъпки се изпълняват в следния програмен фрагмент:
// Разпределяне на блок глобална памет и получаване
hGout = GlobalAlloc (GHND GMEM _ DDESHARE,
// Оператори за копиране на текст
// към глобалната памет
Тук hGout е манипулатор на глобалната памет, а p е указател. Нека разгледаме по-подробно този фрагмент. В първия си ред се разпределя блок от глобална памет с помощта на функцията GlobalAlloc (), чийто прототип е както следва:
HGLOBAL GlobalAlloc(UINT Как, DWORD dwSize);
Функцията GlobalAlloc() разпределя памет и връща манипулатор на разпределения блок. Ако паметта не може да бъде разпределена, тази функция връща NULL. Размерът на разпределения блок в байтове се определя от параметъра dwSize. Ако системата няма достатъчно свободна памет, функцията също връща NULL. Свойства на блока памет, който ще бъде разпределенсе дават от параметъра Как, който може да бъде всяка от смислените комбинации от макроси, показани в таблица 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 формат, HANDLE hData);
Функцията SetClipboardData() настройва клипборда да използва глобалната памет, чийто манипулатор е посочен в параметъра hData. Той връща нов манипулатор към паметта, на която е настроен клипборда, или NULL при грешка.
Форматът на данните, записани в клипборда, се определя от параметъра Format. Този параметър може да приема предварително зададени стойности от таблица 13.5 или да задава собствен формат на данните на потребителя.
Формати и типове данни
Растер (bitmap) в най-чистата му форма
Растер ( растерно изображение ) със заглавка BITMAPINFO
Универсален формат за обмен (Формат за обмен на данни)
Персонализирано растерно изображение
Персонализиран подобрен метафайл
Метафайл в стил METAFILEPICT
OEM кодиран текст
Персонализиран формат на данните
Формат за данни, свързани с писалка
Файл с ресурси (файлов формат за обмен на ресурси)
Графика във формат 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 формат);
Функцията GetClipboardData() връща манипулатор към глобалната памет, съдържащ информацията в даденотоформат. Необходимият формат на данните е посочен в параметъра Format. Ако няма данни в необходимия формат в клипборда по време на заявката, функцията връща NULL. В горния програмен фрагмент исканият формат на данните е CF_TEXT. За да получите указател от манипулатора, върнат от функцията GetClipboardData(), използвайте функцията GlobalLock(), описана по-горе.
Сега програмата трябва да копира данните от паметта на клипборда в собствения си локален клипборд. Тъй като функцията GetClipboardData() връща манипулатор на паметта, на която е настроен клипборда, програмата трябва да копира данните, преди контролът да бъде върнат на Windows. Причината за това е лесно разбираема: след като Windows върне контрола, съдържанието на клипборда може да бъде модифицирано от друго приложение.
Пример 13-3. Програма за клипборд
// Демонстрация на работа с клипборда на клипборда
#define Maxsize 100
LRESULT ОБРАТНО ПОВИКВАНЕ WindowFunc(HWND, UINT,
char szWinName[]="Моят прозорец"; // Име на клас прозорец
HGLOBAL hGout, hGin;
char text[]="Това е текстът за клипборда";
int WINAPI WinMain(HINSTANCE hThisInst,
връщане на съобщ. wParam;
// Следващата функция се извиква от операционната
// Windows система и получава като
// параметри на съобщениетоm 858n137i 7;опашка от съобщенияm 858n137i 7;
LRESULT CALLback WindowFunc(HWND hwnd,
case WM _ DESTROY : // Прекратяване на програмата
// Всички съобщения m 858n137i 7;
// на тази функция се изпращат за обработка
Тази програма изисква следния ресурсен файл на клипборда. rc:
Освен това ви трябва файлC устни определения. ч:
#define ID_READFROMCLIP 102
![]() |
Ориз. 13.3. Пример за клипборд
1. Емелянов А.А., Власова Е.А., Денисов Д.В., Емелянова Н.З. Основи на програмирането за компютърни учени и инженери. Част 1: Алгоритмизиране и програмиране на езика "C". - М .: MMIEIFP, 2004. - 208 с.
2. Керниган Б., Ричи Д. Езикът за програмиране C. - М.: Финанси и статистика, 2001. - 352 с.
3. Kruglinski D. J., Wingow S., Shepherd J. Програмиране на Microsoft Visual C++ 6.0 за професионалисти. - Санкт Петербург: Питър; М.: Българско издание, 2001. - 864 с.
4. Крупник А.Б. Учене C. - Санкт Петербург: Питър, 2002. - 256 с.
5. Крупник А.Б. Изучаване на C++. - Санкт Петербург: Питър, 2002. - 251 с.
6. Lamot A. Програмиране на игри за Windows: професионални съвети. - М .: Издателска къща Уилямс, 2004. - 880 с.
7. Shildt G. Програмиране на C и C++ за Windows. - К .: Търговско-издателско бюро BHV, 2001. - 408 с.
* Бутоните за избор понякога се наричат "радио бутони" (ред.)