Moi taas
Tulostus onnistuu allaolevalla koodilla, vika on vain siinä että printscreenin jälkeen kuvan muunto ilmeisesti heikentää laatua. tuloste näyttää luokattoman huonolta, eikä tekstistä tahdo saada selvää
Koko on hyvä pysty A4 yms toiminta ok, jälki vain huonoa. Saanko laatua paremmaksi ?
Private Declare Function BitBlt Lib "gdi32.dll" Alias "BitBlt" (ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As System.Int32) As Long
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim objPrintDocument As New Printing.PrintDocument
Dim objPrintPreview As New PrintPreviewDialog
AddHandler objPrintDocument.PrintPage, AddressOf PrintPage
'Before printing, hide all Buttons
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.GetType.FullName = "System.Windows.Forms.Button" Then
ctl.Visible = False
End If
Next
'Before printing, set Form.BackColor as White
Dim FormBackColor As Color = Me.BackColor
Me.BackColor = System.Drawing.Color.White
Me.Refresh()
'Call sub to capture current Form as an image
CaptureScreen()
'Printing… it will call sub PrintPage
objPrintPreview.Document = objPrintDocument
objPrintPreview.ShowDialog()
objPrintDocument = Nothing
objPrintPreview = Nothing
'After printing, restore settings
For Each ctl In Me.Controls
If ctl.GetType.FullName = "System.Windows.Forms.Button" Then
ctl.Visible = True
End If
Next
Me.BackColor = FormBackColor
End Sub
Private Sub CaptureScreen()
Dim mygraphics As Graphics = Me.CreateGraphics()
Dim s As Size = Me.Size
memoryImage = New Bitmap(s.Width, s.Height, mygraphics)
Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
Dim dc1 As IntPtr = mygraphics.GetHdc
Dim dc2 As IntPtr = memoryGraphics.GetHdc
BitBlt(dc2, 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height, dc1, 0, 0, 13369376)
mygraphics.ReleaseHdc(dc1)
memoryGraphics.ReleaseHdc(dc2)
End Sub
Private Sub PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
e.Graphics.DrawImage(memoryImage, 0, 0)
End SubItse en kyllä ymmärrä mikä koodissa vaikuttaa laatuun. pakkaako jokin taustalla kuvaa liikaa vai mistä johtuu
Lisäys: Formin koko on 720x738
Vai lankeatko vain siihen harhaan, että ruudulla pikselit näyttävät paljon paremmilta kuin paperilla? Yleensä tulostimelle syötetään paljon tarkempaa tavaraa kuin näytölle. Näytön tarkkuus voi olla esimerkiksi 96 pistettä tuumalla, vanhahkollakin tulostimella vastaava luku on usein 300 ja uusilla toisinaan 1200 tai 2400.
Kokeilepa vaikka ottaa kuvakaappaus Wordista, printtaa se ja katso, tuleeko samanlaista huonoa jälkeä.
Metabolix kirjoitti:
Vai lankeatko vain siihen harhaan, että ruudulla pikselit näyttävät paljon paremmilta kuin paperilla? Yleensä tulostimelle syötetään paljon tarkempaa tavaraa kuin näytölle. Näytön tarkkuus voi olla esimerkiksi 96 pistettä tuumalla, vanhahkollakin tulostimella vastaava luku on usein 300 ja uusilla toisinaan 1200 tai 2400.
No sekin tietysti voi olla. Mikä auttaisia asiaan?
Moikka taas Puoliväkisten!
Jos et ole vielä asennellut tätä niin imppaa/asenna...
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports Microsoft.VisualBasic.PowerPacks.Printing
Public Partial Class MainForm
Public Sub New()
Me.InitializeComponent()
Me.KeyPreview = True
End Sub
Sub MainFormKeyUp(sender As Object, e As KeyEventArgs)
If e.KeyCode = Keys.PrintScreen And e.Control Then
Me.button1.Focus
PrintMe
End If
End Sub
Sub Button1Click(sender As Object, e As EventArgs)
PrintMe
End Sub
Sub PrintMe()
Dim ctl As Control
Dim btns(1, 0) As Object
Dim i As Integer = -1
For Each ctl In Me.Controls
If TypeOf(ctl) Is Button Then
i += 1
ReDim Preserve btns(1, i)
btns(0, i) = ctl
btns(1, i) = ctl.Top
ctl.Top = Me.Height
End If
Next
Dim FormBackColor As Color = Me.BackColor
Me.BackColor = System.Drawing.Color.White
Me.Refresh
Dim PrintForm1 As New PrintForm
PrintForm1.Form = Me
PrintForm1.DocumentName = "Test"
PrintForm1.PrintAction = _
Printing.PrintAction.PrintToPreview
PrintForm1.Print()
Me.BackColor = FormBackColor
If i > -1 Then
For j As Integer = 0 To i
btns(0, j).Top = btns(1, j)
Next
End If
End Sub
End ClassMoi
Sain asennettua paketin ja koodin liitettyä ilman virheilmoitusta
Public Partial Class MainForm . . . Sub MainFormKeyUp(sender As Object, e As KeyEventArgs)
Ylläolevaan kohtaan vaihdoin projektin nimen.
Tämähän on nyt sitten uusi luokka?
Pitäisikö tuon nyt tulostaa lomake JOS lomakkeella on button1 niminen painike?
vai pitääkö tätä kutsua Private Sub osiossa jossa on painike
Tämä kaikki niin uutta :)
Moikka taas Puoliväkisten!
sorry, jäi mainitsematta, että jutska on väännetty SharpDevelop'lla...
elikä luo uusi projekti (Windows Application) lisää projektin referensseihin GAC:sta referenssi: Microsoft.VisualBasic.PowerPacks
Kirjoittele Imports-lauseet, siiry Design-tilaan, lisää formille nappi, kilkkaa nappia ja iske koodiksi:
PrintMe
Siiry takas Design-tilaan, tupla-klikkaa formia ja iske Load_tapahtuman koodiksi:
Me.KeyPreview = True
Siiry taas Design-tilaan, aktivoi Formi, klikkaa properties ikkunassa sitä salamaa, etsi KeyUp, tuplaklikkaa viereisessä tekstiruudussa ja lisää KeyUp_tapahtuman koodiksi:
If e.KeyCode = Keys.PrintScreen And e.Control Then Me.button1.Focus PrintMe End If
copy/pasteta aliohjelma: Sub PrintMe()...projektisi pääikkunan luokan (Form1) sisälle & tallenna...
Iltaa :)
jokin on vielä pielessä valittaa tälläistä
'PrintForm' is ambiguous in the namespace 'Microsoft.VisualBasic.PowerPacks.Printing'
.. Dim Printform1 As New PrintForm . .
importannu seuravaa
Imports Microsoft.VisualBasic.PowerPacks.Printing
Onko tuo printFform vielä epämääräinen vai mainittu kadesti jossain ei selviä meikäläiselle
dammmm, testasin ihan uuteen projektiin ja pelittää... omassa koodissa vikaa vikaa.....
No niin toimii, oli noita PowerPackkeja entuudestaa niin sekas systeemiä
Aihe on jo aika vanha, joten et voi enää vastata siihen.