СРЕДСТВА РАБОТЫ С ГРАФИКОЙ С++

Работа добавлена: 2018-06-01






8

СРЕДСТВА РАБОТЫ С ГРАФИКОЙ

Классы поддержки графического вывода

Рисование и контекст устройства

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

ВVisual C++ методы, обеспечивающие вывод на экран дисплея и на принтер, используютконтекст устройства.Контекст устройства является объектом классаCDC. Этот класс инкапсулирует методы построения изображений. При создании объекта данного класса в него заносится вся информация о графическом устройстве вывода (атрибуты контекста устройства).

Указатель на контекст устройства передается как параметр при обработке методаOnDraw. Для того чтобы использовать контекст устройства, например для отображения в окне геометрической фигуры, при вызове методаOnDraw можно использовать следующий код:

// Выполняется при получении сообщения объектом классаCFromViewvoidCFromView::OnDraw(CDC *pCDC)         // Переопределение методаOnDraw {pCDC->TextOut(300,150, "текст",5);}      // Вывод строки текста

Экран дисплея рассматривается вWindows как три графических устройства, для каждого из которых можно создать и использовать свой контекст устройства. Этими устройствами являются:

•                                              весь экран,

Windows-окно,

•                                              клиентская область окна.

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

Для создания графических изображенийVisual C++ предоставляет набор объектов графического интерфейса пользователей (объектыGDI).

Алгоритм применения этих объектов аналогичен работе с оконными объектами: первоначально надо создать объектGDI, а затем пристыковать его к соответствующемуWindows-объекту.

БиблиотекаMFC содержит следующие классы, инкапсулирующие работу с объектами графического интерфейса пользователей:

Среn(перо),

•                                              СBrush (кисть),

CFont(шрифт),

CBitmap (растровое изображение),

CPalette(палитра),

CRgn(область).

КлассCDC

КлассCDCявляется базовым классом контекста устройства.

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

Для того чтобы использовать контекст устройства, следует создать объектCDC.

БиблиотекаMFC содержит следующие производные классы отCDC:

CPaintDC- инкапсулирует вызовыBeginPaint иEndPaint;

CClientDC- управляет контекстом экрана дисплея, связанного с клиентской областью окна;

CWindowDC- управляет контекстом экрана дисплея, связанного со всем окном, включающим как клиентскую, так и системную область;

CMetaFileDC- связывает контекст устройства с метафайлом.

КлассCDC содержит два контекста устройстав:m_hDCиm_hAttribDC.

Методы классаCDC

Вэтом разделе мы рассмотрим только наиболее часто используемые методы классаCDC.

int AbortDoc();

Метод снимает текущее задание на печать и удаляет весь вывод приложения на данное устройство, выполненный после последнего вызова методаStartDoc.При возникновении ошибки метод возвращает отрицательное значение.

BOOLАгс( intxl,intyl,intх2,intу2,intхЗ,intуЗ,intx4,inty4); BOOLАгс( LPCRECTipRect,POINTptStart,POINTptLnd);

Метод рисует дугу, являющуюся сегментом эллипса.

Действительная начальная точка дуги определяется как пересечение луча, исходящего из центра эллипса к указанной параметрами начальной точке, и самого эллипса. Действительная конечная точка дуги определяется аналогичным образом. Эллипс задается координатами прямоугольной области, в которую он вписывается.

Дуга рисуется по часовой стрелке. Значения параметров, определяющие размер прямоугольной области для эллипса, должны находиться в диапазоне от 2 до 32767.

При успешном завершении метод возвращает ненулевое значение.

Параметры:

xl,yl, х2, у2 -координаты верхнего левого и нижнего правого угла прямоугольной области, ограничивающей эллипс (в логических единицах).хЗ, уЗ -координаты начальной точки дуги.х4, у4 -координаты конечной точки дуги.

IpRect -координаты прямоугольной области, указываемые структуройLPRECTили объектомCRect.

ptStart -координаты начальной и конечной точки дуги, указываемые структypoft,POINT или объектомCPoint.

BOOL Chord( intxl,intyl,intx2,intу2,intx3,inty3,intx4,intу4);BOOL Chord( LPCRECTIpRect,POINTptStart, FOIKTptEnd);

Метод отображает сегмент, образуемый пересечением эллипса и линии. Параметры(xl, у Г)и(х2, у2)указывают координаты верхнего левого и нижнего правого угла прямоугольника, в который вписывается эллипс. Параметры(хЗ, уЗ)и(х4, у4)указывают координаты линии, пересекающей эллипс. Сегмент отображается текущим пером и заполняется текущей кистью.

При успешном завершении метод возвращает ненулевое значение.voidDraw3dRect(LPCRECTIpRect,COLORREFclrTopLeft,COLORREFclrBottomRight);

void Draw3dRect( intx,inty,intex,intcy,COLORREFclrTopLeft,COLORREFclrBottomRight);

Метод рисует трехмерный прямоугольник. Верхняя и левая сторона прямоугольника отображаются цветомclrTopLeft,а нижняя и правая - цветомclrBottomRight.

void DrawDragRect( LPCRECTipRect,SIZEsize,LPCRECTipRectLast,SIZEsizeLast,CBrush*pBrush=NULL, CBrush*pBrushLast=NULL);

Циклическое использование данного метода позволяет создать видимость перемещения прямоугольника по экрану. При каждом вызове методаDrawDragRect предыдущий прямоугольник стирается и рисуется новый прямоугольник. При первом вызове метода параметрIpRectLastдолжен быть равенNULL.

BOOL DrawEdge( LPRECTIpRect,UINTnEdge,UINTnFlags);

