Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2050

.pdf
Скачиваний:
0
Добавлен:
15.11.2022
Размер:
1.12 Mб
Скачать

PC_STYLED - устройство может рисовать стилизованные бордюры;

PC_WIDESTYLED - устройство может рисовать широкие и стилизованные бордюры;

PC_INTERIORS - устройство может рисовать внутренности.

TEXTCAPS - значение, показывающее совместимость устройства с текстом.

Возвращаемые значения:

TC_OP_CHARACTER - устройство поддерживает посимвольный вывод;

TC_OP_STROKE - устройство поддерживает строковый вывод;

TC_CP_STROKE - устройство поддерживает объединение строк;

TC_CR_90 - устройство поддерживает поворот символов на 90 градусов;

TC_CR_ANY - устройство поддерживает любые повороты символов;

TC_SF_X_YINDEP - устройство поддерживает независимое масштабирование по осям x и y; TC_SA_DOUBLE - устройство поддерживает двойное увеличение символов;

TC_SA_INTEGER - устройство поддерживает целочисленное масштабирование символов; TC_SA_CONTIN - устройство поддерживает любое масштабирование символов;

TC_EA_DOUBLE - устройство может отображать символы двойной ширины;

TC_IA_ABLE - устройство поддерживает стиль italic; TC_UA_ABLE - устройство поддерживает подчеркивание;

TC_SO_ABLE - устройство поддерживает зачеркивание; TC_RA_ABLE - устройство может отображать растровый шрифт;

51

TC_VA_ABLE - устройство может отображать векторный шрифт;

TC_RESERVED - зарезервировано;

TC_SCROLLBLT - устройство не может использовать перемещение битовых блоков.

Функции GetDC и GetDesktopWindow имеют следующие значения:

GetDC возвращает идентификатор контекста рабочей области заданного окна. Оконный идентификатор получен функциями GetActiveWindow или GetDesktopWindow. После использования контекста необходимо его закрыть функцией

ReleaseDC.

Синтаксис: HDC GetDC(hWnd)

HWND hWnd; // идентификатор окна

GetActiveWindow возвращает идентификатор активного окна. Как правило, это окно приложения, вызывающего функцию.

Синтаксис: HWND GetActiveWindow(VOID)

GetDesktopWindow возвращает идентификатор

рабочего стола Windows.

Синтаксис: HWND GetDesktopWindow(VOID)

ReleaseDC закрывает контекст заданного окна.

Синтаксис: int ReleaseDC(hWnd,hDC)

HWND hWnd; // идентификатор окна HDC hDC; // идентификатор контекста

GetWindowDC возвращает идентификатор контекста заданного окна. Оконный идентификатор получен функциями

52

GetActiveWindow или GetDesktopWindow. После использования контекста необходимо его закрыть функцией

ReleaseDC.

Синтаксис: HDC GetWindowDC(hWnd)

HWND // идентификатор окна

EnumDisplaySettings позволяет получить информацию об одном из возможных графических режимов, номер которого задан. Функция возвращает true при корректном ее завершении. Для получения всех возможных графических режимов разрешений необходимо несколько раз вызвать данную функцию, увеличивая номер запрашиваемого режима до тех пор, пока функция не вернет false.

Синтаксис: BOOL

EnumDisplaySettings(lpszDeviceName,iModeNum,lpDevMode)

LPCTSTR lpszDeviceName; // указатель на строку-спецификатор устройства

DWORD iModeNum; // номер графического режима доступного в системе

LPDEVMODE lpDevMode; // указатель на структуру DEVMODE, принимающую данные

