Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС / Лаб_11.doc
Скачиваний:
122
Добавлен:
11.04.2015
Размер:
114.18 Кб
Скачать

12

Лабораторная работа № 11. Организация обмена данными между приложениями в Windows

  1. Изучение механизма обмена данных между Windows приложениями посредством буфера обмена.

  2. Овладение приёмами реализации обмена данными посредством буфера обмена при разработке Windows приложений.

Краткие теоретические сведения

Операционные системы семейства Windows предоставляют несколько механизмов обмена данными между приложениями: буфер обмена, динамический обмен данными (DDE), внедрение и связывание объектов (OLE) и др. Наиболее простым является буфер обмена.

Windows поддерживает ряд стандартных форматов данных буфера обмена, например:

CF_TEXT – оканчивающаяся нулем группа символов из набора символов ASCII, в конце которой имеются символы возврата каретки и перевода строки;

CF_BITMAP – зависящий от устройства битовый образ;

CF_TIFF – блок памяти, содержащей данные в формате Tag Image File Format (TIFF);

CF_DIB – блок памяти, определяющий независящий от устройства битовый образ;

CF_PALETTE – описатель цветовой палитры.

CF_DSPTEXT – нестандартный текстовый формат – оканчивающаяся нулем группа символов из набора символов ASCII, в конце которой имеются символы возврата каретки и перевода строки;

Основные функции по управлению буфером обмена.

BOOL OpenClipboard(

HWND hWndNewOwner /* Описатель окна, связанного с открытым буфером обмена. Если параметр равен NULL, то открытый буфер обмена связывается с текущей задачей. */

) – открывает буфера обмена для проверки и предотвращает доступ к нему для изменения содержимого со стороны других приложений. При успешном выполнении возвращает TRUE, иначе – FALSE. Чтобы получить расширенную информацию об ошибке нужно вызвать функцию GetLastError.

BOOL CloseClipboard(VOID) – закрывает буфер обмена. При успешном выполнении возвращает TRUE, иначе – FALSE. Чтобы получить расширенную информацию об ошибке нужно вызвать функцию GetLastError.

BOOL EmptyClipboard(VOID) – освобождает буфер обмена и освобождает описатели данных в буфере обмена, затем назначает владельцем буфера обмена окно, которое в настоящее время имеет открытый буфер обмена. При успешном выполнении возвращает TRUE, иначе – FALSE. Чтобы получить расширенную информацию об ошибке нужно вызвать функцию GetLastError.

HANDLE SetClipboardData(

UINT uFormat, // формат буфера обмена

HANDLE hMem /* Описатель данных в указанном формате. Этот параметр может быть NULL, указывая, что окно дает информацию в указанном формате буфера обмена (отдает формат) после запроса. Если окно задерживает предоставление, оно должно обработать сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS. */

) – помещает данные в буфер обмена в указанном в первом параметре формате. При успешном завершении возвращает описатель данных. При неудачном завершении функция возвращает NULL. Чтобы получить расширенную информацию об ошибке нужно вызвать функцию GetLastError.

Окно должно быть текущим владельцем буфера обмена, и приложение должно вызвать функцию OpenClipboard. Отвечая на сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS, владелец буфера обмена не должен вызывать функцию OpenClipboard перед вызовом функции SetClipboardData.

Как только функция SetClipboardData вызвана, система получает объект, идентифицированный hMem параметром. Приложение может прочитать данные, но не должно освобождать описатель или оставлять его заблокированным. Если параметр hMem идентифицирует объект памяти, объект, должно быть, был размещен, используя функцию GlobalAlloc с флагами GMEM_MOVEABLE и GMEM_DDESHARE.

