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 Sub
Itse 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 Class
Moi
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.