Метод используется для отображения в заданном стиле ребер прямоугольной области. При успешном завершении метод возвращает ненулевое значение.

Параметры:

IpRect- структураRECT,содержащая логические координаты прямоугольника.

nEdge -тип отображения внутреннего и внешнего ребра. Этот параметр задается комбинацией значений двух флажков: для внутреннего и для внешнего ребра.

nFlags -флажки, определяющие стороны отображаемой рамки.

Флажки для внутреннего и для внешнего ребра рамки могут принимать следующие значения:

BDR_RAISEDINNER,BDR_RAISEDOUTER- выпуклое ребро;BDR_SUNKENINNER,BDR_SUNKENOUTER- вдавленное ребро.

ПараметрnEdgeможет принимать одно из следующих значений:

EDGE_BUMP(комбинацияBDR_RAISEDOUTERи BDR_SUNKENINNER);

EDGE_ETCHED (BDR_SUNKENOUTERиBDR_RAISEDINNER); EDGE_RAISED (BDR_RAISEDOUTERиBDR_RAISEDINNER); EDGE_SUNKEN (BDR_SUNKENOUTERиBDRJSUNKENINNER).

ПараметрnFlagsопределяет следующие типы:BF_RECT- вся рамка;

BF_LEFT- левая сторона рамки прямоугольной области;BF_BOTTOM- нижняя сторона;BF_RIGHT- правая сторона;BF_TOP- верхняя сторона;BF_TOPLEFT- верхняя и левая сторона;BF_TOPRIGHT- верхняя и правая сторона;BF_BOTTOMLEFT- нижняя и левая сторона;BF_BOTTOMRIGHT- нижняя и правая сторона.

voidDrawFocusRect(LPCRECTIpRect);

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

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

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

BOOL DrawFrameControl( LPRECTIpRect,UINTnType,UINTnState);

Метод отображает рамку элемента управления в указанном стиле. При успешном завершении метод возвращает ненулевое значение.

Параметры:

IpRect- координаты прямоугольной области.пТуре -один из следующих типов элементов управления:DFC_BUTTON- стандартная кнопка;DFC_CAPTION- строка заголовка;DFC_MENU- меню;DFC_SCROLL- линейка прокрутки.nState -первоначальное состояние элемента управления.

ПараметрnStateможет задаваться одним или несколькими следующим значениями:DFCS_CHECKED,DFCS_FLAT,DFCSJNACTIVE,DFCS_MONO,DFCS_PUSHED.

В следующей таблице приводится список значений параметраnStateдля каждого из четырех типов элементов управления:

пТуре

nState

DFC BUTTON(кнопка)

DFCS

BUTTON3STATE

Кнопка, имеющая три состояния;

DFCS

BUTTONCHECK

Переключатель;

DFCS

BUTTONPUSH

Командная кнопка;

DFCS.

BUTTONRADIO

Радиокнопка;

DFCS

BUTTONRADIOIMAGE

Изображение для радиокнопки;

DFCS

BUTTONRADIOMASK

Маска для радиокнопки;

DFCCAPTIOl(строка заголовка)

DFCS

CAPTIONCLOSE

Кнопка закрытия окна(Close);

DFCS

CAPTIONHELP

Кнопка вызова справки(Help);

DFCS_CAPTIONMAX

Кнопка распахивания окна;

DFCS_CAPTIONMIN

Кнопка сворачивания окна;

DFCS_CAPTIONRESTORE

Кнопка восстановления окна;

DFC_MENU(меню)

DFCSJWENUARROW

Стрелка для подменю;

DFCS_MENUBULLET

Буллит;

DFCS_MENUCHECK

Маркирующий флажок;

DFC SCROLL(линейка прокрутки)

DFCS_SCROLLCOMBOBOX

Линейка прокрутки комбинированного окна;

DFCS_SCROLLDOWN

Стрелка вниз линейки прокрутки;

DFCS_SCROLLLEFT

Стрелка влево линейки прокрутки;

DFCS_SCROLLRIGHT

Стрелка вправо линейки прокрутки;

DFCS_SCROLLSIZEGRIP

Маркер изменения размера, располагаемый в правом нижнем углу окна;

DFCS_SCROLLUP

Стрелка вверх линейки прокрутки;

BOOL Drawlcon( intx,intу,HICONhlcon);BOOL Drawlcon( POINTpoint,HICONhlcon);

Метод отображает указанную пиктограмму в заданной точке (верхний левый угол пиктограммы).

Отметим, что перед изображением ресурс пиктограммы следует предварительно загрузить. Для этого можно использовать методыCWinApp::LoadIcon,CWinApp-LoadStandardlcon илиCWmApp::LoadOEMIcon. Также должен быть предварительно установлен режимММ_ТЕХТ.

При успешном завершении метод возвращает ненулевое значение.

BOOL DrawState( CPointpt,CSizesize,HBITMAPhBitmap,UINTnFlags,

HBRUSHhBrush= NULL );

BOOL DrawState( CPointpt,CSizesize,CBitmap*pBitmap,UINTnFlags,

CBrush*pBrush= NULL );

BOOL DrawState( CPointpt,CSizesize,HICONhlcon,UINTnFlags,

HBRUSHhBrush=NULL );

BOOL DrawState( CPointpt,CSizesize,HICONhlcon,UINTnFlags,CBrush*

pBrush=NULL );

BOOL DrawState( CPointpt,CSizesize,LPCTSTRipszText,UINTnFlags,

BOOLbPrefixText=TRUE, intnTextLen=0, HBRUSHhBrush=NULL);

BOOL DrawState( CPoint/??, CSizesize,LPCTSTRIpszText,UINTnFlags,BOOLbPrefixText=TRUE, intnTextLen-0, CBrush*pBrush=NULL);