Для помещения данных в буфер обмена необходимо получить описатель памяти размера в байтах Length GlobalAlloc (GHND | GMEM_DDESHARE, Length). Затем получить адрес памяти, вызвав функцию GlobalLock и передав ей описатель памяти. Произвести копирование необходимых данных по этому адресу памяти. Вызвать функцию GlobalUnlock и передать в нее описатель памяти. После чего передать описатель памяти функции SetClipboardData. Для помещения в буфер обмена данных типа CF_BITMAP нужно сразу передать функции SetClipboardData описатель битового образа. Описанные выше в этом абзаце дополнительные операции не нужны.

HANDLE GetClipboardData(

UINT uFormat // формат буфера обмена

) – возвращает данные из буфера обмена в указанном в параметре формате. При успешном завершении функция возвращает описатель объекта буфера обмена в указанном формате, в противном случае возвращает NULL. Чтобы получить расширенную информацию об ошибке нужно вызвать функцию GetLastError. Чтобы получить адрес данных, необходимо вызвать функцию GlobalLock и передать в нее описатель объекта буфера обмена. После копирования данных нужно вызвать функцию GlobalUnlock и передать ей описатель объекта буфера обмена. Для формата данных CF_BITMAP функция возвращает описатель битового образа, поэтому вызов дополнительных функций не требуется.

BOOL IsClipboardFormatAvailable(

UINT format // формат буфера обмена

) – проверяет, есть ли в буфере обмена данные заданного формата. Если буфер обмена содержит данные указанного формата, то функция возвращает значение TRUE, в противном случае возвращает FALSE. Чтобы получить расширенную информацию об ошибке нужно вызвать функцию GetLastError.

The RegisterClipboardFormat function registers a new clipboard format. This format can then be used as a valid clipboard format.

UINT RegisterClipboardFormat(

LPCTSTR lpszFormat /* указатель на завершающуюся нулевым символом строку имени нового формата */

) – регистрирует новый формат данных для буфера обмена. При успешном выполнении возвращает идентификатор нового формата, иначе – 0. Чтобы получить расширенную информацию об ошибке нужно вызвать функцию GetLastError.

HWND SetClipboardViewer(

HWND hWndNewViewer /* описатель окна нового просмотрщика буфера обмена */

) – добавляет заданное окно в цепочку просмотрщиков буфера обмена. При успешном завершении возвращает описатель следующего окна в цепочке просмотрщиков буфера обмена. При возникновении ошибки или отсутствии других окон в цепочке буферов обмена возвращает NULL. Чтобы получить расширенную информацию об ошибке нужно вызвать функцию GetLastError.

BOOL ChangeClipboardChain(

HWND hWndRemove, /* описатель удаляемого окна, должен быть передан функции SetClipboardViewer */

HWND hWndNewNext /* описатель следующего окна в цепочке буферов обмена; возвращается функцией SetClipboardViewer, если последовательность не была изменена в ответе на сообщение WM_CHANGECBCHAIN */

) – удаляет заданное окно из цепочки просмотрщиков буфера обмена. Возвращаемое значение указывает на результат отправки сообщения WM_CHANGECBCHAIN в окно просмотрщика буфера обмена.

Сообщение WM_CHANGECBCHAIN посылается первому окну в цепочке просмотрщиков буфера обмена, когда некое окно удаляется из цепочки просмотрщиков буфера обмена. В параметре wParam передается описатель удаляемого из цепочки просмотрщиков буфера обмена окна. В параметре lParam передается описатель следующего в цепочке просмотрщиков буфера окна (NULL, если удаляемое из цепи окно последнее). Если приложение обрабатывает это сообщение, то оно должно вернуть 0.

Сообщение WM_DRAWCLIPBOARD посылается первому окну в цепочке просмотрщиков буфера обмена, когда содержимое буфера обмена изменяется. Это сообщение не имеет параметров.

Для помещения данных в буфер обмена необходимо выполнить следующие четыре функции:

OpenClipboard(hwnd);

EmptyClipboard();

SetClipboardData(iFormat, hHandle);

CloseClipboard().

Для получения доступа к этим данным требуются вызовы трех функций:

OpenClipboard(hwnd);

hHandle = GetClipboardData (iFormat);

[Другие строки программы]

