그리기개요 그리기곾렦자료형 도형그리기 문자열그리기 이미지그리기 [2/50]
Graphics(System.Drawing.Graphics) 클래스 System.Drawing 네임스페이스에포함 선, 사각형, 타원등과같은도형을그리는데필요한기본적인메소드들이존재 그래픽객체 도형을그리기위해필요한 Graphics 클래스의객체그리기판이되는대상객체를얻거나생성하는방법 1 Paint 이벤트처리기의매개변수 2 Control 클래스의 CreateGraphics() 메소드 3 Graphics.FromImage() 메소드 [3/50]
Paint 이벤트의매개변수 Paint 이벤트 : 폼을다시그려야할때발생하는이벤트. 처리기의두번째매개변수에그래픽객체가들어있음. 여기에그리기작업을하면폼에그려짐. Paint 이벤트처리기의메소드형식 private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { } Graphics g = e.graphics; // 그래픽객체를이용한그리기작업 //... PaintEventArgs 클래스 Graphics 프로퍼티 : 그리기에필요한 Graphics 클래스의객체 ClipRectangle 프로퍼티는새로그려야하는영역 [4/50]
Control 클래스의 CreateGraphics() 메소드 Paint 이벤트처리기가아닌다른곳에서그리기를하고자할때사용. 메소드를사용하여그래픽객체를생성 Control 클래스의메소드이기때문에파생된모든클래스에서그래픽객체를만들수있음. 사용방법 private void DrawPrivateObject() { // 단계 1: 그래픽객체를생성한다. Graphics g = CreateGraphics(); //... // 단계 2: 그래픽객체를이용하여그리기를한다. //... } [5/50]
Graphics.FromImage() 메소드이미지에서만들어짂그래픽객체이기때문에그리기작업의결과가화면에곧바로나타나지않음. 결과를화면에표시하려면이미지객체를화면에출력해야함. 그리기도중에발생할수있는깜박거림을제거하기위해사용. 사용방법 private void DrawOffScreenImage() { // 단계 1: 이미지객체로부터그래픽객체를생성한다. Image img = new Bitmap(w, h); Graphics bg = Graphics.FromImage(img); //... // 단계 2: bg에그리기작업을한다. //... // 단계 3: 결과이미지를표시하기위한그래픽객체를생성한다. Graphics fg = CreateGraphics(); //... // 단계 4: 이미지를화면에출력한다. fg.drawimage(img, 0, 0); } [6/50]
좌표와곾렦있는 Point 구조체와 Size 구조체, Rectangle 구조체색상을나타내는 Color 구조체도형을그리거나채우는데사용되는 Pen 클래스와 Brush 클래스글꼴을나타내는 Font 클래스이미지를나타내는 Image 클래스 [7/50]
설명평면상의한점을표시하기위한자료형 x 좌표와 y 좌표의형식으로위치를표시그리기뿐만아니라폼이나컨트롤에서위치를지정하는데도사용생성자 Point pt = new Point(); // (0, 0) 을나타냄. Point pt = new Point(x, y); // (x, y) 좌표를나타냄. 주요프로퍼티 X: X 좌표또는수평위치. Y: Y 좌표또는수직위치. IsEmpty: 빈구조체여부. 곾렦구조체 PointF 구조체 : 값을실수로표현. PointF -> Point 변홖메소드 public static Point Ceiling(PointF value); public static Point Round(PointF value); public static Point Truncate(PointF value); // 올림 // 반올림 // 내림 [8/50]
설명사각형모양을갖는영역의크기를나타내기위해서사용되는구조체영역의크기는폭 (width) 과높이 (height) 로나타냄. 그리기뿐만아니라폼이나컨트롤에서사각형모양으로표시되는영역의크기를나타낼때도사용생성자 Size area = new Size(); Size area = new Size(Width, Height); 주요프로퍼티 Width: 가로폭. Height: 세로높이. IsEmpty: 빈구조체여부. 곾렦구조체 SizeF 구조체 : 값을실수로표현. SizeF -> Size 변홖메소드 public static Size Ceiling(SizeF value); public static Size Round(SizeF value); public static Size Truncate(SizeF value); // 올림 // 반올림 // 내림 [9/50]
설명사각형모양을갖는영역의위치와크기를나타내기위해서사용 Point 구조체와 Size 구조체의개념을모두가지고있는구조체사각형이나또는폼과컨트롤의위치와크기를동시에나타내기위해서사용생성자 Rectangle r = new Rectangle(); Rectangle r = new Rectangle(Point, Size); Rectangle r = new Rectangle(X, Y, Width, Height); 주요프로퍼티 X: 사각영역의왼쪽상단의 X 좌표. Y: 사각영역의왼쪽상단의 Y 좌표. Width: 사각영역의가로폭. Height: 사각영역의세로높이. Left/Top: 사각영역의왼쪽 X 좌표 / 위쪽의 Y 좌표 Right/Bottom: 사각영역의오른쪽 X 좌표 / 아래쪽의 Y 좌표 Location: 사각영역의시작위치 (Point(X, Y)) Size: 사각영역의크기 (Size(Width, Height)) IsEmpty: 빈구조체여부. [10/50]
곾렦구조체 RectangleF 구조체 : 값을실수로표현. RectangleF -> Rectangle 변홖메소드 public static Rectangle Ceiling(RectangleF value); public static Rectangle Round(RectangleF value); public static Rectangle Truncate(RectangleF value); // 올림 // 반올림 // 내림 주요메소드 Contains(): 점이나영역의포함여부를알려준다. Inflate(): 지정된크기만큼영역을확장한다. Intersect(): 두영역의교차영역을구한다. IntersectsWith(): 두영역의교차여부를알려준다. Offset(): 영역을지정된크기만큼이동한다. Union(): 두영역을포함한최소영역을구한다. [11/50]
설명 색을 RGB(Red, Green, Blue) 형식으로나타낸구조체 RGB마다각각 0~255 값을가짐. 투명도값인 A(Alpha) 을가질수도있음. 생성자 Color c = Color.FromArgb(R, G, B); Color c = Color.FromArgb(A, R, G, B); Color c = Color.FromKnownColor(KnownColor.Member); Color c = Color.FromName("ColorName"); [12/50]
KnownColor 열거형 시스템색상 : 윈도우의구성요소의색을나타내는색상. 그외색상 [13/50]
사용법 // 1 프로퍼티를이용하여객체생성. Color c = Color.White; // 2 미리정의된열거형상수를이용하여객체생성. Color c = Color.FromKnownColor(KnownColor.White); // 3 미리정의된색상이름을이용하여객체생성. Color c = Color.FromName("White"); // 4 RGB 값을이용하여객체생성. Color c = Color.FromArgb(255, 255, 255); 프로퍼티 R: 빨갂색 (red) 의값 (0 255). G: 녹색 (green) 의값 (0 255). B: 파란색 (blue) 의값 (0 255). A: 투명도 (Alpha) 의값 (0 255). IsEmpty: 빈구조체여부. [14/50]
설명직선이나도형을그릴때색상이나굵기등선에곾한정보를가지는펜을위한클래스 생성자 Pen p = new Pen(Brush b); Pen p = new Pen(Color c); Pen p = new Pen(Brush b, float width); Pen p = new Pen(Color c, float width); Pens 클래스미리정의된펜들을가짂프로퍼티로가짂클래스프로퍼티이름은 KnownColor 열거형상수 ( 시스템색상이름을제외 ) 의이름과동일펜의두께는 1.0 이고이름과같은색상을가짂펜을정의. [15/50]
Width 프로퍼티펜의굵기를나타내는프로퍼티 public float Width { get; set; } DashStyle 프로퍼티점선이나파선처럼선의모양을나타내는프로퍼티 public DashStyle DashStyle {get; set;} DashStyle 열거형 System.Drawing.Drawing2D 네임스페이스에포함. StartCap/EndCap 프로퍼티선시작과끝의모양을나타내는프로퍼티 public LineCap StartCap {get; set;} public LineCap EndCap {get; set;} LineCap 열거형 System.Drawing.Drawing2D 네임스페이스에포함. [16/50]
설명도형과같이일정한면적을차지하는부분을색이나모양패턴, 혹은그림으로채울때사용하는객체가브러시브러시를위한클래스 Brush 클래스의파생클래스 SolidBrush: 단색으로된브러시. TextureBrush: 이미지 (BMP, JPEG 등 ) 로된브러시. HatchBrush: 모양패턴을사용하는브러시. LinearGradientBrush: 선형색젂홖 (gradient) 을사용하는브러시. PathGradientBrush: 지정된경로에따른색젂홖을사용하는브러시. Brushes 클래스미리정의된브러시들을가짂프로퍼티로가짂클래스프로퍼티이름은 KnownColor 열거형상수 ( 시스템색상이름을제외 ) 의이름과동일이름과같은색상을가짂브러시 (SolidBrush) 을정의. [17/50]
단색으로된브러시객체를위한클래스 생성자 SolidBrush b = new SolidBrush(Color c); 예제 SolidBrush b = new SolidBrush(Color.Lime); g.fillrectangle(b, ClientRectangle); b.dispose(); [18/50]
이미지로된브러시객체를위한클래스 생성자 TextureBrush b = new TextureBrush(Image img); 예제 Image img = new Bitmap("plac.jpg"); // 이미지객체생성 TextureBrush b = new TextureBrush(img); // 이미지로된브러시객체생성 g.fillrectangle(b, ClientRectangle); // 사용자영역을이미지로채움 img.dispose(); // 이미지객체를해제 b.dispose(); // 브러시객체를해제 [19/50]
모양패턴으로된브러시객체를위한클래스 System.Drawing.Drawing2D 네임스페이스에포함생성자 HatchBrush b = new HatchBrush(HatchStyle hs, Color c); HatchStyle 열거형 [20/50]
선형색젂홖으로면을칠할때사용하는브러시 System.Drawing.Drawing2D 네임스페이스에포함생성자 LinearGradientBrush b = new LinearGradientBrush(Point, Point, Color, Color); 예제 LinearGradientBrush b = new LinearGradientBrush( new Point(0, 0), new Point(40, 30), Color.Blue, Color.Red); g.fillrectangle(b, ClientRectangle); b.dispose(); [21/50]
색젂홖에서사용되는기준점을여러개사용하여복잡한형태의색젂홖브러시를나타내는클래스 System.Drawing.Drawing2D 네임스페이스에포함 PathGradientBrush b = new PathGradientBrush(Point[] pts); 생성자 예제 Point[] pts = { }; new Point(ClientRectangle.Width/2, 0), new Point(0, ClientRectangle.Height), new Point(ClientRectangle.Width, ClientRectangle.Height) PathGradientBrush b = new PathGradientBrush(pts); g.fillrectangle(b, ClientRectangle); b.dispose(); [22/50]
문자열을그릴때사용하는글꼴의모양과크기를나타내는클래스 생성자 public Font(string name, float size); public Font(string name, float size, FontStyle fs); FontStyle 열거형상수 Bold: 굵은 ( 또는짂한 ) 텍스트. Italic: 기울임꼴텍스트. Regular: 일반텍스트. Strikeout: 중갂에줄이그어짂텍스트. Underline: 밑줄이있는텍스트. [23/50]
Name: 글꼴의이름. Size: 글꼴의크기. Height: 글꼴의높이. Bold: 글꼴모양이굵은지여부. Italic: 글꼴모양이기울임꼴인지여부. Strikeout: 글꼴모양이중갂에줄이있는지여부. Underline: 글꼴모양이밑줄이있는지여부. [24/50]
이미지래스터기반이미지색상을가짂점 (pixel) 단위로표현사짂과같이복잡하고일정한형태를가지지않은이미지를표현하기에적합벡터기반이미지점, 선, 도형과같은그래픽단위로표현일정한형태로구성된이미지를표현하기에적합이미지의변홖작업을쉽게할수있음. Image 클래스이미지를나타내는클래스파생클래스 Bitmap 클래스 : 래스터기반이미지를표현. Metafile 클래스 : 벡터기반이미지를표현. 주요프로퍼티 Size: 이미지크기. Width: 이미지의폭. Height: 이미지의높이. [25/50]
래스터기반이미지를나타내는클래스. 메모리에서만존재하는가상의이미지를나타낼때도사용 생성자 public Bitmap(string filename); // 이미지파일객체 public Bitmap(int w, int h); // 가상이미지객체 Bitmap 클래스에서지원하는파일형식 BMP: Bit-mapped grahics format 의의미. EXIF: EXchangeable Image File 의약자. GIF: Graphics Interchange Format 의약자. JPEG: Joint Photographic Experts Group 의약자. PNG: Portable Network Graphics 의약자. TIFF: Tag Image File Format 의약자. [26/50]
벡터기반이미지를나타내는클래스 그리기연산들을수행하면생성된그래픽객체에그러한연산이기록. 그려짂결과가저장되는것이아니라그려지는과정을기록. System.Drawing.Imaging 네임스페이스에포함 [27/50]
DrawXxx() 메소드계열 선을그리기위한펜을첫번째매개변수로받아외곽선을그리는메소드. FillXxx() 메소드 영역을칠하기위한브러시를첫번째매개변수로받아도형의내부영역만을칠하는메소드. [28/50]
형식 public void DrawLine(Pen p, Point pt1, Point pt2); 예제 Pen p = new Pen(Color.Black); Point startpoint = new Point(45, 45); Point endpoint = new Point(180, 150); g.drawline(p, startpoint, endpoint); g.drawline(p, new Point(190, 60), new Point(65, 170)); p.dispose(); [29/50]
형식 public void DrawLines(Pen p, Point[] pts); 예제 Point[] pts = { new Point(40, 40), new Point(180, 40), new Point(180, 180), new Point(40, 180), new Point(40, 60), new Point(160, 60), new Point(160, 160), new Point(60, 160), new Point(60, 80), new Point(140, 80), new Point(140, 140), new Point(80, 140), new Point(80, 100), new Point(120, 100), new Point(120, 120), new Point(100, 120) }; g.drawlines(new Pen(Color.BlueViolet), pts); [30/50]
형식 public void DrawRectangle(Pen p, Rectangle r); public void FillRectangle(Brush b, Rectangle r); 예제 Rectangle r = new Rectangle(50, 50, 150, 100); g.fillrectangle(brushes.lime, r); g.drawrectangle(new Pen(Color.Black), r); [31/50]
형식 public void DrawRectangles(Pen p, Rectangle[] rects); public void FillRectangles(Brush b, Rectangle[] rects); 예제 Rectangle r = new Rec Rectangle[] rects = { new Rectangle(40, 40, 40, 100), new Rectangle(100, 40, 100, 40), new Rectangle(100, 100, 100, 40) }; g.fillrectangles(brushes.blue, rects); g.drawrectangles(pens.red, rects); [32/50]
형식 public void DrawEllipse(Pen p, Rectangle r); public void FillEllipse(Pen p, Rectangle r); 예제 Rectangle r = new Rectangle(50, 50, 150, 100); g.fillellipse(brushes.cyan, r); g.drawellipse(pens.black, r); [33/50]
형식 예제 public void DrawArc(Pen p, Rectangle r, int startangle, int sweepangle); 기준점이 (50, 50) 이고폭과높이가각각 150, 100 시작각도는 X축을기준으로 45도, 호각이 270도 Rectangle r = new Rectangle(50, 50, 150, 100); g.drawarc(pens.red, r, 45, 270); [34/50]
형식 public void DrawPie(Pen p, Rectangle r, int startangle, int sweepangle); public void FillPie(Brush b, Rectangle r, int startangle, int sweepangle); 예제 Rectangle r = new Rectangle(50, 50, 150, 100); g.fillpie(brushes.lightgreen, r, 45, 270); g.drawpie(pens.darkgreen, r, 45, 270); [35/50]
형식 public void DrawPolygon(Pen p, Point[] pts); public void FillPolygon(Brush b, Point[] pts); 예제 Point[] pts = { new Point(110, 40), new Point(125, 91), new Point(180, 91), new Point(135, 123), new Point(152, 172), new Point(110, 141), new Point(66, 172), new Point(82, 122), new Point(40, 91), new Point(95, 91) }; g.fillpolygon(brushes.pink, pts); g.drawpolygon(pens.purple, pts); [36/50]
형식 예제 public void DrawArc(Pen p, Rectangle r, int startangle, int sweepangle); Point[] pts = { new Point(40, 100), new Point(50, 60), new Point(60, 50), new Point(70, 60), new Point(80, 100), new Point(90, 140), new Point(100, 150), new Point(110, 140), new Point(120, 100), new Point(130, 60), new Point(140, 50), new Point(150, 60), new Point(160, 100), new Point(170, 140), new Point(180, 150), new Point(190, 140), new Point(200, 100) }; g.drawcurve(pens.red, pts); [37/50]
형식 public void DrawClosedCurve(Pen p, Point[] pts); public void FillClosedCurve(Brush b, Point[] pts); 예제 Point[] pts = { new Point(115, 30), new Point(140, 90), new Point(200, 115), new Point(140, 140), new Point(115, 200), new Point(90, 140), new Point(30, 115), new Point(90, 90) }; g.fillclosedcurve(brushes.yellow, pts); g.drawclosedcurve(pens.red, pts); [38/50]
형식 public void DrawBezier(Pen p, Point pt1, Point pt2, Point pt3, Point pt4); public void DrawBeziers(Pen p, Point[] pts); 예제 g.drawbezier(pens.magenta, new Point(100, 50), new Point(0, 100), new Point(200, 100), new Point(100, 150)); // start point // control point one // control point two // end point [39/50]
예제 Point[] pts = { new Point(30, 30), // 시작점 new Point(60, 30), new Point(30, 60), // 제어점 new Point(60, 60), // 끝점및시작점 new Point(90, 60), new Point(60, 90), // 제어점 new Point(90, 90), // 끝점및시작점 new Point(120, 90), new Point(90, 120), // 제어점 new Point(120, 120), // 끝점및시작점 new Point(150, 120), new Point(120, 150), // 제어점 new Point(150, 150), // 끝점 }; g.drawbeziers(pens.deeppink, pts); [40/50]
DrawString() 메소드 문자열을그리기위해서사용되는메소드 MeasureString() 메소드 어떤문자열을그리는데필요한영역의크기를계산해주는메소드 [41/50]
폼에문자열을출력하기위해서사용하는메소드. 형식 public void DrawString(string s, Font f, Brush b, int x, int y); public void DrawString(string s, Font f, Brush b, Rectangle r); public void DrawString(string s, Font f, Brush b, Rectangle r, StringFormat sf); [42/50]
예제 Font f = new Font("Tahoma", 15); g.drawstring("hello World!", f, Brushes.Black, 10, 10); f.dispose(); string s = "This string is long enough to wrap."; s += " With a 250px-width rectangle, "; s += "it requires six lines to display the string in its entirety."; Font f = new Font("Tahoma", 15); Rectangle r = new Rectangle(10, 10, 250, 150); g.drawrectangle(pens.black, r); g.drawstring(s, f, Brushes.Black, r); f.dispose(); [43/50]
StringFormat 클래스의주요프로퍼티 Alignment: 수평정렧. LineAlignment: 수직정렧. StringAlignment 열거형상수 Center: 가운데정렧. Near: 수평정렧인경우에왼쪽정렧. 수직정렧인경우에위쪽정렧. Far: 수평정렧인경우에오른쪽정렧. 수직정렧인경우에아래쪽정렧. 예제 string s = "This is a long string that will wrap. "; s += "It will be centered both vertically and horizontally."; Font f = new Font("Tahoma", 15); StringFormat sf = new StringFormat(); sf.alignment = StringAlignment.Center; sf.linealignment = StringAlignment.Center; // 수평정렧 g.drawstring(s, f, Brushes.Black, ClientRectangle, sf); f.dispose(); // 수직정렧 [44/50]
출력하는문자열을수용하는데필요한영역의크기를측정하기위해서사용하는메소드. 형식 public SizeF MeasureString(string s, Font f); public SizeF MeasureString(string s, Font f, int width); 예제 string s = "Hello World!"; Font f = new Font("Tahoma", 15); SizeF sf = g.measurestring(s, f); g.drawstring(s, f, Brushes.Black, 50, 50); g.drawrectangle(pens.black, 50, 50, sf.width, sf.height); f.dispose(); [45/50]
예제 string s = "This string is long enough to wrap. "; // 출력할문자열 s += "We'll use a 15pt font, and assume "; s += "the text string must fit into a width of 250 pixels. "; Font f = new Font("Tahoma", 15); // 서체는타호마, 글자크기는 15. SizeF sf = g.measurestring(s, f, 250); // 영역의크기를측정한다. RectangleF rf = new RectangleF(20, 20, sf.width, sf.height); Rectangle r = Rectangle.Ceiling(rf); // 올림으로변홖 g.drawstring(s, f, Brushes.Black, r); // 문자열을출력한다. g.drawrectangle(pens.black, r); // 외곽선을그린다. f.dispose(); [46/50]
형식 public void DrawImage(Image, int, int); public void DrawImage(Image, Point); public void DrawImage(Image, int, int, int, int); public void DrawImage(Image, Rectangle); public void DrawImage(Image, Point[]); public void DrawImage(Image, Rectangle, Rectangle, GraphicsUnit); [47/50]
Image img = new Bitmap("plac.jpg"); g.drawimage(img, 0, 0); // g.drawimage(img, new Point(0, 0)); Image img = new Bitmap("plac.jpg"); g.drawimage(img, ClientRectangle); [48/50]
Image img = new Bitmap("plac.jpg"); Point[] pts = { new Point(0, 0), // 원본의왼쪽상단모서리의대상위치 new Point(200, 0), // 원본의오른쪽상단모서리의대상위치 new Point(50, 100) // 원본의왼쪽하단모서리의대상위치 }; g.drawimage(img, pts); Point[] pts = { }; new Point(0, 0), new Point(200, 0), new Point(50, 100) Point[] pts = { }; new Point(100, 0), new Point(100, 200), new Point(0, 0) [49/50]
Image img = new Bitmap("plac.jpg"); Rectangle sr = new Rectangle(0, 0, 80, 30); // 원본의부분적인크기 Rectangle dr = new Rectangle(0, 0, 200, 100); // 그려질영역크기 g.drawimage(img, dr, sr, GraphicsUnit.Pixel); [50/50]