Эти методы используются для показа битовых изображений, пиктограмм и текста с добавлением некоторых визуальных эффектов (например, отображение недоступного состояния).

Параметры:

pt- точка расположения изображения.size- размер изображения.hBitmap -дескриптор битового изображения.

nFlags -флажки, определяющие тип и состояние изображения. Например,nFlagможет принимать значенияDST_BITMAP,DSTJCON,DST_PREFTXTEXT,DSTJTEXT,DSS_NORMAL,DSS_UNION,DSS_DISABLED/DSS_DEFAULT.

virtual int DrawTexi( LPCTSTRipszString,intnCount,LPRECT lpRect,UINT

nFormat);

int DrawText( const CString&str,LPRECTIpRect,UINTnFormat);

Метод располагает указанный текст в заданной прямоугольной области, одновременно форматируя его. Шрифт, цвет текста и фона берутся из контекста устройства. В том случае если не установлен форматDT_NOCLIP,то текст, не помещающийся в прямоугольную область, будет кадрирован. Если не используется форматDT_SINGLELINE,то форматируемый текст может располагаться на нескольких строках.

При успешном завершении метод возвращает высоту текста.

Приведем несколько значений параметраnFormat,позволяющих отформатировать текст следующим образом:

DT_BOTTOM- выравнять по нижнему краю прямоугольника (только совместно с форматомDT_SINGLELINE);DT_CENTER- центрировать текст горизонтально;DT_LEFT- выравнивать текст по левому краю;DT_NOCLIP- отображать без кадрирования;DT_RIGHT- выравнивать по прайому краю.

BOOL Ellipse (intxl,intyl,intx2,inty2); BOOL Ellipse (LPCRECTIpRect);

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

voidFilIRect(LPCRECTIpRect,CBrush*pBrush);

Метод закрашивает указанную прямоугольную область заданной кистью.

КистьможетбытьсозданаметодамиклассаCBrush: CreateHatchBrush, CreatePatternBrushилиCreateSolidBrush.ТакжекистьможнополучитьвызовомметодаGetStockObject.

BOOL FilIRgn( CRgn*pRgn,CBrush*pBrush);

Метод закрашивает заданной кистью указанную область.,

void FfflSolidRect( LPCRECTipRect,COLORREFclr);

void FfflSolidRect( intx,inty,intex,intcy,COLORREFclr);

Эти методы закрашивают указанную прямоугольную область заданным цветом.

Отметим, что данный метод изменяет ранее установленное (методомSetBkColor)значение фонового цвета на значение, указанное параметромclr.

void FrameRect( LPCRECTIpRect,CBrush*pBrush);

Метод рисует рамку вокруг указанной прямоугольной области. Ширина и высота данной рамки всегда равняются одной логической единице. Для отображения используется указанная кисть.BOOLFrameRgn(CRgn*pRgn,CBrush*pBrush,intnWidth,intnHeight);

Метод рисует рамку вокруг указанной области.

Параметры:

pRgn- указатель на объектCRgn, описывающий область, вокруг которой рисуется рамка.

pBrush -указатель на объектCBrush, определяющий кисть, используемую для рисования рамки.пWidth- ширина стороны рисуемой рамки.nHeight -высота рамки.staticCDC*PASCALFromHandle(HDChDC);

Метод возвращает указатель наCDC-объект, описывающий контекст устройства.

COLORREFGetBkColor()const;

Метод возвращаетRGB-значение фонового цвета.intGetBkMode( )const;

Метод возвращает значение режима заполнения фоновым цветом:OPAQUE,TRANSPARENTилиTRANSPARENT1.

BOOL GetCharABCWidths( UINTnFirstChar,UINTnLastChar,LPABCIpabc)

const;

BOOL GetCharABCWidths( UINTnFirstChar,UINTnLastChar,

LPABCFLOATipABCF)const;

Эти методы определяют ширину последовательности символов для текущегоTrueType-шрифта. Значение ширины вычисляется в логических единицах. При успешном завершении метод возвращает ненулевое значение.

BOOL GetCharWidth( UINTnFirstChar,UINTnLastChar,LPINTipBuffer)const; BOOL GetCharWidth( UINTnFirstChar,UINTnLastChar,float*ipFloatBuffer)const;

Эти методы определяют ширину каждого символа из заданной последовательности символов текущего шрифта.

Параметры:

nFirstChar -указывает первый символ из последовательности символов текущего шрифта.nLastChar- последний символ.

IpBuffer -указатель на буфер, в который заносится ширина всех символов указанной последовательности.

CBrush*GetCurrentBrush( )const;

При успешном завершении метод возвращает указатель на текущий выбранный объектCBrush(текущая кисть). При возникновении ошибки возвращается значениеNULL.

CFont*GetCurrentFont()const;

При успешном завершении метод возвращает указатель на текущий объектCFont(текущий шрифт). При возникновении ошибки возвращается значениеNULL.

CPalette*GetCurrentPalette( )const;

При успешном завершении метод возвращает указатель на текущий объектCPalette(текущая палитра). При возникновении ошибки возвращается значениеNULL.

CPen*GetCurrentPen()const;

При успешном завершении метод возвращает указатель на текущий объектСРеп(текущее перо). При возникновении ошибки возвращается значениеNULL.

CPointGetCurrentPosition()const;

Метод возвращает логические координаты текущей точки как объектCPoint.

Координаты текущей точки могут быть установлены методомMoveTo.

staticCBrush* PASCAL GetHalftoneBrush();

При успешном завершении метод возвращает указатель на объектCBrush,определяющий полутоновую кисть. Такая кисть смешивает цвет переднего и заднего фона для создания произвольной шаблонной кисти.

int GetMapMode( ) const;

Методвозвращаеттиплогическойсистемыкоординат (mapping mode).COLORREF GetNearestColor( COLORREFcrColor)const;

Методвозвращаетзначение RGB-цвета,наиболееблизкоекуказанномузначениюcrColor.

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

COLORREF GetPixel( intx,intу) const; COLORREF GetPixel( POINTpoint) const;

Эти методы возвращают значениеRGB-цвета в указанной точке. Если координаты точки лежат вне выбранной области, то метод возвращает значение-1.

intGetPolyFilIMode()const;

Метод возвращает режим заполнения многоугольника:ALTERNATEилиWINDING.

intGetROP2( )const;

Метод возвращает режим отображения (drawingmode). По умолчанию используется режимR2_COPYPEN.

HDCGetSafeHdc()const;

Метод возвращает дескриптор контекста устройства.UINTGetTextAlign( )const;

Метод возвращает установки выравнивания текста. Они указываются одним или несколькими следующими флажками:TA_BASELINE, ТА_ВОТТОМ,TA_CENTER,TAJLEFT,TA_NOUPDATECP,TA_RIGHT,TAJTOP,TA_UPDATECP.

COLORREFGetTextColor()const;

Метод возвращаетRGB-цвет текущего текста. Этот цвет является цветом переднего плана и используется такими методамиGDI-интерфейса для вывода текста, какTextOut,ExtTextOut,TabbedTextOut.

CSize GetTextExtent( LPCTSTRipszString,intnCount)const; CSize GetTextExtent( const CString&str) const;

Метод возвращает в объектеCSizeразмер указанной строки в логических единицах.

BOOL GetTextMetrics( LPTEXTMETRICipMetrics)const;

Метод заносит в структуру описание текущего шрифта, используя атрибуты контекста устройства.

CSizeGetViewportExt( )const;

Метод возвращает значение протяженности области отображения, определяющее соответствие между физическими и логическими координатами графического устройства.

CPointGetViewportOrg()const;

Метод возвращает значение выделенной точки отображения, определяющее соответствие между физическими и логическими координатами графического устройства.

CPointGetWindowOrg()const;

Метод возвращает значение выделенной точки окна.voidInvertRect(LPCRECTlpRect);

Метод инверсно отображает содержание указанной прямоугольной области.

BOOLInvertRgn(CRgn*pRgn);

Метод инверсно отображает содержание указанной областиpRgn.BOOLIsPrinting( )const;

Метод возвращает ненулевое значение, если объектCDCявляется контекстом принтера.

BOOL LineТо( intx,intу); BOOL LineTo( POINTpoint);

Метод рисует линию текущим пером от текущей позиции до указанной точки(х, у).При успешном отображении линии метод возвращает ненулевое значение.

CPointMoveTo(intx,intу);CPointMoveTo(POINTpoint);

Эти методы устанавливают значение текущей позиции.

Параметры:

х -логическая х-координата новой позиции.У -логическая у-координата новой позиции.

point -структураPOINTили объектCPoint,описывающие новую текущую позицию.BOOL PaintRgn( CRgn*pRgn);

Метод закрашивает текущей кистью указанную областьpRgn.При успешном завершении метод возвращает ненулевое значение.

BOOL Pie( intxl,intyl,intx2,intу2,intx3,inty3,intx4, intу4);BOOL Pie( LPCRECT lpRect,POINT ptStart, POINT ptEnd);

Метод отображает сектор эллипса, образуемый пересечением эллипса и двух радиусов. Параметры(x1, у 1)и(х2, у2)указывают координаты верхнего левого и нижнего правого угла прямоугольника, в который вписывается эллипс. Параметры(хЗ, уЗ)и(х4, у4)указывают координаты радиусов эллипса. Сектор отображается текущим пером и заполняется текущей кистью.

Значения параметров, определяющие размер прямоугольной области для эллипса, должны находиться в диапазоне от 2 до 32767.

При успешном завершении метод возвращает ненулевое значение.

BOOL Polygon( LPPOINTipPoints,intnCount);

Метод отображает многоугольник, используя текущее перо и текущую кисть.

При успешном завершении метод возвращает ненулевое значение.

Параметры:

IpPoints -указатель на массив точек, описывающих вершины многоугольника. Каждая точка в массиве описывается структуройPOINTили объектомCPoint.nCount- количество вершин многоугольника.

Напомним, что режим заполнения многоугольника определяется методомGetPoIyFillMode.Для изменения режима следует использовать методSetPolyFfflMode.

BOOLPolyline(LPPOINTIpPoints,intnCount);

Метод рисует ломаную линию, последовательно соединяя указанные точки. При успешном завершении метод возвращает ненулевое значение.

Параметры:

IpPoints -указатель на массив структурPOINTили объектовCPoint,описывающий соединяемые точки.nCount- количество точек в массиве (не менее двух).

Отметим, что в отличие от методаУпеТометодPolylineне изменяет значения текущей позиции.

BOOL PolylineTo (const POINT*IpPoints,intnCount);

Метод рисует ломаную линию, последовательно соединяя указанные точки начиная от текущей позиции. При успешном завершении метод возвращает ненулевое значение.

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

BOOL PolyPolygon (LPPOINTIpPoints,LPINTipPolyCounts,intnCount);

Метод рисует два или более многоугольников. Каждый отображаемый многоугольник должен быть замкнут. В отличие от методаPolygonданный метод не выполняет автоматического соединения крайних вершин многоугольника. Многоугольники могут располагаться произвольным образом, включая наложение.

Многоугольники отображаются текущим пером и заполняются текущей кистью.

При успешном завершении метод возвращает ненулевое значение.

BOOL PolyPolyline( const POINT*IpPoints,const DWORD*ipPolyPoints,intnCount);

Метод рисует серию соединенных линейных сегментов. Линейные сегменты отображаются текущим пером. Метод не изменяет значения текущей позиции.

Параметры:

IpPoints -указатель на массив, содержащий вершины линейных сегментов.IpPolyPoints -указатель на массив, содержащий количество точек для каждого многоугольника.nCount -количество многоугольников (значений в массивеlpPolyPoints).

BOOL Rectangle( intx1,inty1,intx2,inty2 );BOOL Rectangle( LPCRECTIpRect);

Метод отображает прямоугольник, используя текущие перо и кисть.

BOOL RoundRect( intx1,inty1,intx2,intу2,intx3,inty3) BOOL RoundRect( LPCRECTIpRect,POINT);

Эти методы отображают прямоугольник со скругленными углами. Координаты(хЗ, уЗ)илиpointописывают ширину и высоту прямоугольной области, в которую вписывается эллипс, определяющий линии скругления углов.

BOOLSelectClipPath(intnMode );

Метод определяет текущий графический объект какclipping-область для контекста устройства, комбинируя новую область с существующей областью, используя указанные режимы.

Параметры:

nMode- указывает режим формированияclipping-области:RGN_AND- новаяclipping-область является пересечением существующей

области и текущего графического объекта;

RGN_COPY- новой областью становится текущий графический объект;RGN_DIFF- новаяclipping-область является объединением существующей

области и той области, что расположена вне текущего графического

объекта;

RGN_OR - новаяclipping-область является объединением существующей

области и текущего графического объекта;RGN_XOR - новаяclipping-область является объединением существующей

области и текущего графического объекта, но без пересекающихся

областей.

CPen* SelectObject( CPen*рРеп);CBrush* SelectObject( CBrush*pBrush);virtual CFont* SelectObject( CFont*pFont);CBitmap* SelectObject( CBitmap*pBitmap);int SeIectObject( CRgn*pRgn);

Эти методы связывают созданный объект соответствующего типа с контекстом устройства. Методы возвращают указатель на предыдущий объект.Пример:

ЦCDCdc(this);      Создание контекста устройства классаCDC или производного, напримерCPaintDCCPenmyNewPen; // ПероCPen*myOldPen;myNewPen=CreatePen(PS_SOLID,RGB(255,0,0)); // Создание красного пераmyOldPen=dc.SelectObject(&myNewPen); // Привязывание объекта // к контексту устройстваdc.TextOut(40,20"TEXT", 4);    // Использование метода контекста устройства //для вывода текста

virtual COLORREF SetBkColor( COLORREFcrColor);

Методустанавливаетновыйцветфона.intSetBkMode(intnBkMode);

Метод устанавливает режим закрашивания фоновым цветом: прозрачный(TRANSPARENT)или непрозрачный(OPAQUE).

virtual int SetMapMode( intnMapMode);

Метод устанавливает тип логической системы координат, определяющей единицы измерения. Режим указания координат в пикселях устанавливается параметромnMapMode,равнымММ_ТЕХТ.

COLORREF SetPixel( intx,intу,COLORREFcrColor);COLORREF SetPixel( POINTpoint,COLORREFcrColor);

Эти методы устанавливают цвет указанного пикселя и возвращает установленное значение (наиболее близкое к требуемому). Цвет задаетсяRGB-значением.

intSetROP2(intnDrawMode);

Метод устанавливает новый режим отображения (drawingmode) и возвращает значение старого режима. Режим отображения определяет, каким

образом комбинируются цвет пера и закрашиваемый объект с ранее имеющемся на экране цветом.

Параметры:

nDrawMode- режим отображения, который, например, может указываться следующими значениями:R2_BLACK- пиксель всегда черный;R2_WHITE- пиксель всегда белый;R2_NOP- цвет пикселя не изменяется;

R2_NOT- пиксель имеет цвет, инверсный относительно цвета экрана;R2_COPYPEN- пиксель имеет цвет пера.UINTSetTextAlign(UINTnFlags);

Метод определяет установки выравнивания текста.virtualCOLORREFSetTextColor(COLORREFcrColor);

Метод устанавливает новый цвет текста и возвращает предыдущее значениеRGB-цвета.

virtual CSize TabbedTextOut( intx,inty,LPCTSTRipszString,intnCount,intnTabPositions,LPINTipnTabStopPositions,intnTabOrigin);CSize TabbedTextOut( intx,inty,const CString&str,intnTabPositions,LPINTIpnTabStopPositions,intnTabOrigin);

Эти методы выполняют вывод указанной строки текста, выравненного по заданным символам табуляции. ПараметрIpnTabStopPositionsописывает массив х-координат позиций табуляции, а параметрnTabPositions -количество значений в массиве.

virtual BOOL TextOut( intx,inty,LPCTSTRIpszString,intnCount);BOOL TextOut( intx,inty,const CStringAstr);

Метод выводит указанную строку текста начиная с позиции(х, у)(верхний левый угол прямоугольника, ограничивающего текст). Количество выводимых символов строки задается параметромnCount.По умолчанию метод не изменяет значения текущей позиции. Для того чтобы параметры(х, у)игнорировались и вместо них использовалось значение текущей позиции, следует вызвать методSetTextAlignсо значением параметраnFlags,равнымTA_UPDATECP.

При успешном завершении метод возвращает ненулевое значение.

Рисующий инструментарий

Windows предоставляет различный рисующий инструментарий, реализованный вVisual C++ как классы объектов графического интерфейса.

Между классами и типомWindows-объектов существует следующее соответствие:

CPen    - HPEN, CBrush -HBRUSH, CFont   - HFONT, CBitmap- HBITMAP, CPalette- HPALETTE, CRgn    - HRGN.

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

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

1.                                   Объявление объекта графического интерфейса (объявление переменной класса графического интерфейса) и инициализация его функцией создания объекта. Одновременно существует возможность инициализации объекта и в конструкторе класса;

2.                                  Связывание созданного объекта графического интерфейса с контекстом устройства. Это действие выполняется функциейSelectObject, возвращающей значение предыдущего объекта графического интерфейса;

3.                                   Выполнение операций рисования доступных для данного контекста устройств.

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

//Создание и использование пераvoidCMyView::6nDraw(CDC*pDC )      // Переопределение метода { //1. Вызов конструктора с одновременной инициализациейCPenmyPenl(PS_DOT, 5,RGB(0,0,0));

//2. Вызов конструктора, а затем инициализация

CPenmyPen2;if(myPen2.CreatePen(PSDOT, 5,RGB(0,0,0))) {} //3. Связывание пера с контекстом устройства

CPenpenRed;if(newPen.CreatePen(PSSOLID, 2,RGB(225,0,0)) ) {CPen*pOldPen =pDC->SelectObject( &penRed ); // Связывание

//4. Операции рисования в контексте устройства

pDC->MoveTo(...);          // Изменение текущей позицииpDC->LineTo(...);           // Проведение созданным пером линии

pDC->SelectObject(pOldPen );            // Восстановление старого пера

} }

Объект графического интерфейса, возвращаемый методомSelectObject,является временным объектом. Это означает, что он будет удаляться методомOnldleклассаCWinAppвсякий раз, когда программа вызывает этот метод.

КлассCPen

КлассCPenинкапсулирует функционирование такого объекта графического интерфейсаWindows, как перо. Перо служит для рисования линий. Оно имеет такие атрибуты, как цвет, ширина, тип линии.

Методыкласса CPenСРеп();

CPen( intnPenStyle,intnWidth,COLORREFcrColor);

throw( CResourceException );

CPen( intnPenStyle,intnWidth,const LOGBRUSH*pLogBrush,int

nStyleCount=0, const DWORD*ipStyle=NULL );

throw(CResourceException);

Конструкторы класса.

Параметры:

nPenStyle -стиль пера. Приведем неполный список значений стиля пера:PS_SOLID(сплошная линия);

PS_DASH(пунктирная линия только для ширины пера, равной 1);PS_DOT(точечная линия: только для ширины пера, равной 1);PS_DASHDOT(линия точка-тире: только для ширины пера, равной 1);PS_DASHDOTDOT(линия точка-точка-тире: только для ширины пера,

равной 1);

PS_NULL(линия отсутствует);PS_ENDCAP_ROUND(закругленный конец линии);PS_ENDCAP_SQUARE(квадратный конец линии);PS_ENDCAP_FLAT(ровный конец линии).

nWidth- ширина пера. Если этот параметр для второго конструктора равен 0, то ширина принимается равной 1 пикселю независимо от используемоготипалогической системы координат. Для третьего конструктора ширина определяется в зависимости от значенияnPenStyle:дляPS_GEOMETRICширина берется в логических единицах, а дляPS_COSMETICширина всегда равна 1.

crColor-RGB-цвет пера.

pLogBrush- указатель на структуруLOGBRUSH.

BOOL CreatePen( intnPenStyle,intnWidth,COLORREFcrColor);

BOOL CreatePen( intnPenStyle,intn Width,const LOGBRUSH*pLogBrush,

intnStyleCount=0, const DWORD*ipStyle=NULL);

Эти методы используются для инициализации созданного пера. При успешном завершении метод возвращает ненулевое значение.

КлассCBrush

КлассCBrushинкапсулирует функционирование такого объекта графического интерфейсаWindows, как кисть. Кисть служит для заполнения замкнутых областей. Она имеет такие атрибуты, как цвет и стиль.

Методыкласса CBrush

CBrush();

CBrush( COLORREFcrColor);throw( CResourceException );

CBrush( intnlndex,COLORREFcrColor); throw( CResourceException );

CBrush( CBitmap*pBitmap);throw( CResourceException);

Конструктор класса. При использовании первого варианта конструктора кисть должна быть проинициализирована вызовом одного из методов с префиксомCreate. Последние три конструктора выполняют за один шаг создание объекта и его инициализацию.

Параметры:

crColor-RGB-цвет кисти. Если цвет пера определяет цвет переднего плана, то цвет кисти всегда определяет фоновый цвет. Для штрихующей кисти этот параметр определяет цвет штриховки.

nlndex -стиль штриховки для штрихующей кисти:HS_BDIAGONAL(слева направо по углом 45);HS_CROSS(перекрестная штриховка);HS_DIAGCROSS;HS_FDIAGONAL;HS_HORIZONTAL;HS_VERTICAL.

pBitmap- указатель на объектCBitmap,определяющий изображение, рисуемое шаблонной кистью. Размер растрового изображения используемого для кисти, должен быть 8x8 пикселей.BOOLCreateSolidBrush(COLORREFcrColor);

Метод инициализирует сплошную кисть.BOOLCreateHatchBrush(intnlndex,COLORREFcrColor);

Метод инициализирует штрихующую кисть.BOOLCreateBrushIndirect(constLOGBRUSH*ipLogBrush);

Метод инициализирует кисть значениями для стиля, цвета и штриховки, указанными в структуреLOGBRUSH.

