2014-01-20 5 views
1

У меня есть форма с расчетными данными и диаграммами, то есть размер бумаги (формат А4). Это означает, что метод CopyFromScreen не может скриншотов всей формы. Изменение разрешения экрана - не очень хорошая идея, так как программа должна работать на нескольких компьютерах. В приведенном ниже коде вы найдете две функции captureScreen (нужно использовать только один), но ни одна из них не печатает всю форму. На изображение выводится только верхняя часть моего отчета. Какие-либо предложения?Печать формы больше размера экрана

open System.IO 
open System.Drawing 
open System.Windows.Forms 
open System.Drawing.Printing 
open Microsoft.FSharp.Control 

// declaration Form (main) and Button (print) 

// captureScreen CopyFromScreen version 

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 

// captureScreen bitmap version 

let captureScreen (form: Form) = 
    let myGraphics = form.CreateGraphics() 
    let size = form.Size 
    let rectangle = new Rectangle(Height=size.Width, Width=size.Width) 
    let memoryImage = new Bitmap(size.Width, size.Height, myGraphics) 
    main.DrawToBitmap(memoryImage,rectangle) 
    memoryImage 

// rest of program 

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

print.Click.Add(fun prt -> Image <- captureScreen(main) 
         printdia.ShowDialog() |> ignore 
         printdoc.Print()) 
printdoc.PrintPage.Add(fun prt -> 
          print.Visible <- false 
          prt.Graphics.DrawImage(Image, 0, 0) 
          print.Visible <- true) 

ответ

0

Я предполагаю, что вы хотите, чтобы весь отчет соответствовал одной странице принтера, верно? Затем вы можете выполнить масштабирование от всей формы до целых страницы принтера. Далее предполагая принтер DPI = 300 и А4 8.3x11.7 дюймов рабочего прототипа скейлера может быть:

let printFormScaled (form: Form) (printer: PrintPageEventArgs) pageSizeInch = 
    let mutable target = new Rectangle(0,0,int((fst pageSizeInch)*300.),int((snd pageSizeInch)*300.)) 
    let bitmap = new Bitmap(form.Width, form.Height) 
    form.DrawToBitmap(bitmap, new Rectangle(0,0, bitmap.Width, bitmap.Height)) 
    let xScale:double = (double bitmap.Width)/(double target.Width) 
    let yScale:double = (double bitmap.Height)/(double target.Height) 
    if (xScale < yScale) then 
     target.Width <- int(xScale * (double target.Width)/yScale) 
    else 
     target.Height <- int(yScale * (double target.Height)/xScale) 
    printer.Graphics.PageUnit <- GraphicsUnit.Pixel 
    printer.Graphics.DrawImage(bitmap, target) 

и изменить принтер обработчик событий для PrintPage

printer.PrintPage.Add(fun prt -> printFormScaled form prt (8.3,11.7)) 
+0

Еще раз спасибо за вашу помощь , Sincerely Maarten – user3212668

+0

Добро пожаловать. –