CloseClipboard().

Дополнительные сведения о разработке графического интерфейса приложений, необходимые для выполнения работы.

HDC GetDC(

HWND hWnd // описатель окна

) – при успешном завершении возвращает контекст устройства для клиентской области окна, иначе – NULL.

BOOL DeleteDC(

HDC hdc // описатель контекста устройства

) – удаляет контекст устройства; при успешном завершении возвращает TRUE, в противном случае – FALSE.

HDC CreateCompatibleDC(

HDC hdc // описатель контекста устройства

) – при успешном выполнении возвращает описатель контекста памяти, совместимый с действительным контекстом устройства, иначе возвращает NULL. Контекст памяти имеет поверхность отображения, существующую только в памяти.

HBITMAP CreateCompatibleBitmap(

HDC hdc, // описатель контекста устройства

int nWidth, // ширина битового образа в пикселях

int nHeight // высота битового образа в пикселях

) создает битовый образ, совместимый с контекстом устройства. При успешном завершении возвращает описатель битового образа, иначе – NULL.

HBITMAP CreateBitmapIndirect(

CONST BITMAP *lpbm /* указатель на информацию о битовом образе */

) – создает битовый образ с определенной шириной, высотой и цветовым форматом. При успешном выполнении возвращает описатель битового образа, иначе – NULL.

int GetObject(

HGDIOBJ hgdiobj, //описатель графического объекта

int cbBuffer,// размер буфера для информации об объекте

LPVOID lpvObject // указатель на буфер для информации об объекте

) – получает информацию о графическом объекте. При успешном завершении, если последний параметр действительный указатель, возвращает число байт, сохраненных в буфере. При успешном завершении, если последний параметр пуст (NULL), возвращает число байт, требуемых для сохранения информации об объекте. При неудачном завершении возвращает 0. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError.

Если необходимо получить информацию о битовом образе, следует сделать вызов типа GetObject(hBitmap, sizeof(BITMAP), &bm), где переменная bm имеет тип BITMAP, а описатель hBitmap имеет тип HBITMAP. Описание структуры BITMAP:

typedef struct tagBITMAP { // bm

LONG bmType; /* определяет тип битового образа, должен равняться 0 */

LONG bmWidth; // определяет ширину в пикселях битового образа

LONG bmHeight; // определяет высоту в пикселях битового образа

LONG bmWidthBytes; /* ширина битового образа в байтах (должна быть четной) */

WORD bmPlanes; // число цветовых плоскостей

WORD bmBitsPixel; // число битов на пиксель

LPVOID bmBits; // указатель на массив битов

} BITMAP;

BOOL DPtoLP(

HDC hdc, // описатель контекста устройства

LPPOINT lpPoints, // указатель на массив точек

int nCount // число точек в массиве

) – преобразует координаты устройства в логические координаты, результат преобразования сохраняется во втором параметре. При успешном завершении возвращает TRUE, иначе – FALSE.

BOOL LPtoDP(

HDC hdc, // описатель контекста устройства

LPPOINT lpPoints // указатель на массив точек

int nCount // число точек в массиве

) – преобразует логические координаты в координаты устройства, результат преобразования сохраняется во втором параметре. При успешном завершении возвращает TRUE, иначе – FALSE.

BOOL PatBlt(

HDC hdc, // описатель контекста устройства

int nXLeft, /* x-координата в логических единицах верхнего левого угла заполняемого прямоугольника */

int nYLeft, /* y-координата в логических единицах верхнего левого угла заполняемого прямоугольника */

int nWidth, /* ширина в логических единицах заполняемого прямоугольника */

int nHeight, /* высота в логических единицах заполняемого прямоугольника */

DWORD dwRop // код растровой операции

) – рисует заданный 3 – 6 параметрами прямоугольник, используя выбранную в контекст устройства кисть, цвет кисти и цвет поверхности комбинируются с использованием заданной в последнем параметре растровой операции. при успешном завершении возвращает TRUE, в противном случае – FALSE. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError.

