Модификация приложения F #: создание форм и рисование объектов на форме



 

F# является . NET -языком и ему доступно всё то что можно реализовать и на C#. Например, попробуем поработать с графикой GDI +.

 

Следующий блок кода будет создавать простую форму Windows Forms и рисовать в ней два объекта. Для выхода с формы будет предусмотрена одна кнопка «Выход» (приложение не будет закрыто).

 

// Создание формы Windows Forms: Рисование объектов на форме

Console.Title <- "Различные примеры (F#) :: Рисование объектов на форме"

open System.Collections.Generic

open System.Windows.Forms

open System.ComponentModel

open System.Drawing

let graphicForm = new Form(Text = "Различные примеры (F#) :: Рисование объектов на форме", AutoScaleDimensions = new System.Drawing.SizeF(60.0F, 13.0F), ClientSize = new System.Drawing.Size(500, 200), StartPosition = FormStartPosition.CenterScreen)

// Создаём элементы управления

let exitButton = new Button(Text = "Выход", Location = new System.Drawing.Point(415, 167), Size = new Size(75, 23))

// Событие нажатия на кнопку "Выход"

exitButton.Click.Add(fun quit -> graphicForm.Close())

// Событие прорисовки элементов формы

graphicForm.Paint.Add(fun draw ->

let array = [|new Point(100, 150);new Point(250, 10);new Point(400, 150)|]

// Перо рисования (цвет: синий, толщина 10 пикселей)

let pen = new Pen(Color.Blue, Width = 10.0f)

// Создаём заливку

let brush = new SolidBrush(Color.LightGreen)

// Рисуем треугольник на основе массива точек

draw.Graphics.DrawPolygon(pen, array)

// Заполняем треугольник

draw.Graphics.FillPolygon(brush, array)

// Рисуем эллипс

draw.Graphics.DrawEllipse(pen, 10.0f, 10.0f, 100.0f, 100.0f)

// Заполняем эллипс

draw.Graphics.FillEllipse(brush, 10.0f, 10.0f, 100.0f, 100.0f)) 

// Добавляем на форму кнопку "Выход"

graphicForm.Controls.Add(exitButton)  

// Запускаем новую форму

Application.Run(graphicForm)

printfn "\t\t\tНажмите клавишу Enter для продолжения..."

Console.ReadKey()

Console.Clear()

 

Компилируем приложение (Debug) и запускаем. Как только доберёмся до этой итерации в приложении, увидим открывшуюся форму и два нарисованных на форме объекта. Для выхода с формы жмём кнопку «Выход»:

 

Рис. 4. 1. Результат работы приложения F#: форма «Рисование объектов на форме»

 

Следующий пример немного содержательнее. На форме будут создано три кнопки. «Выход», «Загрузить» и «Печать». Вторая кнопка: вызывает стандартный диалог открытия файлов (изображений двух типов: JPEG и GIF). После выбора файла, изображения, оно будет отмасштабировано и помещено в PictureBox на форме. Нажатие на кнопку «Печать» отправит рисунок печататься на первом же возможном принтере (если тот подключен к ПК). Также, если на ПК установлено Microsoft Office 2010 и OneNote 2010 в комплекте с «офисом», нажатие кнопки «Печать» вызовет это приложение. Также, код изменяет курсор на форме на один из стандартных (крест), но можно использовать и свой (закомментированный код). Весь код такой:

 

// Создание формы Windows Forms: Печать выбранного рисунка

Console.Title <- "Различные примеры (F#) :: Печать выбранного рисунка"

open System.Drawing.Printing

open System.Drawing.Imaging

let imageForm = new Form(Text = "Различные примеры (F#) :: Печать выбранного рисунка", AutoScaleDimensions = new System.Drawing.SizeF(60.0F, 13.0F), ClientSize = new System.Drawing.Size(500, 250), StartPosition = FormStartPosition.CenterScreen)

// Создаём элементы управления

let exitButton2 = new Button(Text = "Выход", Location=new System.Drawing.Point(400, 210))

let loadButton2 = new Button(Text = "Загрузить", Location=new System.Drawing.Point(320, 210))

let printButton2 = new Button(Text = "Печать", Location=new System.Drawing.Point(240, 210))

let pictueBox2 = new PictureBox(SizeMode = PictureBoxSizeMode.StretchImage, Location = new System.Drawing.Point(20, 20), BorderStyle = BorderStyle.FixedSingle, Size = new System.Drawing.Size(100, 100))

let label2 = new Label(AutoSize = true, Location = new System.Drawing.Point(0, 120))

let openFileDialog2 = new OpenFileDialog()

let draw2 = imageForm.CreateGraphics()

let printDocument2 = new System.Drawing.Printing.PrintDocument()

imageForm.Controls.Add(pictueBox2)

imageForm.Controls.Add(loadButton2)

imageForm.Controls.Add(label2)

imageForm.Controls.Add(printButton2)

imageForm.Controls.Add(exitButton2)

// События нажатия кнопок