lpszDeviceName может принимать значения \\.\DisplayX, где X может иметь значения 1, 2, or 3. Если lpszDeviceName установлен в NULL, возвращаются установки текущего дисплея (для

Windows'95 всегда должен быть NULL).

Описание структуры DEVMODE приведено в приложении.

GetPixel возвращает цвет точки с заданными координатами в указанном контексте устройства. Контекст устройства получают функциями GetDC или GetWindowDC, описанными ранее.

Синтаксис: COLORREF GetPixel(hdc,nXPos,nYPos)

HDC hdc; // идентификатор контекста устройства

53

int nXPos; // горизонтальная координата точки int nYPos; // вертикальная координата точки

Следует обратить внимание, что функция SystemParametersInfo встречается также среди функций устройств ручного ввода, таким образом, являясь многоцелевой. Эта особенность многих функций Win32 API, возможные причины которой будут рассмотрены ниже. С помощью приведенных функций можно получить следующую информацию:

цветовая палитра интерфейса системы;

время запуска хранителя экрана;

разрешение системы;

количество цветов системы;

доступные варианты разрешений и цветов системы;

цвет заданной точки устройства.

Получение цвета элемента системы

Компонента Edit1 выводит код цвета рабочего стола в виде 32-битного знакового числа.

TEdit *Edit1; void main()

{Edit1->Text=(int)GetSysColor(COLOR_BACKGROUND);}

Получение времени запуска хранителя экрана

Компонента Edit1 выводит время в секундах(+5 секунд), отсчитываемое от последнего нажатия клавиши или перемещения мыши до запуска хранителя экрана.

TEdit *Edit1; void main()

{

int pvParam; SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT,0,&pvParam ,SPIF_SENDCHANGE);

Edit1->Text=pvParam;

}

54

Получение текущего разрешения системы

Компонента Edit1 выводит разрешение системы по оси х,

Edit2 - по оси y. TEdit *Edit1; TEdit *Edit2; void main ()

{

Еdit1->Text=GetSystemMetrics(SM_CXSCREEN); Еdit2->Text=GetSystemMetrics(SM_CYSCREEN);

}

Получение количества цветов системы

TEdit *Edit1; void main ()

{

hDeskTop=GetDesktopWindow();

dcDeskTop=GetWindowDC(hDeskTop); Edit3->Text=GetDeviceCaps(dcDeskTop,BITSPIXEL); ReleaseDC(hDeskTop,dcDeskTop);

}

Получение разрешений системы

Получение количества вариантов разрешения экрана, выделение памяти для хранения всех вариантов и занесение их в массив для дальнейшего использования.

typedef struct _DISPRes

{

DWORD dmBitsPerPel; DWORD dmPelsWidth; DWORD dmPelsHeight; } DISPRes;

DISPRes *lpDevMode; void main()

{

int i;

DEVMODE pDevMode;

for (i=0;EnumDisplaySettings(NULL,i,&pDevMode);++i); lpDevMode=(DISPRes*)malloc(i*sizeof(DISPRes));

for (i=0;EnumDisplaySettings(NULL,i,&pDevMode);++i)

{

55

lpDevMode[i].dmBitsPerPel=pDevMode.dmBitsPerPel;

lpDevMode[i].dmPelsWidth=pDevMode.dmPelsWidth;

lpDevMode[i].dmPelsHeight=pDevMode.dmPelsHeight;

}

/// ...

free(lpDevMode);

}

Получение цвета точки с заданными координатами

Компонента Panel1 меняет свой цвет в зависимости от положения курсора.

TPanel *Panel1; void main()

{

POINT mouse_pos; hDeskTop=GetDesktopWindow(); dcDeskTop=GetWindowDC(hDeskTop); if (GetCursorPos(&mouse_pos)) Panel1-

>Color=GetPixel(dcDeskTop,mouse_pos.x,mouse_pos.y); ReleaseDC(hDeskTop,dcDeskTop);

}

Управляющие функции видеосистемы

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

Управляющими функциями видеосистемы являются:

SetSysColors;

SystemParametersInfo;

56

ChangeDisplaySetting;

BitBlt и т.п.

SetSysColors устанавливает цвета интерфейса системы.

Синтаксис: BOOL

SetSysColors(cElements,lpaElements,lpaRgbValues) int cElements; // количество изменяемых элементов

CONST INT *lpaElements; // указатель на массив элементов, список которых идентичен GetSysColor

CONST COLORREF *lpaRgbValues; // указатель на массив цветов

ChangeDisplaySettings меняет текущий графический режим.

Синтаксис: LONG ChangeDisplaySettings(lpDevMode,dwflags)

LPDEVMODE lpDevMode;// указатель на структуру DEVMODE, устанавливающую данные

DWORD dwflags;// флаг показывает, как графический режим должен быть изменен

BitBlt копирует прямоугольную битовую поверхность из контекста устройства источника в контекст устройства приемника. Контекст устройства получают функциями GetDC или GetWindowDC. Функция возвращает true при корректном ее завершении. Если происходит копирование между разными устройствами (дисплей-принтер), то функция всегда возвращает false.

Синтаксис: BOOL

BitBlt(hdcDest,nXDest,nYDest,nWidth,nHeight,hdcSrc,nXSrc,nYSrc,dwR

op)

