방법: 사각형이 아닌 Windows Forms 만들기

이전에는 사각형이 아닌 폼을 만들려면 API 호출과 많은 프로그래밍 작업이 요구되어 시간이 많이 걸리고 작업량도 많았지만 이제는 그렇지 않습니다.

참고

이 프로세스에는 관련된 하드웨어에 대한 대량의 그래픽 처리 작업이 포함됩니다. 따라서 컴퓨터마다 사용된 메모리 및 그래픽 카드에 따라 다른 방식으로 작업이 수행됩니다. 응용 프로그램에 사용자 지정 그리기가 포함된 경우에는 사용자에게 배포하기 전에 항상 다양한 비디오 카드에서 테스트하여 성능이 적절한지 확인하십시오.

사각형이 아닌 폼을 만들 때는 두 단계를 거쳐야 합니다. 즉, 해당 모양의 폼을 만드는 단계와 해당 폼을 이동하고 닫을 수 있도록 해 주는 프로그래밍 논리를 코딩하는 단계가 필요합니다. 두 번째 단계가 필요한 이유는 사용자 지정 모양을 가진 폼에는 제목 표시줄이 없고 제목 표시줄에서 기본적으로 제공하는 화면에서의 폼 이동 및 닫기 등의 기능도 없기 때문입니다. 따라서 이러한 기능을 복제하는 코드를 작성해야 합니다. 사각형이 아닌 모양의 폼이나 컨트롤을 만드는 방법에 대한 자세한 내용은 방법: 모양을 가진 Windows Form 만들기를 참조하십시오.

사각형이 아닌 폼을 만드는 작업은 다음의 세 단계로 이루어집니다.

  • 폼의 외관으로 사용될 비트맵을 만듭니다. 사각형에서 원하는 폼의 모양대로 "잘라내어" 쉽게 만들 수 있습니다.

  • Windows 응용 프로그램 프로젝트를 만든 다음 제목 표시줄을 제거하고 비트맵을 폼의 배경으로 사용하도록 프로젝트 속성을 설정합니다.

  • 폼 이동 및 닫기 등 제목 표시줄이 제공하는 기능을 다시 만드는 코드를 입력합니다.

참고

표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업을 참조하십시오.

모양을 가진 폼을 만들려면

  1. 배경색은 별도로 하고 한 가지 색으로 된 사각형이 아닌 비트맵을 만듭니다. 원하는 그리기 프로그램을 사용합니다. 지금 그리는 모양이 폼으로 사용되므로 사용하기에 충분한 크기로 그립니다.

    참고

    배경색은 나중에 중요하게 사용하게 되므로 파랑과 같이 기억하기 쉬운 배경색을 선택합니다.

  2. Visual Studio에서 새 Windows 응용 프로그램 프로젝트를 만듭니다. 자세한 내용은 방법: 새 Windows Forms 응용 프로그램 프로젝트 만들기를 참조하십시오.

  3. 속성 창에서 다음을 수행합니다.

    • FormBorderStyle 속성을 None으로 설정합니다.

      이렇게 하면 폼에서 제목 표시줄이 제거됩니다. 또한 폼 닫기 및 폼 이동 등의 제목 표시줄이 제공하는 기능도 제거됩니다. 그러나 아래 코드에서 이 기능을 처리합니다.

    • 폼의 BackgroundImage 속성을 앞에서 만든 비트맵 파일로 설정합니다. 프로젝트 시스템에 파일을 추가할 필요는 없습니다. 파일을 배경 이미지로 지정하면 자동으로 해당 파일이 프로젝트 시스템에 추가됩니다.

      이 속성은 비트맵 이미지를 폼의 배경으로 설정합니다. 이 속성을 아래에 지정된 TransparencyKey 속성과 함께 지정할 경우 이 속성은 폼의 모양을 정의합니다.

    • TransparencyKey 속성을 비트맵 파일의 배경색으로 설정합니다.

      이 속성은 폼에서 투명하게 표시하려는 부분을 응용 프로그램에 알립니다.

      참고

      색상 수가 24비트보다 큰 값으로 설정된 모니터에서는 TransparencyKey 속성을 설정하더라도 폼의 특정 부분이 투명하게 표시되지 않는 문제가 발생할 수 있습니다. 이 문제를 방지하려면 디스플레이 제어판에서 모니터의 색상 수를 24비트 미만으로 설정해야 합니다. 이러한 투명도를 사용하는 응용 프로그램을 개발할 때는 이러한 문제가 발생할 수 있다는 것을 사용자에게 알려야 합니다.

폼을 닫는 코드를 작성하려면

  1. 폼에 Button 컨트롤을 추가합니다. 자세한 내용은 방법: Windows Forms에 컨트롤 추가를 참조하십시오.

  2. 사용자가 이 컨트롤의 Close 메서드를 호출하여 폼을 닫을 수 있도록 해 주는 코드를 추가합니다.

    다음 예제에서는 사용자가 클릭하면 폼을 닫는 단추를 추가하는 방법을 보여 줍니다.

    Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
       Me.Close()
    End Sub
    
    private void button1_Click(object sender, System.EventArgs e)
    {
       this.Close();
    }
    
    C# 정보C# 정보

    이벤트 처리기를 사용하기 위한 코드를 추가하십시오. 이 예제 코드의 경우 다음과 같은 형태가 됩니다.

    this.Button1.Click += new System.EventHandler(this.button1_Click);
    

폼을 이동하는 코드를 작성하려면(옵션)

  1. 폼을 끌면 폼을 이동하는 프로시저를 만듭니다. 다음과 유사한 코드를 입력하여 새 Point 개체를 만듭니다. 이 개체는 폼 이동 방법을 계산할 때 변수로 사용됩니다. isMouseDown 필드는 사용자가 마우스 단추를 누르고 있는지 여부를 추적하는 데 사용됩니다. 폼은 마우스 단추를 누르고 있을 때만 이동되어야 합니다.

    Private mouseOffset As Point
    Private isMouseDown As Boolean = False
    
    private Point mouseOffset;
    private bool isMouseDown = false;
    
  2. 폼의 MouseDown 이벤트에 대한 이벤트 처리기를 만듭니다. 사용자가 폼의 아무 위치나 클릭하여 끌 수 있도록 하는 코드를 처리기에 추가합니다. 이벤트 처리기를 만드는 방법에 대한 자세한 내용은 방법: 디자이너를 사용하여 이벤트 처리기 만들기를 참조하십시오.

    다음과 유사한 코드를 입력하여 마우스 포인터의 현재 위치를 기준으로 mouseOffset 변수에 좌표를 할당합니다. 아래 코드에서는 오프셋 위치가 시스템 정보인 테두리 크기(FrameBorderSize.Width)와 제목 표시줄 높이(CaptionHeight)를 사용하여 계산됩니다. 클라이언트 영역을 사용하여 계산되는 측정값도 있고 화면 좌표를 사용하여 계산되는 측정값도 있으므로 오프셋을 테스트할 때는 이러한 점을 고려해야 합니다. 이 경우에는 오프셋이 테두리 너비에 캡션 높이를 더하고 여기에 폼의 클라이언트 영역에 대한 오프셋을 더한 값이 됩니다.

    Private Sub Form1_MouseDown(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseDown
        Dim xOffset As Integer
        Dim yOffset As Integer
    
        If e.Button = MouseButtons.Left Then
            xOffset = -e.X - SystemInformation.FrameBorderSize.Width
            yOffset = -e.Y - SystemInformation.CaptionHeight - _
                    SystemInformation.FrameBorderSize.Height
            mouseOffset = New Point(xOffset, yOffset)
            isMouseDown = True
        End If
    End Sub
    
    private void Form1_MouseDown(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        int xOffset;
        int yOffset;
    
        if (e.Button == MouseButtons.Left) 
        {
            xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
            yOffset = -e.Y - SystemInformation.CaptionHeight - 
                SystemInformation.FrameBorderSize.Height;
            mouseOffset = new Point(xOffset, yOffset);
            isMouseDown = true;
        }    
    }
    
    C# 정보C# 정보

    이벤트 처리기를 사용하기 위한 코드를 추가하십시오. 이 예제 코드의 경우 다음과 같은 형태가 됩니다.

    this.MouseDown += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseDown);
    
  3. 폼의 MouseMove 이벤트에 대한 이벤트 처리기를 만듭니다.

    다음과 유사한 코드를 입력합니다. 마우스 왼쪽 단추를 클릭하고 마우스를 끌면 폼의 Location 속성이 새 위치로 설정됩니다.

    Private Sub Form1_MouseMove(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseMove
        If isMouseDown Then
            Dim mousePos As Point = Control.MousePosition
            mousePos.Offset(mouseOffset.X, mouseOffset.Y)
            Location = mousePos
        End If
    End Sub
    
    private void Form1_MouseMove(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        if (isMouseDown) 
        {
            Point mousePos = Control.MousePosition;
            mousePos.Offset(mouseOffset.X, mouseOffset.Y);
            Location = mousePos;
        }
    }
    
    C# 정보C# 정보

    이벤트 처리기를 사용하기 위한 코드를 추가하십시오. 이 예제 코드의 경우 다음과 같은 형태가 됩니다.

    this.MouseMove += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseMove);
    
  4. 폼의 MouseUp 이벤트에 대한 이벤트 처리기를 만듭니다. 다음과 유사한 코드를 입력합니다.

    Private Sub Form1_MouseUp(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        ' Changes the isMouseDown field so that the form does
        ' not move unless the user is pressing the left mouse button.
        If e.Button = MouseButtons.Left Then
            isMouseDown = False
        End If
    End Sub
    
    private void Form1_MouseUp(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        // Changes the isMouseDown field so that the form does
        // not move unless the user is pressing the left mouse button.
        if (e.Button == MouseButtons.Left) 
        {
            isMouseDown = false;
        }
    }
    
    C# 정보C# 정보

    이벤트 처리기를 사용하기 위한 코드를 추가하십시오. 이 예제 코드의 경우 다음과 같은 형태가 됩니다.

    this.MouseUp += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseUp);
    

참고 항목

작업

방법: 모양을 가진 Windows Form 만들기

방법: 투명한 Windows Forms 만들기

참조

Windows Forms 개요