سوال در مورد پرینت - ویژوال بیسیک

S.H.M

New Member
سوال در مورد پرینت

یک سوال داشتم

من می خواستم وقتی توی vb فرم رو پرینت می گیرم ، فرم در بالا و وسط صفحه پرینت گرفته بشه باید چه کنم؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
یک سوال داشتم

من می خواستم وقتی توی vb فرم رو پرینت می گیرم ، فرم در بالا و وسط صفحه پرینت گرفته بشه باید چه کنم؟

توصیه می کنم که تا جای امکان از از PrintForm استفاده نکنید، متد PrintForm نوشته های روی فرم را بصورت یک تصویر
چاپ می کنه که کیفیت مناسبی برای چاپ نداره. بهتر است که از یک روتین اختصاصی استفاده کنید.

متاسفانه شخصا روتین هایی برای این منظور نوشته ام مناسب استفاده شما نیستند، زیادی حرفه ای اند.
کد زیر را در سایت www.xtremevbtalk.com پیدا کردم که برای مقصود ما مناسب بود. ویرایش کردم و تغییرش دادم
تا فرم را در وسط صفحه برده و با توجه به طول کاغذ تغییر اندازه داده و چاپ کند. این گونه روتین ها کنترلهایی را چاپ می کنند
که قبلا در کد برنامه شان تعریف شده، مثلا این روتین کنترل ListBox را نمی شناسد و چاپ نمی کند.

یک ماژول (Module) مثلا Module1 به پروژه تان اضافه کنید و کد زیر را در آن کپی نمایید :

کد:
Option Explicit

Private BaseY As Double

Public Sub [B]PrintMyForm[/B](MyForm As Form)
    Dim Obj As Object
    Dim Factor As Double
    Dim FormScaleMode As Integer
    FormScaleMode = MyForm.ScaleMode
    MyForm.ScaleMode = vbTwips
    Printer.ScaleMode = vbTwips
    Factor = Printer.Height / Printer.Width
    Printer.Scale (0, 0)-(MyForm.Width, MyForm.Width * Factor)
    BaseY = (Printer.ScaleHeight - MyForm.Height) / 2
    For Each Obj In MyForm
        If Obj.Visible Then
            PrintObject Obj
        End If
    Next Obj
    MyForm.ScaleMode = FormScaleMode
    Printer.EndDoc
End Sub

Public Sub PrintObject(Obj As Object)
    If TypeOf Obj Is Line Then
        PrinMyLine Obj
    ElseIf TypeOf Obj Is TextBox Then
        PrinTxt Obj
    ElseIf TypeOf Obj Is Label Then
        PrinLbl Obj
    ElseIf TypeOf Obj Is PictureBox Then
        PrintPicture Obj
    ElseIf TypeOf Obj Is Image Then
        PrintImage Obj
    End If
End Sub

Public Sub PrinTxt(Txt As TextBox)
    With Txt
        Printer.ForeColor = .ForeColor
        Printer.Font = .Font
        Printer.Font.Name = .Font.Name
        Printer.Font.Charset = .Font.Charset
        Printer.Font.Bold = .Font.Bold
        Printer.Font.Italic = .Font.Italic
        Printer.Font.Size = .Font.Size
        Printer.Font.Strikethrough = .Font.Strikethrough
        Printer.Font.Underline = .Font.Underline
        Printer.Font.Weight = .Font.Weight
        Select Case .Alignment
        Case vbCenter
            Printer.CurrentX = .Left + (.Width - Printer.TextWidth(.Text)) / 2
        Case vbLeftJustify
            Printer.CurrentX = .Left
        Case vbRightJustify
            Printer.CurrentX = .Left + .Width - Printer.TextWidth(.Text)
        End Select
        Printer.CurrentY = BaseY + .Top
        Printer.Print .Text
    End With
End Sub

Public Sub PrinLbl(Lbl As Label)
    With Lbl
        Printer.ForeColor = .ForeColor
        Printer.FontTransparent = (.BackStyle = 0)
        Set Printer.Font = Lbl.Font
        Printer.Font.Name = Lbl.Font.Name
        Printer.Font.Charset = .Font.Charset
        Printer.Font.Bold = .Font.Bold
        Printer.Font.Italic = .Font.Italic
        Printer.Font.Size = .Font.Size
        Printer.Font.Strikethrough = .Font.Strikethrough
        Printer.Font.Underline = .Font.Underline
        Printer.Font.Weight = .Font.Weight
        Select Case .Alignment
        Case vbCenter
            Printer.CurrentX = .Left + (.Width - Printer.TextWidth(.Caption)) / 2
        Case vbLeftJustify
            Printer.CurrentX = .Left
        Case vbRightJustify
            Printer.CurrentX = .Left + .Width - Printer.TextWidth(.Caption)
        End Select
        Printer.CurrentY = BaseY + .Top
        Printer.Print .Caption
    End With
End Sub

Public Sub PrintPicture(Pic As PictureBox)
    With Pic
        Printer.PaintPicture .Image, .Left, BaseY + .Top, .Width, .Height
    End With
End Sub

Public Sub PrintImage(Img As Image)
    With Img
        Printer.PaintPicture .Picture, .Left, BaseY + .Top, .Width, .Height
    End With
End Sub

Public Sub PrinMyLine(MyLine As Line, Optional DrawWidth As Integer = 10)
    With MyLine
        Printer.DrawWidth = DrawWidth
        Printer.Line (.X1, BaseY + .Y1)-(.X2, BaseY + .Y2)
    End With
End Sub

تابع PrintMyForm فرم مورد نظر را چاپ خواهد کرد، مثلا :

کد:
    [B]PrintMyForm[/B] Form1
 

S.H.M

New Member
نشد

اصلا فرم رو پرینت نمی گیره
یعنی چاپ میکنه ولی صفحه سفید
 

S.H.M

New Member
خیلی فوریه من یک فرم دارم با 10 20 تا لیبل
اندازه فرم خوبه کیفیت چاپ فرم خوبه فقط جاش درست نیست
گوشه بالا سمت راست میزنه که می خوام وسط چاپ کنه
 

the_king

مدیرکل انجمن
نشد

اصلا فرم رو پرینت نمی گیره
یعنی چاپ میکنه ولی صفحه سفید

خیلی فوریه من یک فرم دارم با 10 20 تا لیبل
اندازه فرم خوبه کیفیت چاپ فرم خوبه فقط جاش درست نیست
گوشه بالا سمت راست میزنه که می خوام وسط چاپ کنه

کد مشکلی نداره، نمی دونم کدوم قسمت کار رو درست انجام ندادید.
یک فرم نمونه را که داخلش یک Label و یک PictureBox و سه TextBox بود را ایجاد کردم و Print گرفتم. بدون مشکل
چاپ شد.

خروجی بصورت یک فایل pdf به همراه پروژه کامل و فایل exe ضمیمه این پست می باشد.
 

پیوست ها

  • Print Form 2.zip
    39.7 کیلوبایت · بازدیدها: 147

S.H.M

New Member
بله فهمیدم چی شد این برنامه جای فرم رو تغییر نمیده بلکه جای لیبل یا تکست باکس و ... رو تغییر میده و فقط از نطر عمودی اونو میبره وسط که کار BaseY هست.
 

Luna20

New Member
سلام دوستان
ممنونم از مطلب مفیدتون
من میخوام مستقیم فرم رو به پرینتر بفرستم
اگه میشه سریعتر جواب بدین
 

جدیدترین ارسال ها

بالا