2014-01-19 5 views
1

Я хотел бы напечатать форму с расчетными данными, Grafs, DataGrids ... У меня возникли проблемы, перевод C# код для печати на F # код:Как я могу напечатать форму с помощью F #

private void CaptureScreen() 
{ 
    Graphics myGraphics = this.CreateGraphics(); 
    Size s = this.Size; 
    memoryImage = new Bitmap(s.Width, s.Height, myGraphics); 
    Graphics memoryGraphics = Graphics.FromImage(memoryImage); 
    memoryGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s); 
} 

private void printDocument1_PrintPage(System.Object sender, 
     System.Drawing.Printing.PrintPageEventArgs e) 
{ 
    e.Graphics.DrawImage(memoryImage, 0, 0); 
} 

Я не могу правильно связать PrintDocument, PrintDialog и PrintPageEventArgs. Может ли кто-нибудь указать мне в правильном направлении?

Благодаря

ответ

1

Несколько схематичны, тем не менее, полностью функциональный фрагмент (скачать исходный код из here) показывает проводку события для печати на Form, содержащей FSharp.Charting диаграмму на щелчком Button размещены на одной и той же форме:

open System 
open FSharp.Charting 
open FSharp.Charting.ChartTypes 
open System.Drawing 
open System.Drawing.Printing 
open System.Windows.Forms 

[<STAThread; EntryPoint>] 
let main args = 
    let captureScreen (form: Form) = 
     let myGraphics = form.CreateGraphics() 
     let size = form.Size 
     let memoryImage = new Bitmap(size.Width, size.Height, myGraphics) 
     let memoryGraphics = Graphics.FromImage(memoryImage) 
     memoryGraphics.CopyFromScreen(form.Location.X, form.Location.Y, 0, 0, size) 
     memoryImage 

    let myChart = [for x in 0.0 .. 0.1 .. 6.0 -> sin x + cos (2.0 * x)] 
        |> Chart.Line |> Chart.WithYAxis(Title="Test") 

    let chart = new ChartControl(myChart, Dock=DockStyle.Fill) 
    use printer = new System.Drawing.Printing.PrintDocument() 
    let printBtn = new Button(Text="Print", Dock=DockStyle.Bottom) 
    printBtn.Click.Add(fun prt -> printer.Print()) 
    let form = new Form(Visible = true, TopMost = true, Width = 700, Height = 500) 
    printer.PrintPage.Add(fun prt -> 
           printBtn.Visible <- false 
           prt.Graphics.DrawImage(captureScreen(form), 0, 0) 
           printBtn.Visible <- true) 

    form.Controls.AddRange([|chart; printBtn |]) 
    do Application.Run(form) |> ignore 
    0 

для того, чтобы построить его добавить FSharp.Charting с nuget, а также ссылки на System.Drawing и System.Windows.Forms.

Составляющие являются:

  • captureScreen функция возвращает Bitmap изображение всей формы
  • System.Drawing.Printing.PrintDocument() является printer многократно используемый объект (не должен быть добавлен к форме)
  • Button будучи printer.Print() метод подключен к button Click event
  • printer.PrintPage обработчик события, делающий кнопку невидимой, захватывает форму в b itmap и рисует последнее, а затем восстанавливает видимость кнопок.

Я считаю, что это может быть достаточно хорошей отправной точкой для вас, чтобы двигаться вперед.

0

Большое спасибо!

Я добавил PrintDialog в коде ниже:

let captureScreen (form: Form) = 
    let myGraphics = form.CreateGraphics() 
    let size = form.Size 
    let memoryImage = new Bitmap(size.Width, size.Height, myGraphics) 
    let memoryGraphics = Graphics.FromImage(memoryImage) 
    memoryGraphics.CopyFromScreen(form.Location.X, form.Location.Y, 0, 0, size) 
    memoryImage 

let printdoc = new System.Drawing.Printing.PrintDocument() 
let printdia = new PrintDialog(Document=printdoc)  
let mutable Image = new Bitmap(main.Size.Width, main.Size.Height) 
let mutable printok = new DialogResult() 

print.Click.Add(fun prt -> Image <- captureScreen(main) 
          printok <- printdia.ShowDialog() 
          if printok = DialogResult.OK then printdoc.Print()) 


printdoc.PrintPage.Add(fun prt -> 
          print.Visible <- false 
          prt.Graphics.DrawImage(Image, 0, 0) 
          print.Visible <- true) 

 Смежные вопросы

  • Нет связанных вопросов^_^