printButton2.Click.Add(fun startprint2 -> printDocument2.Print())

 

loadButton2.Click.Add(fun load2 ->

openFileDialog2.Filter <- "Изображения JPEG (*.jpg,*.jpeg)|*.jpg;*.jpeg|Изображения GIF (*.gif)|*.gif"

openFileDialog2.Title <- "Различные примеры (F#) :: Выбор файла изображения"

if (openFileDialog2.ShowDialog() = DialogResult.OK) then

// Создаём растровый рисунок и снимаем поворот и отражение (если есть)

let bitmap2 = new System.Drawing.Bitmap(openFileDialog2.FileName)

bitmap2.RotateFlip(RotateFlipType.RotateNoneFlipNone)

// Помещаем выбранное изображение в PictureBox

pictueBox2.Image <- bitmap2

// Отображаем в Label асболютный путь до изображения

label2.Text <- "\tИмя файла изображения:\n" + Convert.ToString(Convert.ToChar(32)) + (openFileDialog2.FileName))

// Вызываем страницу печати                     

printDocument2.PrintPage.Add(fun printData2 -> draw2.DrawImage(pictueBox2.Image, 10, 10))

 

exitButton2.Click.Add(fun quit2 -> imageForm.Close())

// Создание своего курсора (добавленного как ресурс в корень проекта)

// let customCursor2 = new System.Windows.Forms.Cursor("/Pointer.cur")

// imageForm.MouseHover.Add(fun custom2 -> imageForm.Cursor <- customCursor2)

imageForm.MouseHover.Add(fun Cross2 -> imageForm.Cursor <- Cursors.Cross)

[<STAThreadAttribute>]

Application.Run(imageForm)

printfn "\t\t\tНажмите клавишу Enter для продолжения..."

Console.ReadKey()

Console.Clear()

 

Компилируем приложение (Debug) и запускаем. Жмём «Загрузить», выбираем любое изображение с нужным расширением, затем, если есть принтер жмём на «Печать»:

 

Рис. 4. 2. Результат работы приложения F#: форма «Печать выбранного рисунка»

 

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

 

// Создание формы Windows Forms: Рисование мышкой

Console.Title <- "Различные примеры (F#) :: Рисование мышкой"

open System.Drawing.Drawing2D

let drawingForm = new Form(Text = "Различные примеры (F#) :: Рисование мышкой", AutoScaleDimensions = new System.Drawing.SizeF(60.0F, 13.0F), ClientSize = new System.Drawing.Size(500, 250), StartPosition = FormStartPosition.CenterScreen)

let exitButton3 = new Button(Text = "Выход", Location = new System.Drawing.Point(400, 210))

let eraseButton3 = new Button(Text = "Очистить", Location = new System.Drawing.Point(320, 210))

let colorButton3 = new Button(Text = "Цвет пера", Location = new System.Drawing.Point(240, 210))

drawingForm.Controls.Add(exitButton3)

drawingForm.Controls.Add(eraseButton3)

drawingForm.Controls.Add(colorButton3)

// Создаём диалог выбора цвета

let colorDialog3 = new ColorDialog()

// Создаём объект ColorBlend

let mutable color3 = new ColorBlend()

// Инициализируем объекты рисования

let createGraphics3 = drawingForm.CreateGraphics()

createGraphics3.SmoothingMode<-SmoothingMode.HighQuality

drawingForm.Load.Add(fun background3 ->

// Устанавливаем цвет заливки по умолчанию: Indigo

color3.Colors <- [|Color.Indigo|])

// Событие перемещения мыши на форме

drawingForm.MouseMove.Add(fun trail->

// Когда мышка двигается и левая кнопка нажата

if (trail.Button = System.Windows.Forms.MouseButtons.Left) then

//Рисуем объект с выбранным цветом из диалога выбора цвета (или цвета по умолчанию)

createGraphics3.FillRectangle(new SolidBrush(color3.Colors.[0]),new Rectangle(trail.X,trail.Y,5,5)))

// Событие нажатия кнопки "Очистить", возвращаем цвет формы и стираем всё на форме

eraseButton3.Click.Add(fun erase3-> createGraphics3.Clear(drawingForm.BackColor))

exitButton3.Click.Add(fun quit3 -> drawingForm.Close())

colorButton3.Click.Add(fun colors3 ->

// Вызываем диалог выбора цвета

if colorDialog3.ShowDialog() = DialogResult.OK then

// Сохраняем выбранный цвет

color3.Colors<-[|colorDialog3.Color|])

Application.Run(drawingForm)

printfn "\t\t\tНажмите клавишу Enter для продолжения..."

Console.ReadKey()

Console.Clear()

 

Компилируем приложение (Debug) и запускаем. Зажимаем левую кнопку мыши на форме, рисуем, выбираем другой текст, рисуем, стираем, выходим:

 

Рис. 4. 3. Результат работы приложения F#: форма «Рисование мышкой»

 


Дата добавления: 2019-09-13; просмотров: 198; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!