Кодом растровой операции может быть одно из следующих значений:

  • PATCOPY – заполняет прямоугольник цветом шаблона (кисти);

  • PATINVERT – комбинирует цвет шаблона (кисти) с цветом поверхности рисования посредством побитовой операции OR;

  • DSTINVERT – инвертирует побитого цвета поверхности рисования в заданном прямоугольнике;

  • BLACKNESS – заполняет заданный прямоугольник черным цветом;

  • WHITENESS – заполняет заданный прямоугольник белым цветом.

BOOL BitBlt(

HDC hdcDest, // описатель контекста устройства назначения

int nXDest, /* x-координата в логических единицах верхнего левого угла прямоугольника назначения */

int nYDest, /* y-координата в логических единицах верхнего левого угла прямоугольника назначения */

int nWidth, /* ширина в логических единицах прямоугольника назначения*/

int nHeight, /* высота в логических единицах прямоугольника назначения*/

HDC hdcSrc, // описатель контекста устройства источника

int nXSrc, /* x-координата в логических единицах верхнего левого угла прямоугольника источника */

int nYSrc, /* y-координата в логических единицах верхнего левого угла прямоугольника источника */

DWORD dwRop // код растровой операции

) – выполняет перенос битового блока цветовых данных, соответствующих заданному прямоугольнику пикселей, одного контекста устройства в другой контекст устройств. При успешном завершении возвращает TRUE, в противном случае – FALSE. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError.

Код растровой операции определяет, каким образом цвета прямоугольника источника комбинируются с цветами прямоугольника приемника, чтобы дать результирующий цвет. Всего возможно 256 кодов растровой операции, 15 из них имеют следующие имена:

  • BLACKNESS – заполняет прямоугольник назначения черным цветом;

  • DSTINVERT – инвертирует побитого цвета прямоугольника назначения;

  • MERGECOPY – получает цвета прямоугольника назначения побитовой операцией AND, примененной к цветам шаблона (кисти) и цветам прямоугольника источника;

  • MERGEPAINT – получает цвета прямоугольника назначения побитовой операцией OR, примененной к инвертированным цветам прямоугольника источника и цветам области прямоугольника назначения;

  • NOTSRCCOPY – инвертирует цвета прямоугольника источника и копирует в прямоугольник назначения;

  • NOTSRCERASE – комбинирует цвета прямоугольника назначения с цветами области прямоугольника назначения с помощью побитовой операции OR и побитого инвертирует результат;

  • PATCOPY – заполняет прямоугольник назначения цветом шаблона (кисти);

  • PATINVERT – комбинирует цвета шаблона (кисти) с цветами области прямоугольника назначения с помощью побитовой операции XOR;

  • PATPAINT – комбинирует цвета шаблона (кисти) с цветами, полученными побитовой операцией инвертирования цветов прямоугольника источника, с помощью побитовой операцией OR; результат этой операции комбинируется с цветами области прямоугольника назначения с помощью побитовой операции OR;

  • SRCAND – комбинирует цвета прямоугольника источника с цветами области прямоугольника назначения с помощью побитовой операции AND;

  • SRCCOPY – копирует прямоугольник источник в область прямоугольника назначения;

  • SRCERASE – комбинирует посредством побитовой операции AND цвета прямоугольника источника с цветами, полученными операцией побитового инвертирования цветов области прямоугольника назначения;

  • SRCINVERT – комбинирует цвета прямоугольника источника с цветами области прямоугольника назначения с помощью побитовой операции XOR;

  • SRCPAINT – комбинирует цвета прямоугольника источника с цветами области прямоугольника назначения с помощью побитовой операции OR;

  • WHITENESS – заполняет прямоугольник назначения белым цветом.

HRGN CreateRectRgnIndirect(

CONST RECT *lprc /* указатель на структуру RECT, которая содержит координаты верхнего левого угла и нижнего правого угла прямоугольника */

) – создает прямоугольный регион. При успешном завершении возвращает описатель региона, в противном случае – NULL.

int SelectClipRgn(

HDC hdc, // описатель контекста устройства

HRGN hrgn // описатель выбираемого региона

) – выбирает регион в качестве текущего региона отсечения для заданного контекста устройства. Возвращает одно из следующих значений:

NULLREGION – регион пустой;

SIMPLEREGION – регион – единичный прямоугольник;

COMPLEXREGION – регион более, чем один прямоугольник;

ERROR – произошла ошибка.

Задать в контексте устройства hdc в качестве области отсечения прямоугольник, определяемый структурой rec можно вызовом SelectClipRgn(hdc, CreateRectRgnIndirect(&rec).

int MapWindowPoints(

HWND hWndFrom, /* описатель окна из которого отображаются точки (если задано NULL или HWND_DESKTOP, то предполагаются координаты экрана) */

HWND hWndTo, /* описатель окна в который отображаются точки (если задано NULL или HWND_DESKTOP, то точки конвертируются в координаты экрана) */

LPPOINT lpPoints, // указатель на массив отображаемых точек

UINT cPoints // число точек в массиве

) – отображает множество точек из координатного пространства относительно одного окна в координатное пространство относительно другого окна. При успешном завершении функции младшее слово возвращаемого значения – число пикселей, добавленных к горизонтальной координате каждой точки источника для того, чтобы рассчитать горизонтальную координату каждой точки назначения; старшее слово возвращаемого значения – число пикселей, добавленных к вертикальной координате каждой точки источника для того, чтобы рассчитать вертикальную координату каждой точки назначения

Для создания элемента горизонтальной прокрутки в диалоговом окне, необходимо использовать стиль WS_HSCROLL. Для создания элемента вертикальной прокрутки в диалоговом окне, необходимо использовать стиль WS_VSCROLL.

BOOL SetScrollRange(

HWND hWnd, /* описатель элемента полосы прокрутки диалогового окна или описатель обычного окна приложения со стандартной полосой прокрутки в зависимости от значения второго параметра*/

int nBar, /* флаг полосы прокрутки; возможные значения: SB_CTL – элемент управления полосы прокрутки (параметр hWnd – описатель элемента управления полосы прокрутки, устанавливается диапазон элемента управления полосы прокрутки), SB_HORZ – устанавливается диапазон стандартной горизонтальной полосы прокрутки обычного окна приложения, SB_VERT – устанавливается диапазон стандартной вертикальной полосы прокрутки обычного окна приложения * /

int nMinPos, // минимальная позиция бегунка полосы прокрутки

int nMaxPos, // максимальная позиция бегунка полосы прокрутки

BOOL bRedraw /* флаг перерисовки: TRUE – полоса прокрутки перерисовывается, FALSE – полоса прокрутки не перерисовывается */

) – устанавливает минимальное и максимальное значение позиции для бегунка полосы прокрутки. При успешном завершении возвращает TRUE, в противном случае – FALSE. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError.

BOOL GetScrollRange(

HWND hWnd, /* описатель элемента полосы прокрутки диалогового окна или описатель обычного окна приложения со стандартной полосой прокрутки в зависимости от значения второго параметра*/

int nBar, /* флаг полосы прокрутки; возможные значения: SB_CTL – элемент управления полосы прокрутки (параметр hWnd – описатель элемента управления полосы прокрутки, возвращается диапазон элемента управления полосы прокрутки), SB_HORZ – возвращается диапазон стандартной горизонтальной полосы прокрутки обычного окна приложения, SB_VERT – возвращается диапазон стандартной вертикальной полосы прокрутки обычного окна приложения * /

LPINT lpMinPos, /* адрес переменной, в которую возвращается минимальное значение позиции бегунка полосы прокрутки */

LPINT lpMaxPos /* адрес переменной, в которую возвращается максимальное значение позиции бегунка полосы прокрутки*/

) – возвращает значение минимальной и максимальной позиции полосы прокрутки. При успешном завершении возвращает TRUE, в противном случае – FALSE. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError.

int SetScrollPos(

HWND hWnd, /* описатель элемента полосы прокрутки диалогового окна или описатель обычного окна приложения со стандартной полосой прокрутки в зависимости от значения второго параметра*/

int nBar, /* флаг полосы прокрутки; возможные значения: SB_CTL – элемент управления полосы прокрутки (параметр hWnd – описатель элемента управления полосы прокрутки, устанавливается позиция бегунка элемента управления полосы прокрутки), SB_HORZ – устанавливается позиция бегунка стандартной горизонтальной полосы прокрутки обычного окна приложения, SB_VERT – устанавливается позиция бегунка стандартной вертикальной полосы прокрутки обычного окна приложения * /

int nPos, // значение новой позиции бегунка полосы прокрутки

BOOL bRedraw /* флаг перерисовки: TRUE – полоса прокрутки перерисовывается, FALSE – полоса прокрутки не перерисовывается */

) – устанавливает бегунок полосы прокрутки в заданную позицию. При успешном завершении возвращает прежнее значение позиции бегунка полосы прокрутки, в противном случае – 0. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError.

int GetScrollPos(

HWND hWnd, /* описатель элемента полосы прокрутки диалогового окна или описатель обычного окна приложения со стандартной полосой прокрутки в зависимости от значения второго параметра*/

int nBar /* флаг полосы прокрутки; возможные значения: SB_CTL – элемент управления полосы прокрутки (параметр hWnd – описатель элемента управления полосы прокрутки, возвращается позиция бегунка элемента управления полосы прокрутки), SB_HORZ – возвращается позиция бегунка стандартной горизонтальной полосы прокрутки обычного окна приложения, SB_VERT – возвращается позиция бегунка стандартной вертикальной полосы прокрутки обычного окна приложения * /

) – при успешном завершении возвращает текущую позицию бегунка полосы прокрутки, в противном случае возвращает 0. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError.

Горизонтальная полоса прокрутки посылает своему окну (для элемента управления полосы прокрутки своему родительскому окну) сообщение WM_HSCROLL. Вертикальная полоса прокрутки посылает своему окну (для элемента управления полосы прокрутки своему родительскому окну) сообщение WM_VSCROLL. Для элементов управления полосы прокрутки диалоговых окон удобно использовать в функции диалогового окна распаковщики этих сообщений: HANDLE_MSG(hDlg, WM_VSCROLL, Dlg_OnVScroll), HANDLE_MSG(hDlg, WM_HSCROLL, Dlg_OnHScroll). Прототип функции обработчика в обоих случаях следующий: void Dlg_OnScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos). В параметре hwnd передается описатель родительского диалогового окна, в параметре hwndCtl передается описатель элемента управления полосы прокрутки, в параметре code передается код уведомления, в параметре pos передается новое значение позиции бегунка полосы прокрутки. Возможны следующие значения кода уведомления:

SB_PAGEDOWN – бегунок переместился на страницу вперед (вниз);

SB_LINEDOWN – бегунок переместился на линию вперед (вниз);

SB_PAGEUP – бегунок переместился на страницу назад (вверх);

SB_LINEUP – бегунок переместился на линию назад (вверх);

SB_TOP – бегунок переместился в минимальное положение;

SB_BOTTOM – бегунок переместился в максимальное положение

SB_ENDSCROLL – кнопка мыши отпущена (после нажатия на полосе прокрутки);

SB_THUMBPOSITION – нажата кнопка мыши на бегунке полосы прокрутки;

SB_THUMBTRACK – кнопка мыши отпущена (после нажатия на бегунке полосы прокрутки).

Новая позиция бегунка полосы прокрутки передается только для кодов уведомления SB_THUMBPOSITION и SB_THUMBTRACK; для остальных кодов в качестве новой позиции бегунка передается 0.

Соседние файлы в папке ОС