Tisk - otočený text, zarovnán vpravo   otázka

VB.NET, Algoritmy, Tisk

Dobrý den.

Zkouším přidávat tisk do mého programu a jsem v tom začátečník.

Používám komponentu printDocument

Private Sub TiskToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TiskToolStripMenuItem.Click
    
                Dim docPrint As PrintDocument = New PrintDocument
                AddHandler docPrint.PrintPage, AddressOf docPrint_PrintPage
                docPrint.Print()
        End Sub

Private Sub docPrint_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles docPrint.PrintPage
        minX = e.PageSettings.PrintableArea.Left - e.PageSettings.HardMarginX
        minY = e.PageSettings.PrintableArea.Top - e.PageSettings.HardMarginY
        maxX = e.PageSettings.PrintableArea.Width
        maxY = e.PageSettings.PrintableArea.Height
        
Dim strDisplay As String
        Dim x As Single
        Dim y As Single
    End Sub

' Nadpis
                x = poziceX(CSng(205))
                y = poziceY(CSng(148.5))
                strDisplay = "Kombinace manuálního a strojního času"
                DrawText(ev.Graphics, strDisplay, x, y, Brushes.Black, 90, "Arial", 16, FontStyle.Bold)

                ' Nadpis
                x = poziceX(CSng(100))
                y = poziceY(CSng(148.5))
                strDisplay = "Kombinace:"
                DrawText_RR_ZR(ev.Graphics, strDisplay, x, y, Brushes.Black, "Arial", 16, FontStyle.Bold)
                ' Nadpis
                x = poziceX(CSng(120))
                y = poziceY(CSng(148.5))
                strDisplay = "Kombinace manuálního:"
                DrawText_RR_ZR(ev.Graphics, strDisplay, x, y, Brushes.Black, "Arial", 16, FontStyle.Bold)
                ' Nadpis
                x = poziceX(CSng(140))
                y = poziceY(CSng(148.5))
                strDisplay = "Kombinace manuálního a strojního času:"
                DrawText_RR_ZR(ev.Graphics, strDisplay, x, y, Brushes.Black, "Arial", 16, FontStyle.Bold)

Funkce PoziceX a PoziceY použiji k převedení mm na celou tisknutelnou plochu, takže při vytváření budu pozici nápisů a pod. zadávat v mm


Friend Function poziceX(ByVal x As Single) As Single
        Return (((maxX - minX) / 210) * x) + minX
    End Function
    Friend Function poziceY(ByVal y As Single) As Single
                Return (((maxY - minY) / 297) * y) + minY    
    End Function

To jen tak pro úvod.

1.

Nyní se snažím vyřešit pokud budu chtít tisknout dokument naležato, tak jak zarovnat otočený text vpravo.

Vycházel jsem ze zde uvedeného seriálu při vytváření popisků ke grafům, ale trochu víc se ztrácím v transformacích. Navíc mi výsledný text nevyleze úplně přesně zarovnán vpravo. Každý následující řádek je posunut o dvojtečku vpravo.

např.:

Kombinace manuálního a strojního času:

Kombinace manuálního:

Kombinace:

Následuje funkce k otočení textu:

Sub DrawText_RR_ZR(ByVal g As Graphics, ByVal txt As String, ByVal x As Single, ByVal y As Single, ByVal brsh As Drawing.Brush, Optional ByVal fontJmeno As String = "Arial", Optional ByVal fontVelikost As Single = 8.0, Optional ByVal fontStyl As System.Drawing.FontStyle = FontStyle.Regular)
        g.TranslateTransform(x, y)
        g.RotateTransform(90)
        Dim fnt = New Font(fontJmeno, fontVelikost, fontStyl, GraphicsUnit.Point, CType(0, Byte))
        Dim velikost As SizeF = g.MeasureString(txt, fnt)
        Dim s As Single = velikost.Width
        g.DrawString(txt, fnt, brsh, 0 - s, 0)
        g.ResetTransform()
    End Sub

2.

Při odkrokovávání se mi u tohoto kroku program zdrží tak 15 vteřin, než pokračuje dál

docPrint.Print()

a každý tento řádek vykonává tak 8 vteřin

minX = e.PageSettings.PrintableArea.Left - e.PageSettings.HardMarginX

minY = e.PageSettings.PrintableArea.Top - e.PageSettings.HardMarginY

maxX = e.PageSettings.PrintableArea.Width

maxY = e.PageSettings.PrintableArea.Height

Je možné, že je to tím, že tisknu na sdílenou tiskárnu, přes IP port a jde to (zřejmě přes server fe Francii) protože můžu tisknout na libovolnou tiskárnu v jakékoliv fabrice na světě - samozřejmě patřící k naší skupině :) )

netuším proč.

Případně jak jinak efektivně udělat to, aby na jakokoliv tiskárně budu vždy tisknout na tisknutelnou plochu a nestane se mi, že by se část textu nevytiskla. Pokud budu zadávat tisk absolutně pozicovat.

Předem děkuji, za komentáře.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Pardon u prvního kódu nemá být samozřejmě

Dim y As Single
    End Sub

ale End Sub je až na konci.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nemám zkušenosti s tiskem ve WinForms, ale pokud zvážíte použití WPF, tam je tisk opravdu snadný a budu schopný Vám poradit co a jak, když mi řeknete, jak má vypadat Vaše tisková sestava.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji. Přesto to zkusím přímo ve WinForms.

To otočení už jsem jakžtakž nakonec vyřešil. Zbývá jenom tan neskutečná pomalost. Kdy se aplikace na dvě desítky vteřin odmlčí, aby pak bez problému vytiskla jeden jediný text na stránku.

Zkusím ještě úplně nový projekt s obyčejným tiskem, jestli není chyba někde jinde.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback