1.39k likes | 1.75k Views
Win32 API System Programming. GDI & GDI+. 한양대학교 컴퓨터공학과 Computer Vision & Pattern Recognition Lab 박사 5 기 박현. Contents. GDI Device Context 다양한 그리기 함수 속성 설정 매핑 모드 예제 GDI+ 구성요소 새로운 기능 프로그래밍 모델에서의 변화 사용방법 예제. GDI. GDI ( Graphic Device Interface )
E N D
Win32 API System Programming GDI & GDI+ 한양대학교 컴퓨터공학과 Computer Vision & Pattern Recognition Lab 박사 5기 박현
Contents • GDI • Device Context • 다양한 그리기 함수 • 속성 설정 • 매핑 모드 • 예제 • GDI+ • 구성요소 • 새로운 기능 • 프로그래밍 모델에서의 변화 • 사용방법 • 예제 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI • GDI ( Graphic Device Interface ) • Window OS 상의 풍부한 그리기 작업을 제공하는 인터페이스 • 장치 독립적인 그래픽 출력 모델 ( GDI + Graphic Device Driver ) • GDI 서비스 : Gdi.exe , Gdi32.dll • GDI Object • Pen, Brush , Bitmap , Region, Font , Palette • GDI Object 는 프로그램 종료 시 자동으로 삭제되지 않음 • Device Context 에서 사용되고 있는GDI Object 는DeleteObject 에 의해서 삭제되지 않음 Graphic Hardware Virtual Device Driver Application GDI 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI • GDI 관련 함수 • Device Context의 속성 관련 함수 • 도형 관련 출력 함수 • Text 관련 출력 함수 • Mapping mode 관련 함수 • 그림 도구 변경 함수 • DC( Device Context ) • GDI 의 핵심적인 개념 • GDI 함수의 Parameter 로 쓰인다. • 논리적 “스크린” , “프린터” 등을 표시함 • 구조체 : 객체 + 속성 + 모드 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
Device Context • DC • Simple Method • OnPaint Handler CDC * pDC = GetDC(); // Drawing ReleaseDC( pDC ); PAINTSTRUCT ps; CDC * pDC = BeginPaint( &ps ); //Drawing EndPaint( &ps ); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
Device Context Class • Motive • DC를 얻거나 해제하기 위한 함수를 기억해야 함 • 사용한 DC를 확실하게 해제해야 함 PAINTSTRUCT ps; CDC * pDC = BeginPaint( &ps ); //Drawing EndPaint함수를 사용하지 않았다면 ??? 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
Device Context Class • CDC • CPaintDC • OnPaint 핸들러 • CWnd::BeginPaint() ~ CWnd::EndPaint(); • BeginPaint() 또는 EndPaint() 호출시 실패 ???? • CPaintDC::m_ps PAINTSTRUCT 의 rcPaint 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
Device Context Class • CDC • CWindowDC • CWindowDC dc(this) : ( Client Area + Frame ) • CWindowDC dc(NULL) : Screen Area • CWnd::GetWindowDC() ~ CWnd::ReleaseDC(); • NonClient Area 에 효과를 주기 위해 사용함 • CWindowDC 보다는 WM_NCPAINT 메시지 핸들러를 더 사용함 • CClientDC • CClientDC dc(this) : Client Area • CClientDC dc(NULL) : Screen Area • CWnd::GetClientDC() ~ CWnd::ReleaseDC(); • CMetaFileDC • 메타파일에 대한 그리기 작업 • Construct : Create() ~ Destructor : DeleteMetaFile() 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
Drawing Function CDC Draw Function 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
DC Property CDC::SelectStockObject 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
Mapping Mode • Logical Coordinate • MoveTo , LineTo : 실질적인 화면의 좌표가 아님 • Device Context 에 의해서 정의되는 논리적 좌표계의 좌표 • CDC::SetWindowOrg • Device Coordinate • GDI : 장치 속성 , 매핑모드 방정식을 이용 논리적 좌표를 화면의 실질적 좌표 (Device Coordinate)로 변경 • 원점 : Device Context의 Display 표면의 (0,0) • 단위 : 픽셀 • CDC::SetViewPortOrg (0,0) 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
Mapping Mode • CDC::SetViewPortOrg • Logical Coordinate (0,0) => Mapping to Device Coordinate(x,y) • CDC::SetWindowOrg • Logical coordinate(x,y) => Mapping to Device Coordinate(0,0) (0,0) (0,0) Logical Coordinate Origin (x,y) Device Unit (x,y) Device Unit (0,0) (0,0) (x,y) Logical coordinate (x,y) Logical coordinate 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
Mapping Mode • CDC::SetMapMode 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ • GDI+ • For Window XP Graphic Device Interface • GDI+ API provide C++ Class for GDI+ • GDI+ 의 세가지 구성요소 • 2D Vector Graphics • Image processing • Typography 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ • GDI+ 의 세가지 구성요소 • 2D Vector Graphics • 여러 점들로 구성되는 Drawing Primitives 가 존재 • Drawing Primitives 에 대한 정보를 저장하는 Class 제공 • Rect , Point , Pen , Brush , Graphics • Image processing • Vector Image Processing • 다양한 Image 관련 객체들 ( CachedBitmap ) • Typography • 다양한 형태의 크기, 폰트, 스타일로 TEXT 출력 하는 것과 관련됨 • Font Antialiasing 기능 제공 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ • GDI+ 의 새로운 특징들 • Gradient Brushes • Cardinal Splines • Independent Path Objects • Transformations and the Matrix Object • Scalable Regions • Alpha Blending • Antialiasing • Support for Multiple Image Formats • Etc.. 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ 새로운 기능 • Gradient Brushes • Brush : 도형 , 패스(Path) , 영역(Region) • 점진적으로 색상이 변함 • Linear gradient brush • 두가지 색상만 제공함 • Path gradient brush • 경로에 따라 색상의 변화를 정의 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ 새로운 기능 • Cardinal Splines • GDI 에 없던 Cardinal Spline 을 제공함 • Independent Path Objects ( Path Object’s Durability ) • GDI • DC와 밀접한 Path는 한번 그려지면 정보가 모두 소멸됨 • GDI+ • Graphics 객체와 독립적인 Path 객체가 정보 유지함 • Path 객체를 여러 개 생성하여 유지할 수 있음. 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ 새로운 기능 • Transformation & Matrix Object • Matrix Object • 쉬우면서 유연한 Transformation (Translate , Rotate, etc) 기능을 제공함 • Matrix Object 는 Transform 되어야 할 객체와 결합하여 사용됨. • GraphicsPath 객체는 Transform 함수를 가지고 있음. • Region + Matrix Object 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ 새로운 기능 • Scalable Region • GDI • Device Coordinate 상의 정보로 저장됨 • Translation 변환만 가능함 • GDI+ • World coordinate (무한좌표계) • Scaling , Translation , Rotation 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ 새로운 기능 • Alpha Blending • Transparency 설정 • Antialiasing • 계단현상을 줄임 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ 새로운 기능 • Recoloring • Image Color Adjusting Process • changing one color to another • adjusting a color's intensity relative to another color • adjusting the brightness or contrast of all colors • converting colors to shades of gray 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ 새로운 기능 • Graphics Container • Graphics Object : Container 역할 • Graphics State 정보를 유지 Outer Container Inner Container Antialiasing mode 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ 새로운 기능 • Various Image format • GDI+ 는 Image, Bitmap, Metafile 클래스들을 제공함. • BMP • GIF • JEPG • Exif • PNG • TIFF • ICON • WMF • EMF 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Programming Model • GDI • Device Context 사용하는 Handle 기반 • SelectObject Function에 의해서 영향을 받음. • Current Position • Brush에 의해서 도형의 내부가 칠해짐 • Resion 및 Path 정보는 단발성 • GDI+ • Graphics 객체를 사용하는 객체지향적인 모델 • 사용중인 Pen , Brush , Bitmap , Font에 정보를 유지하지 않음 • 그래픽 객체를 인수로 사용함 • Overloading 된 많은 함수들을 제공 • Current Position 개념을 지원하지 않음 • 도형의 외곽선을 그리는 함수와 내부를 칠하는 함수를 분리 • Region 과 Path 기능 강화 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Programming Model • In MFC • StdAfx.h • #ifndef ULONG_PTR • #define ULONG_PTR unsigned long * • #endif • #include <Gdiplus.h> • #include <GdiplusBase.h> • #include <GdiplusColor.h> • #include <GdiplusPen.h> • #include <GdiplusBrush.h> • #include <GdiplusPath.h> • #include <Gdiplusgraphics.h> • using namespace Gdiplus; • #pragma comment(lib, "gdiplus.lib") 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Programming Model • In MFC • CWinApp • Member Variable • ULONG_PTR m_gdiplusToken; • InitInstance() • GdiplusStartupInput gdiplusStartupInput; • // Initialize GDI+ • GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); • ExitInstance() • GdiplusShutdown(m_gdiplusToken); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Coordinate Systems • Types of Coordinate Systems • World Coordinate System • Page Coordinate System • Device Coordinate System • Transformation Sequences of Coordinate • Before GDI+ can draw the line on screen World Coordinate Page Coordinate Device Coordinate 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Coordinate Systems • GDI+ • World Coordinate System • 원점은 Transform 에 의해서 변경됨. • GDI+ Function Call : graphics.DrawLine( &penBlack , 0 , 0 , 160 , 80 ); • Page Coordinate System • 원점은 항상 클라이언트 영역의 (0,0) 이다. (변경되지 않음) • 기본 단위 : 픽셀 ( Page Coordinate System = Device Coordinate System ) • 기본 단위 변경 가능 • Device Coordinate System • 원점은 항상 클라이언트 영역의 (0,0) 이다. (변경되지 않음) • 기본단위 : 픽셀 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Coordinate Systems • GDI+ • ( 100 , 50 ) 을 원점으로 하는 좌표계 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Coordinate Systems • Mapping • World Transformation • Map World Coordinates to Page Coordinates • Graphics 객체에 의해서 정보가 유지됨. • TranslateTransform을 이용함. World Coordinate Page Coordinate World Transformmation graphics.TranslateTransform( 100.0f , 50.0f ); graphics.DrawLine( &myPen , 0 , 0 , 160 , 80 ); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Coordinate Systems • Mapping • Page Transformation • Map Page Coordinates to Device Coordinates • Graphics 객체에 의해서 정보가 유지됨. • SetPageUnit, GetPageUnit , SetPageScale, GetPageScale을 이용함. Page Coordinate Device Coordinate Page Transformmation graphics.SetPageUnit( UnitInch ); graphics.DrawLine( &myPen , 0 , 0 , 2, 1); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Coordinate Systems • Mapping • Page Transformation • Pen 의 굵기를 변경하지 않으려면 GetDpiX , GetDpiY 함수를 이용. • GetDpiX , GetDpiY : Pixel per Inch 를 얻어온다. • graphics.DrawLine( &myPen , 0 , 0 , 2, 1); in 96 dots per inch Pen myPen(Color(255,0,0,0) , 1 / graphics.GetDpiX() ); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Coordinate Systems • Mapping graphics.TranslateTransform( 2.0f , 0.5f ); graphics.SetPageUnit( UnitInch ); graphics.DrawLine( &myPen , 0 , 0 , 2, 1); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Global and Local Transformation • Matrix Class • Multiply , Invert , Rotate , RotateAt , Scale , Shear , OffsetX OffsetY • Clone, Equals 등 다양한 함수를 제공함. • Geometric Transformations Rotate Scale Translate 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Global and Local Transformation • Matrix Class // Create the path. GraphicsPath myGraphicsPath; Rect myRect(0, 0, 60, 60); myGraphicsPath.AddRectangle(myRect); // Fill the path on the new coordinate system. // No local transformation myGraphics.FillPath(&mySolidBrush1, &myGraphicsPath); // Transform the path. Matrix myPathMatrix; myPathMatrix.Scale(2, 1); myPathMatrix.Rotate(30, MatrixOrderAppend); myGraphicsPath.Transform(&myPathMatrix); myGraphics.FillPath(&mySolidBrush2, &myGraphicsPath); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ Global and Local Transformation • Graphics class • MultiplyTransform , RotateTransform , • ScaleTransform , TranslateTransform graphics.DrawEllipse( &penBlue , 0 , 0 , 100 , 50 ); graphics.ScaleTransform( 1.0f , 0.5f ); graphics.TranslateTransform( 50.0f , 0.0f , MatrixOrderAppend ); graphics.RotateTransform( 30.0f , MatrixOrderAppend ); graphics.DrawEllipse( &penBlue , 0 , 0 , 100 , 50 ); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • DrawLine , DrawRectangle , DrawEllipse , DrawPolygon , DrawArc , DrawCurve , DrawBezier CClientDC dc(this); Graphics graphics( dc.GetSafeHdc() ); Pen penBlack( Color(255,0,0) , 5 ); Status state = graphics.DrawRectangle( &penBlack , 10 , 10 , 100 , 50 ); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • Width & Alignment • Status SetWidth ( REAL width ); • Status SetAlignment( PenAlignment penAlignment ); • PenAlignmentCenter = 0 • PenAlignmentInset = 1 Pen penBlack( Color(255,0,0,0) , 1 ); Pen penGreen( Color(255,0,255,0) , 10 ); Status state = penGreen.SetAlignment(PenAlignmentCenter); state = graphics.DrawLine( &penGreen, 10 , 100 , 100 , 50 ); state = graphics.DrawLine( &penBlack, 10 , 100, 100, 50 ); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • Width & Alignment Pen penBlack( Color(255,0,0,0) , 1 ); Pen penGreen( Color(255,0,255,0) , 10 ); Status state = penGreen.SetAlignment(PenAlignmentInset); state = graphics.DrawRectangle( &penGreen, 10 , 100 , 50 , 50 ); state = graphics.DrawRectangle( &penBlack, 10 , 100, 50, 50 ); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • Line Caps • SetStartCap , SetEndCap • Cap Type • LineCapFlat = 0 • LineCapSquare = 1 • LineCapRound = 2 • LineCapTriangle = 3 • LineCapNoAnchor = 0x10 • LineCapSquareAnchor = 0x11 • LineCapRoundAnchor = 0x12 • LineCapDiamondAnchor = 0x13 • LineCapArrowAnchor = 0x14 • LineCapCustom = 0xff 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • LineCapArrowAnchor Status state; Pen penBlack( Color(255,0,0,0) , 5 ); state = penBlack.SetStartCap( LineCapArrowAnchor ); state = penBlack.SetEndCap( LineCapRoundAnchor ); state = graphics.DrawLine( &penBlack , 20 , 175 , 300 , 175 ); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • LineCapCustom • Pen member function • Status SetCustomStartCap( const CustomLineCap * customCap ); • Status SetCustomEndCap( const CustomLineCap * customCap ); • Class CustomLineCap • 새로운 캡을 GraphicsPath 에 의해서 생성할 수 있음. • CustomLineCap( const GraphicsPath * fillPath, const GraphicsPath * strokePath, LineCap baseCap, REAL baseInset); • fillPath 와 strokePath 를 동시에 사용할 수 없음. • fillPath 와 strokePath 를 동시에 사용하면 fillPath 가 무시됨. 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • LineCapCustom • Class CustomLineCap Graphics graphics(hdc); Point points[3] = {Point(-15, -15), Point(0, 0), Point(15, -15)}; GraphicsPath capPath; capPath.AddLines(points, 3); CustomLineCap custCap(NULL, &capPath); custCap.SetStrokeCaps(LineCapTriangle, LineCapRound); Pen strokeCapPen(Color(255, 255, 0, 255), 5.0f); strokeCapPen.SetCustomEndCap(&custCap); graphics.DrawLine(&strokeCapPen, Point(100, 100), Point(300, 100)); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • LineCapCustom • Class CustomLineCap • Based Vertical Line LineCapTriangle LineCapRound -15 0 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • LineCapCustom • Class AdjustableArrowCap • 화살표 캡과 비슷한 캡을 생성할 수 있음. • AdjustableArrowCap( REAL height, REAL width, BOOL isFilled ); CustomLineCap BaseClass AdjustableArrowCap SubClass width height 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • LineCapCustom • Class AdjustableArrowCap Graphics graphics(hdc); AdjustableArrowCap myArrow(10, 10, true); Pen arrowPen(Color(255, 0, 0, 0)); arrowPen.SetCustomEndCap(&myArrow); graphics.DrawLine(&arrowPen, Point(0, 20), Point(100, 20)); AdjustableArrowCap otherArrow(myArrow.GetHeight(), 20, true); arrowPen.SetCustomEndCap(&otherArrow); graphics.DrawLine(&arrowPen, Point(0, 55), Point(100, 55)); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • Dash Line REAL dashValues[4] = {5, 2, 15, 4}; Pen blackPen(Color(255, 0, 0, 0), 5); blackPen.SetDashPattern(dashValues, 4); Status stat = graphics.DrawLine(&blackPen, Point(5, 5), Point(405, 5)); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • Join Line GraphicsPath path; Pen penJoin(Color(255, 0, 0, 255), 8); Status stat = path.StartFigure(); stat = path.AddLine(Point(50, 200), Point(100, 200)); stat = path.AddLine(Point(100, 200), Point(100, 250)); stat = penJoin.SetLineJoin(LineJoinBevel); stat = graphics.DrawPath(&penJoin, &path); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현
GDI+ : Pen • Pen • Texture Image를 이용하여 도형을 그릴 수 있음. Status state; Image image(L”Texture.jpg”); TextureBrush brTexture(&image) Pen penTexture(&brTexture , 10 ); state = graphics.DrawImage( &image , 0 , 0 , image.GetWidth(), image.GetHeight() ); state = graphics.DrawEllipse( &penTexture ,100,20,200,100); 한양대학교 컴퓨터공학과 컴퓨터 비젼 & 패턴인식 연구실 박현