>  기사  >  백엔드 개발  >  C# GDI+ 프로그래밍 (1)

C# GDI+ 프로그래밍 (1)

高洛峰
高洛峰원래의
2016-12-17 10:20:021059검색

C++이지만 항상 유사점이 있습니다.

창이 새로 고쳐지면 Paint 이벤트가 생성되므로 이 이벤트에 핸들러 함수를 추가합니다. 그런 다음 이 함수에서 그래프를 그립니다. 이렇게 하면 그려진 그림이 새로 고쳐지지 않고

항상 표시될 수 있습니다. Paint 이벤트에 해당하는 대리자는 다음과 같습니다. public 대리자 void PaintEventHandler(object sender, PaintEventArgs e);

가장 간단한 그리기부터 시작하여 창에 선을 그립니다. (WindowsForms 애플리케이션 생성)

public 부분 클래스 Form1: Form
{
public Form1()
InitializeComponent() 🎜> //Paint 이벤트 핸들러 함수 추가
this. Paint += formPaint;

}

private void formPaint(Object sender, PaintEventArgs e)
{
그래프 ics 그래픽 = e.Graphics;
//브러시, 녹색, 2픽셀 너비
Pen Pen = New Pen (color.fromargb (0,255,0), 2)
// 선을 그립니다. 두 점은 0,0과 100,100입니다.
DrawLine (pen, new Point (0) ,0), 새 포인트(100,100))를 완료합니다.

예 2: 채워진 직사각형

그래픽 그래픽 = e.Graphics;
//파란색 브러시

SolidBrush 브러시 = new SolidBrush(Color.FromArgb(0, 0 , 255 ));

//사각형

Rectangle ect = new Rectangle(0, 0, 100, 100);

//사각형 채우기

Graphics.FillRectangle(brush, ret)


예시 3: png 그림 그리기(PNG는 투명한 그림을 표시할 수 있기 때문에 사용되며 GIF 그림에도 이 효과가 있습니다.)

private void formPaint(Object sender, PaintEventArgs e)
{
            그래픽 그래픽 = e.Graphics; 그림은 시작 위치를 보여줍니다.
         Point strPoint=new Point(50,50) 🎜> Rectangle ect=new Rectangle(50,50,100,100);

graphic.DrawImage(img, ret );

}

DrawString을 사용하여 텍스트 표시

Grahpics 클래스의 DrawString 여러 오버로드가 있으며 일부 오버로드는 사각형 내에 문자열을 표시하고 일부는 특정 표시 형식을 사용합니다. 여기서는 자세히 설명하지 않겠습니다.

더 일반적으로 사용되는 것들만 논의하겠습니다.

예제를 보면 키보드 입력 문자 이벤트를 처리하고, 입력된 문자를 창에 표시해 줍니다. 다음과 같습니다:

공개 부분 클래스 Form1: Form
{
public static String strText = "";
public Form1()
Component() 초기화;
this.Paint += formPaint;
this.KeyPress += formKeyPress;

}
private void formPaint(Object sender, PaintEventArgs e)
{
Graphics Graphics = e.Graphics;
/ /브러시 만들기 }
private void formKeyPress(object sender, KeyPressEventArgs e)
{
strText += e.KeyChar;
//전체 창 새로 고침
this.Invalidate();
}
}

그래픽 s.DrawString(strText,font,brush, new Point(100, 100))도 있습니다. 이는 단지 텍스트 표시의 시작 위치를 지정합니다.

표시 형식에 대한 다음 예를 참조하세요.

//직사각형 내에 문자열 표시
StringFormat strFormat = new StringFormat(StringFormatFlags.DirectionRightToLeft);
Graphics.DrawString( strText,font,brush,this.ClientRectangle,strFormat);

StringFormatFlags는 열거형 유형으로 각 열거형 멤버가 어떤 형식을 나타내는지 하나씩 확인해 보세요.

다음으로 살펴보겠습니다. Form 클래스의 기본 이벤트 처리 방법과 추가한 이벤트 처리 방법 사이에는 어떤 관계가 있나요?

예: 마우스 왼쪽 버튼 이벤트 처리

공개 부분 클래스 Form1 : Form
{
private Color prBackColor;
public Form1()
InitializeComponent();
                          //창의 기본 배경색
prBackColor = this.BackColor;
                                                                                                                                                                     // 마우스 버튼 누르기 이벤트 처리 방법
private void formMouseDown(object sender, MouseEventArgs e)
// 마우스 오른쪽 버튼을 누른 경우
if (e .Button == MouseButtons.Right)
           {
Form1 form1 = (Form1)sender;
//배경색 변경
form1.BackColor = Color.FromArgb(0, 255, 0);
}
                                                                                                                    시작(해제) 이벤트 처리 방법
private void formMouseUp(object sender, MouseEventArgs e)
{
if(e.Button==MouseButtons.Right)
{
Form1 form1 = ( Form1)sender; 기본 이벤트 처리 방법이 있으며 이러한 방법은 가상 방법이므로

protected virtual void OnMouseDown(MouseEventArgs e); OnMouseUp(MouseEventArgs e);

이렇게 하면 이벤트 처리 메서드를 추가하지 않고도 마우스 이벤트를 처리할 수 있으며, 상위 클래스의 기본 이벤트 처리 메서드를 재정의하여 위의 예제를 구현할 수 있습니다.

MSDN을 확인하면 이러한 기본 이벤트 처리 방법을 호출하면 해당 이벤트가 트리거될 수 있음을 알 수 있습니다. 예를 들어 OnMouseDown을 호출하면 추가한 이벤트 처리 메서드(대리자)가 실제로 실행되는 마우스 왼쪽 버튼 누르기 이벤트를 트리거할 수 있습니다. 그리고 우리는 위임 방법을 추가하기 위해 "+="를 사용하기 때문에 여전히 멀티캐스트 위임을 사용합니다.

이 경우 OnMouseDown을 재정의하는 경우 해당 기본 클래스의 OnMouseDown 메서드를 호출해야 합니다.

그렇지 않으면 추가한 MouseDown 메서드가 실행되지 않습니다(있는 경우)

이제 위 내용을 알았으니 실제적인 예를 들어보겠습니다. 배경을 그리는 OnPaintBackground 메서드를 재정의합니다.

public 부분 클래스 Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//OnPaintBackground 메서드 재정의
protected override void OnPaintBackground (PaintEventArgs e)
                                                                                             > 러시, This.ClientRectangle)
// 그리기 원 Pen Pen = New Pen (Color.FromArgb(0, 255, 0),3);
e.Graphics.DrawEllipse(pen, this.ClientRectangle);
}
}

TextureBursh 그림 브러시

그림을 사용하여 직사각형, 원 등의 도형을 채울 수 있습니다. 이미지가 충분히 크지 않으면 타일로 표시됩니다.

예:

private void formPaint(Object sender, PaintEventArgs e)

{

Graphics Graphics = e.Graphics;

//그림 만들기 Brush

Rectangle ect = new Rectangle(10, 10, 70, 70);

TextureBrush 브러시 = new TextureBrush(Image.FromFile("d:\Image\345.jpg"),ect);

Graphics.FillEllipse( 브러시 , 0, 0, 200, 200);

       }

생성자의 마지막 매개변수인 ect는 그림에서 채울 부분을 나타내고, 10,10은 그림의 시작 위치를 나타냅니다(왼쪽 위). 모서리), 70, 70은 너비와 높이를 나타냅니다. 그림의 원래 범위를 초과하지 않도록 주의하십시오. 그림 전체가 채워지면 ret를 지정할 필요가 없습니다. 생성자에 매개변수만 입력하면 됩니다.

LinearGradientBursh 선형 그래디언트 브러시(이 클래스는 System.드로잉.드로잉2D 네임스페이스에 있음)

LinearGradientBursh 클래스에는 2개의 점과 2개의 색상으로 구성된 4개의 매개 변수가 있는 생성자 오버로드가 있습니다. .

이 네 가지 매개변수는 시작점의 색상과 종료점의 색상을 지정합니다. 그리고 위치.

다음 예를 살펴보세요.

public 부분 클래스 Form1: Form

{

public Form1()

{

InitializeComponent();

this .Paint += formPaint;

}
private void formPaint(Object sender, PaintEventArgs e)
{
Graphics Graphics = e.Graphics;
Linear GradientBrush lineBrush = new LinearGradientBrush(new Point(0, 0), new 포인트(50, 0),
                                                                                   . 전체 창
그래픽.FillRectangle( lineBrush,this .ClientRectangle);
}
}

시작점은 0,0이고 끝점은 0,50입니다. 흰색에서 검정색까지의 그라데이션 색상 세그먼트입니다. 50을 넘는 부분은 다시 희미해지기 시작합니다.

PS를 사용할 때와 마찬가지로 그라데이션 색상은 흰색에서 검정색으로 한 뒤 선을 잡아당깁니다. 시작점은 0,0이고 끝점은 0,50입니다.

그럼 이 속성이 포함된 그라디언트 브러시를 사용하여 창에 직사각형을 그리면 어떻게 보일까요? 위의 렌더링을 보면 알 수 있습니다.

예: Graphics.FillRectangle(lineBrush, 0, 0, 100, 100);

이 직사각형의 브러시 채우기는 첫 번째 효과의 해당 직사각형 영역과 동일합니다. .

시작점과 끝점의 값을 바꿔봐도 알 수 있습니다. 어떤 방식으로 채워지나요?

예를 들어 시작점은 0,0으로 변경되고 끝점은 50,50으로 변경됩니다.

private void formPaint(Object sender, PaintEventArgs e)

{
Graphics = e.Graphics;
LineBrush = new LinearGradientBrush dientBrush(new Point(0, 0), new Point( 50 , 50),
                            Color.FromArgb(255, 255, 255), Color.FromArgb(0, 0, 0));
                                전체 창 채우기
graphics.FillRectangle(lineBrush, this.ClientRectangle) ;
펜 펜 = new Pen(Color.FromArgb(0, 255,0));
graphic.DrawRectangle(pen, 0, 0, 50, 50);
}

내부에 채워진 모양을 그리면 위의 규칙에 따라 표시됩니다. 이 창은 최대화 기능을 비활성화하지 않으며 추가 관찰을 위해 창 크기를 변경할 수 있습니다.

다중 색상 그라데이션

LinearGradientBrush 클래스에는 여러 색상 그라데이션을 지정할 수 있는 InterpolationColors 속성 멤버가 있습니다. 이 멤버는 이전 그라데이션과 마찬가지로 두 가지 색상으로만 제한될 수 있습니다. Gradient는 InterpolationColors를 사용한 후 빨간색에서 녹색, 녹색에서 파란색으로의 그라데이션과 같은 다양한 그라데이션을 사용할 수 있습니다.

예 보기:

private void formPaint(Object sender, PaintEventArgs e)
{
//ColorBlend 객체를 생성하고 여러 색상 그라데이션 정보 지정
ColorBlend color_blend=new ColorBlend();
// 몇 가지 색상
            color_blend.Colors=new Color[]{Color.Red,Color.Green,Color.Blue};
                                               ~ color_blend.Colors=새로운 색상[]{Color.Red,Color.Green, 색상. Blue};                  3f,2/3f,3/3f};
Rectangle ect=new Rectangle(0,0,200,100);
//그라디언트 브러시 만들기
LinearGradientBrush 브러시=
new LinearGradientBrush(new Point(0 ,0),new Point(200,0),Color.White,Color.White);

 brush.InterpolationColors=color_blend;
 e.Graphics.FillRectangle(brush,Rect);
}

color_blend.Colors 배열은 색상 그라데이션 수를 지정합니다. 예를 들어 위의 경우 빨간색, 녹색, 파란색이면 그라데이션은 빨간색에서 녹색으로, 그라데이션은 다음과 같아야 합니다. 그런 다음 녹색에서 파란색으로 그라데이션됩니다.

color_blend.Positions는 위의 직사각형의 너비를 전체 1로 간주하면 0/3f에서 2/3f까지, 즉 빨간색에서 녹색으로의 그라데이션이 완성됩니다. 이

범위 내에서 완성되면 녹색에서 파란색으로의 그라데이션 범위는 2/3f ~ 3/3f입니다.

각각 절반씩 공유하려면 color_blend.Positions=new float[]{0/2f,1/2f,2/2f};



더 많은 C# GDI+ 프로그래밍(1) 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.