Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Lomakkeen tulostaminen

Puoliväkisten [21.01.2009 22:43:43]

#

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

Metabolix [21.01.2009 23:15:44]

#

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ä.

Puoliväkisten [21.01.2009 23:22:34]

#

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?

neau33 [22.01.2009 14:24:25]

#

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

Puoliväkisten [22.01.2009 20:24:26]

#

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 :)

neau33 [22.01.2009 22:15:41]

#

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...

Puoliväkisten [22.01.2009 23:37:46]

#

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ä

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta