Практическое руководство. Создание непрямоугольных форм в Windows Forms

Обновлен: Ноябрь 2007

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

6k15y9et.alert_note(ru-ru,VS.90).gifПримечание.

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

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

Процесс создания непрямоугольной формы состоит из трех этапов.

  • Создание точечного рисунка, который будет играть роль поверхности формы. (Фактически нужно будет "вырезать" желаемые очертания формы из прямоугольника).

  • Создание проекта приложения Windows и задание его свойств; цель данного этапа — избавиться от строки заголовка и использовать точечный рисунок в качестве фона формы.

  • Написание кода, который заново создаст функциональные возможности, которые предоставляет строка заголовка, такие как перемещение формы и ее закрытие.

6k15y9et.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или версии среды. Чтобы изменить настройки, в меню Сервис выберите команду Импорт и экспорт параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Создание сложной формы

  1. Создайте одноцветный точечный рисунок непрямоугольной формы с фоном другого цвета. Используйте любую программу для рисования. Нарисованная фигура в конечном итоге превратится в форму, поэтому следует задать размеры, достаточно большие для дальнейшего использования.

    6k15y9et.alert_note(ru-ru,VS.90).gifПримечание.

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

  2. В Visual Studio создайте новый проект "Приложение Windows". Дополнительные сведения см. в разделе Практическое руководство. Создание проекта приложения Windows.

  3. В окне Свойства выполните следующие действия.

    • Для свойства FormBorderStyle установите значение None.

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

    • В качестве значения свойства BackgroundImage формы задайте ранее созданный точечный рисунок. Добавлять файл в систему работы с проектами не требуется; это будет сделано автоматически при выборе этого файла в качестве фонового рисунка.

      С помощью этого свойства точечный рисунок становится фоном формы. (При использовании этого свойства вместе со свойством TransparencyKey, представленным далее, оно определяет очертания формы.)

    • В качестве значения свойства TransparencyKey выберите фоновый цвет точечного рисунка.

      Это свойство передает сведения о том, какие части формы должны быть прозрачными.

      6k15y9et.alert_note(ru-ru,VS.90).gifПримечание.

      При использовании мониторов, цветовая палитра которых превышает 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();
    }
    
    6k15y9et.alert_note(ru-ru,VS.90).gifПримечание 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;
        }    
    }
    
    6k15y9et.alert_note(ru-ru,VS.90).gifПримечание 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;
        }
    }
    
    6k15y9et.alert_note(ru-ru,VS.90).gifПримечание 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;
        }
    }
    

См. также

Задачи

Практическое руководство. Создание фигурной формы Windows Forms

Практическое руководство. Создание прозрачных форм Windows Forms

Ссылки

Общие сведения о Windows Forms