Эта структура объявлена следующим образом:,

typedef struct tagLOGBRUSH { UINT    lbStyle; COLORREF IbColor; LONG    lbHatch; }LOGBRUSH;

BOOL CreatePatternBrush( CBitmap*pBitmap);

Методинициализируетшаблоннуюкисть.

Растровоеизображение,указываемоепараметромpBitmap,предварительнодолжнобытьинициализированооднимизследующихметодов:CBitmap::CreateBitmap, CBitmapr.CreateBitmapIndirect, CBitmap:: LoadBitmapилиCBitmap::CreateCompatibleBitmap.

При успешном завершении метод возвращает ненулевое значение.

BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage ); BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage);

Метод инициализирует шаблонную кисть, использующую аппаратно независимое растровое изображение.BOOLCreateSysColorBrush(intnlndex);

Метод инициализирует штрихующую кисть.

После того как приложение завершит использование данной кисти, ее следует отсоединить от контекста устройства.

КлассCRgn

КлассCRgnинкапсулирует функционирование такого объекта графического интерфейсаWindows, как область.Областью,илирегионом,называется ограниченное некоторой геометрической фигурой (эллипсом, прямоугольником) или их комбинацией пространство внутри окна.

Методы классаCRgn позволяют создавать, изменять и получать информацию об областях. Методы классаCDCприменяются для использования областей.

Для работы с областью первоначально следует создать объект, а затем  проинициализировать его одним из методов, начинающихся с префиксаCreate.

Методы классаCRgn

CRgn();

Конструктор объектаCRgn.BOOLCreateRectRgn(intxl,intyl,intx2,inty2);

Метод выполняет инициализацию области: создает прямоугольную область, хранимую в объектеCRgn.Размер области ограничен 32767 на 32767 логическими единицами или 64 К памяти.

При успешном завершении метод возвращает ненулевое значение.

Для удаления области из контекста устройства следует использовать методCGDIObject::DeleteObject.

BOOLCreateRectRgnIndirect(LPCRECTlpRect);

Метод создает прямоугольную область, хранимую в объектеCRgn.

Для удаления области из контекста устройства следует использовать методCGDIObject::DeleteObject.

BOOL CreateEIlipticRgn( intxl,intyl,intx2,inty2); BOOL CreateEUipticRgnIndirect( LPCRECTIpRect);

Эти методы создают область, имеющую форму эллипса, и хранят ее в объектеCRgn.

BOOL CreatePolygonRgn( LPPOINTipPoints,intnCount,intnMode);

Метод создает объект многоугольникCRgn.Если координаты последней точки многоугольника не совпадают с координатами первой точки, то область замыкается автоматически. Размер области ограничен 32767 на 32767 логическими единицами или 64 К памяти. ПараметрnModeопределяет режим закрашивания области:ALTERNATEилиWINDING.

При успешном завершении метод возвращает ненулевое значение.

Для удаления области из контекста устройства следует использовать методCGDIObject::DeleteObjcct.

BOOL CreatePolyPolygonRgn( LPPOINTIpPoints,LPINTipPolyCounts,intnCount,intnPolyFillMode);

Метод создает область, состоящую из набора замкнутых многоугольников.BOOLCreateRoundRectRgn(intxl,intyl,intx2,intу2,intx3,inty3);

Метод создает вCRgnпрямоугольную область со скругленными углами.

intCombineRgn( CRgn*pRgnl,CRgn*pRgn2,intnCombineMode);

Метод создает новую область, являющуюся объединением двух других существующих областей.

Метод возвращает значение, указывающее один из следующих типов комбинированной области:

COMPLEXREGION- новая область имеет перекрывающиеся части;ERROR- новая область не создана;NULLREGION- новая область пуста;SIMPLEREGION- новая область не имеет перекрывающихся частей.

Параметры:

pRgnl -первая объединяемая область.pRgn2 -вторая объединяемая область.

nCombineMode -операция, указывающая, каким образом комбинировать области. Параметр может принимать одно из следующих значений:RGN_AND- объединенная область включает только пересекающиеся части

обеих областей;

RGN_COPY- объединенная область состоит из копии первой области;RGN_DIFF- объединенная область содержит ту часть первой области

(pRgnl),которая не входит во вторую область(pRgn2);RGN_OR- объединенная область включает и первую и вторую область;RGN_XOR- объединенная область включает и первую и вторую область, удаляя из объединения пересекающиеся части областей.

intCopyRgn(CRgn*pRgnSrc);

Метод копирует областьpRgnSrcв объектCRgn.

Метод возвращает значение, указывающее один из следующих типов скопированной области:

COMPLEXREGION- новая область имеет перекрывающиеся части;ERROR- новая область не создана;NULLREGION- новая область пуста;SIMPLEREGION- новая область не имеет перекрывающихся частей.

BOOLCreateFromPath(CDC*pDC);

Метод создает областьCRgnиз текущего графического объекта контекста устройства. При успешном завершении метод возвращает ненулевое значение.

Параметры:

PDC -контекст устройства, содержащий замкнутый текущий графический объект (path).

int GetRgnBox( LPRECT lpRect) const;'

Метод заносит в параметрIpRectкоординаты прямоугольника, ограничивающего область объектаCRgn.

Метод возвращает значение, указывающее один из следующих типов области объектаCRgn:

COMPLEXREGION - область имеет перекрывающиеся части;ERROR - объектCRgn не определяет достоверную область;NULLREGION - область пуста;SIMPLEREGION - область не имеет перекрывающихся частей.

КлассCBitmap

КлассCBitmap инкапсулируетGDI-интерфейсWindows для растровых изображений и предоставляет для них методы манипулирования.