HDC hdcDest;// идентификатор контекста устройства-источника

(device context)

int nXDest;// координата x левого верхнего угла копируемой поверхности в приемнике

int nYDest;// координата y левого верхнего угла копируемой поверхности в приемнике

57

int nWidth;// ширина копируемой поверхности int nHeight;// высота копируемой поверхности

HDC hdcSrc;// идентификатор контекста устройства-приемника

(device context)

int nXSrc;// координата x левого верхнего угла копируемой поверхности в источнике

int nYSrc;// координата y левого верхнего угла копируемой поверхности в источнике

DWORD dwRop;// код операции копирования

Код операции может принимать следующие значения: BLACKNESS - заполнение принимающего

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

DSTINVERT - инвертировать принимающий прямоугольник.

MERGECOPY - осуществлять копирование по логическому "И" цветов источника и образца.

MERGEPAINT - осуществлять копирование по логическому "ИЛИ" инвертированных источника и неинвертированных цветов приемника.

NOTSRCCOPY - осуществлять копирование с инвертированием битов источника.

NOTSRCERASE - осуществлять копирование по логическому "ИЛИ НЕ" битов источника и приемника.

PATCOPY - копирование образца на источник. PATINVERT - совмещение цветов образца и цветов

приемника по модулю два.

PATPAINT - совмещение цветов образца и инвертированных цветов источника по логическому "ИЛИ", а результат по логическому "ИЛИ" с цветами приемника.

SRCAND - совмещение цветов источника и приемника по логическому "И".

SRCCOPY - простое копирование.

SRCERASE - совмещение цветов источника и инвертированных цветов приемника по логическому "И".

58

SRCINVERT - совмещение цветов источника и цветов приемника по модулю два.

SRCPAINT - совмещение цветов источника и цветов приемника по логическому "ИЛИ".

WHITENESS - заполнение принимающего прямоугольника, используя цвет, ассоциирующийся с кодом 1 (обычно белый цвет для физической палитры).

Как видно, некоторые функции являются и управляющими и информационными. Характерно и то, что набор функций меньше, чем набор выполняемых действий, то есть одна функция выполняет множество действий. Этот факт объясняется тем, что, во-первых, довольно часто входной информацией для выполнения действия является один бит, и в таком случае нерационально использование целого байта или слова. Во-вторых, чтобы не расширять и без того большие списки имен функций, можно объединить операции, сходные по назначению или по какому-нибудь признаку в одной функции.

Приведенный выше набор функций позволяет выполнить следующие действия над видеосистемой:

установить цвета элементов интерфейса системы;

установить обои рабочего стола;

установить время включения хранителя экрана;

изменить видеорежим системы;

копировать изображение.

Установка цветов системной палитры

Устанавливает рабочий стол в белый цвет. void main ()

{

int cDspElements;

int lpnDspElements[]={COLOR_BACKGROUND};

COLORREF lpdwRgbValues[]={0xFFFFFF};// код белого цвета

SetSysColors(1,lpnDspElements,lpdwRgbValues);

}

59

Установка обоев рабочего стола

TOpenDialog *OpenDialog1; void main()

{

if (OpenDialog1->Execute()) SystemParametersInfo(SPI_SETDESKWALLPAPER,0,OpenDialog1- >FileName.c_str(),SPIF_UPDATEINIFILE);

}

Установка времени включения хранителя экрана

Новое время запуска хранителя экрана берется из свойства

Text компоненты Edit1.

TEdit *Edit1; void main()

{

SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,atoi(Edit1- >Text.c_str()),NULL,

SPIF_SENDCHANGE);

}

Изменение разрешения системы

Устанавливается разрешение системы 640 на 480 и 256-и цветная палитра. Если необходимо перегрузить систему или не удалось изменить настройки, то выводится соответствующее сообщение.

void main()

{

DEVMODE pDevMode; LONG result; pDevMode.dmBitsPerPel=8; pDevMode.dmPelsWidth=640; pDevMode.dmPelsHeight=480;

pDevMode.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELS HEIGHT;

pDevMode.dmSize=sizeof(pDevMode); result=ChangeDisplaySettings(&pDevMode,CDS_UPDATEREGISTRY );

if (result==DISP_CHANGE_RESTART)

MessageBox(NULL,"Новые параметры вступят в силу при перезагрузке компьютера !!!",

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]