Для того чтобы использовать объектCbitmap, необходимо выполнить следующие действия:

1.                                   Вызвать конструктор объектаCBitmap;

2.                                   Проинициализировать объект одним из методов инициализации.Методы классаCBitmap

CBitmap();

Конструктор объектаCBitmap.BOOLLoadBitmap(LPCTSTRlpszResourceName);BOOLLoadBitmap(UINTnIDResource);

Метод загружает ресурс растрового изображения объектаCBitmap.

Если ресурс, указанный параметромIpszResourceName,не существует или если для него недостаточно памяти, то метод возвращает значение 0.

Для последующего удаления ранее загруженного растрового изображения приложение вызывает методCGdiObject::DeleteObject.

Параметры:

IpszResourceName- указатель на строку (ограниченную 0-символом), содержащую имяbitmap-ресурса.nIDResource- определяетIDbitmap-ресурса.BOOLLoadOEMBitmap(UINTnIDBitmap);

Метод загружает предопределенное растровое изображение, используе-мое вWindows.

Отметим, что для использования предопределенных растровых изображений должна быть определена константаOEMRESOURCE (до включения заголовочного файлаWINDOWS.H).

При успешном завершении метод возвращает ненулевое значение.

Параметры:

nIDBitmap -ID предопределенного растрового изображенияWindows. Далее приведен неполный список возможных значений параметра:

OBM_BTNCORNERSOBM_OLD_RESTORE

OBM_BTSIZEOBM_OLD_RGARROW

OBM_CHECKOBM_OLD_UPARROW

OBM_CHECKBOXESOBM_OLD_ZOOM

OBM_CLOSEOBM_REDUCE

OBM_COMBOOBM_REDUCED

OBM_DNARROWOBM_RESTORE

OBM_DNARROWDOBM_RESTORED

OBM_DNARROWIOBM_RGARROW

OBM_LFARROWOBM_RGARROWD

OBM_LFARROWDOBM_RGARROWI

OEM_LFARROWIOBM_SIZE

OBM_MNARROWOBM_UPARROW

OBM_OLD_CLOSEOBM_UPARROWD

OBM_OLD_DNARROWOBM_UPARROW

OBM_OLD_LFARROWOBM_ZOOM

OBM_OLD_REDUCEOBM_ZOOMD.

intGetBitmap(BITMAP*pBitMap);

Метод заносит в структуруBITMAP информацию об объектеCBitmap.CSizeGetBitmapDimension( )const;

Метод возвращает значения ширины и высоты растрового изображения (единицей измерения является 0.1 мм), установленные методомSetBitmapDimension.

КлассCFont

КлассCFont инкапсулируетGDI-интерфейсWindows для шрифтов и предоставляет методы манипулирования ими.

Как и для других объектов графического инструментария, алгоритм использования объектовCFont состоит из двух этапов: вызова конструктора объекта и его инициализации. На этапе инициализации выполняется пристыковка шрифтаWindows к созданному объектуCFont. Это может быть выполнено следующими методами:CreateFont,CreateFontlndirect,CreatePointFont,CreatePointFontlndirect.

Методы классаCFont

CFont();

Конструктор объектаCFont.BOOL CreateFontIndirect(const LOGFONT*ipLogFont);

Метод инициализирует объектCFontхарактеристиками, указанными в структуреLOGFONT.

При связывании созданного шрифта с контекстом устройства вызовом методаCDC::SelectObjectдля заданного логического шрифта подбирается наиболее близкий ему физический шрифт.

После завершения работы с объектомCFont,созданным функциейCreateFontlndirect следует сначала удалить шрифт из контекста устройства, а затем удалить сам объект.

При успешном завершении метод возвращает ненулевое значение.BOOLCreateFont(intnHeight,intn Width,intnEscapement,intn Orientation,intnWeight,BYTEbltalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRipszFacename);

Метод инициализирует объектCFontуказанными характеристиками.

BOOL CreatePointFont (intnPointSize,LPCTSTRipszFaceName,CDC*pDC =NULL);

Метод создает шрифт указанного размера. Он автоматически преобразовывает заданный размер шрифта в логические единицы измерения, используемые объектом контекста устройстваpDC.

При успешном завершении метод возвращает ненулевое значение.

Параметры:

nPointSize -высота шрифта, указываемая в пунктах*10.

IpszFaceName- объектCStringили указатель на строку, содержащую имя

шрифта. Длина имени не должна превышать 30 символов.

Для перечисления всех текущих доступных шрифтов можно использоватьWindows-функциюEnumFontFamilies.

pDC -указатель на объектCDC,используемый для преобразования высоты шрифтаnPointSizeв логические единицы измерения. Если параметр равенNULL,то используется контекст устройства дисплея.




Возможно эти работы будут Вам интересны.

1. Способы и средства тушения пожаров. Автоматические установки пожаротушения. Первичные средства пожаротушения. Пожарная сигнализация

2. ПЕРВИЧНЫЕ СРЕДСТВА ПОЖАРОТУШЕНИЯ — средства тушения внезапно возникшего очага несанкционированного горения (очага пожара в начальной стадии его развития)

3. Средства расходуются на: обеспечение по страхованию .

4. Технические средства безопасности и защиты

5. Методы, формы и средства воспитания и самовоспитания

6. Основные средства и производственные мощности в энергетике

7. . Способы и средства определения состояния систем управления 2.

8. Деятельность включает в себя цель средства результат и сам процесс.

9. Средства как собственного так и заемного капитала используются предприятием в момент его создания прежде

10. темами безопасности применяются и разнообразные средства пожаротушения которые имеют чрезвычайно высокую