• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

In ấn trong VB6

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
Hình đại diện của người dùng
phongvanvu
Guru
Guru
Bài viết: 151
Ngày tham gia: T.Tư 24/01/2007 2:20 pm
Has thanked: 1 time
Been thanked: 8 time
Liên hệ:

In ấn trong VB6

Gửi bàigửi bởi phongvanvu » T.Bảy 19/04/2008 5:36 pm

Tên bài viết: In ấn trong VB6
Tác giả: phongvanvu
Cấp độ bài viết: Mới bắt đầu
Tóm tắt: Mặc dù máy tính là một thế giới không dùng giấy, nhưng việc in ấn vẫn là một trong những chức năng quan trọng của ứng dụng và thông dụng nhất trong các chương trình. Mặc dù VB cho phép in ấn dễ dàng nhưng thực sự đây không phải là thế mạnh của VB, bài này giới thiệu cách dùng các chức năng cần thiết cho việc in ấn.


Các khái niệm
VB cung cấp đối tượng Printer và Printers cho cho tất cả các ứng dụng VB khi chạy. Đối tượng Printers cung cấp thông tin về toàn bộ các máy in đã cài trên máy tính. Đối tượng Printer điều khiển việc xuất ra máy và nhận thông tin như tên máy in.
Trước hết, hãy xem các bước cơ bản để in trong VB. Đầu tiên, chúng ta sẽ gửi một thông tin đơn giản ra máy in, chúng ta chỉ cần gọi:

Mã: Chọn hết

  1. Printer.Print "Hello"

Mỗi lần bạn gọi hàm Print, kết quả xuất sẽ chuyển xuống dòng kế tiếp. Vậy:

Mã: Chọn hết

  1. Printer.Print “Hello”
  2. Printer.Print “Goodbye”

Sẽ hiển thị
Hello
Goodbye
Trên giấy.
Nếu bạn muốn in trên một trang mới, bạn chỉ cần gọi hàm NewPage:

Mã: Chọn hết

  1. Printer.NewPage

Khi bạn muốn kết thúc xuất dữ liệu ra máy in, bạn chỉ cần gọi hàm EndDoc;

Mã: Chọn hết

  1. Printer.EndDoc

Windows sẽ đẩy văn bản của bạn ra máy in.
In văn bản
Khi dùng đối tượng Printer, bạn cũng có thể định dạng cho văn bản như dùng đối tượng Font với các thuộc tính kèm theo như FontSize, FontBold, FontItalic,FontStrikeThru và FontUnderline. Để đổi font, chỉ cần chọn thuộc tính FontName. Ví dụ:

Mã: Chọn hết

  1. Printer.FontName=”Tahoma”

Thay đổi font thành Tahoma. Thay đổi cỡ font, gọi Printer.FontSize. Phần lớn các tùy chọn định dạng khác thuộc dạng True False rất dễ để áp dụng. Mã sau là một minh họa đơn giản:

Mã: Chọn hết

  1. With Printer
  2.     Printer.Print "Normal Line"
  3.     .FontBold = True
  4.     Printer.Print "Bold Line"
  5.     .FontItalic = True
  6.     Printer.Print "Bold and Italic Line"
  7.     .FontBold = False
  8.     .FontItalic = False
  9.     Printer.Print "Second Normal Line"
  10.     .EndDoc
  11. End With

Lưu ý:
Dù tôi dùng phát biểu With, tôi vẫn phải dùng Printer.Print. Đây là một khác biệt trong VB vì hàm Print không gắn với bất kỳ đối tượng nào. Nếu bạn tìm trong Object Browser ( nhấn F2), bạn sẽ không tìm thấy nó. Print là hàm mà VB gắn với đối tượng đứng trước nó. Ví dụ PictureBox1.Print sẽ xuất văn bản vào PictureBox. Như vậy, hành vi của Print phụ thuộc vào đối tượng đứng trước nó. Tuy nhiên, cha đẻ của VB đã không thiết kế để kèm theo nó với phát biểu With.
Xem tất cả các lựa chọn của font nhấn F2 gọi Object Browser chọn Printer từ Classes.
Canh lề trong VB là khá đơn giản. VB không cho phép canh lề. Nhưng chúng ta có thể tính điểm giữa của trang trừ đi độ dài văn bản sẽ là canh giữa. Ví dụ, mã sau in số trang vào giữa của trang.

Mã: Chọn hết

  1. sMsg = "Page " & Printer.Page ' In số trang
  2. HWidth = Printer.TextWidth(sMsg) / 2 ' Lấy nửa trang rộng.
  3. HHeight = Printer.TextHeight(sMsg) /2 ' Lấy nửa trang cao.
  4. Printer.CurrentX = Printer.ScaleWidth / 2 - HWidth
  5. Printer.CurrentY = Printer.ScaleHeight / 2 - HHeight
  6. Printer.Print sMsg

Mã trên dùng CurrentX và CurrentY để đặt vị trí xuất ra của văn bản. Nếu bạn muốn văn bản được in ở giữa ngay đầu, đơn giản không đặt CurrentY nữa.
In hình ảnh
Xuất hình ảnh ra máy in cũng như xuất hình ảnh ra PictureBox. Chúng ta sẽ tìm hiểu một vài lệnh cơ bản ở đây nhưng trước hết hãy lưu ý tới 2 lệnh CurrentX và CurrentY. Nó cho biết tọa độ xuất ra máy in. VB tự động thay đổi hai giá trị này sau khi xuất. Cho ví dụ, nếu bạn vẽ một đường thẳng trên giấy khi bạn ngừng vẽ ngòi bút sẽ ở cuối đường thẳng nơi bạn dừng vẽ chứ không phải ở đầu. Cũng vậy với CurrentX và CurrentY. Nếu bạn gọi hàm Line, đường thẳng sẽ được vẽ và CurrentX với CurrentY chỉ tới cuối đường thẳng. Bạn có thể thay đổi tọa độ cho văn bản hoặc đường thẳng tiếp theo.
Lưu ý:
VB in ra giấy và vẽ vào form như nhau. Nên nếu bạn thực hành và muốn tiết kiệm giấy hoặc bạn không có máy in, hãy chuyển Printer.Function thành Function. Ngoài ra, bỏ dòng Printer.EndDoc đi. Đặt backcolor của form là màu trắng cho dễ nhìn1 và autoredraw là true. Dữ liệu in ra giấy và in ra form là như nhau. Bạn cũng có thể dùng cách này để tạo PrintScreen.
Lệnh Line
Lệnh này vẽ đường thẳng, dùng cú pháp:

Mã: Chọn hết

  1. Printer.Line [Step] (x1, y1) [Step] - (x2, y2), [color], [B][F]

Trong đó:
(x1,y1) – điểm bắt đầu đoạn thẳng.
(x2,y2) – điểm kết thúc đoạn thẳng.
Step – tùy chọn – nếu có nó thì nó sẽ vẽ thêm x pixel từ bên phải CurrentX và y pixel dưới CurrentY. Bạn cứ thử sẽ dễ hiểu hơn. Đây là minh họa

Mã: Chọn hết

  1. Printer.Line Step (x1, y1)

Tương tự như

Mã: Chọn hết

  1. Printer.Line (x1 + Printer.CurrentX, y1 + Printer.CurrentY)

Color – màu đoạn thẳng
B – tùy chọn vẽ hình hộp.
F – tùy chọn tô màu hộp. Nói rõ sau.
Xem một số ví dụ:

Mã: Chọn hết

  1. Printer.Line (1000, 2000)-(5000, 3000), vbRed
  2. Printer.EndDoc

Vẽ một đoạn chéo từ trên xuống dưới.
Dùng kết hợp Line và Step để vẽ hình chữ nhật:

Mã: Chọn hết

  1. Printer.Line (1000, 2000)-(5000, 2000), vbRed
  2. 'Draw down from end of first line
  3. 'don't change X pos
  4. 'change Y pos by 4000
  5. Printer.Line Step(0, 0)-Step(0, 2000), vbRed
  6. 'draw across 'change X pos by -4000
  7. 'don't change Y pos
  8. Printer.Line Step(0, 0)-Step(-4000, 0), vbRed
  9. 'draw up
  10. 'don't change X pos
  11. 'change Y pos by -4000
  12. Printer.Line Step(0, 0)-Step(0, -2000), vbRed
  13. Printer.EndDoc

Dĩ nhiên, dùng tùy chọn B, vẽ hình chữ nhật dễ hơn nhiều:

Mã: Chọn hết

  1. Printer.Line (1000, 2000)-(5000, 4000), vbRed, B
  2. Printer.EndDoc

Lệnh Circle
Lệnh tiếp sau là Circle sẽ giúp bạn vẽ hình tròn, hình elip hay cung tròn.
Cú pháp:

Mã: Chọn hết

  1. Printer.Circle [Step] (x, y), radius, [color, start, end, aspect]

Trong đó:
Step – tương tự như lệnh Line.
(x,y) – tâm hình tròn.
Radius – bán kính hình tròn
Color – màu hình tròn. RGB()
Start – vị trí bắt đầu cung tròn theo radian
End – vị trí kết thúc cung tròn theo radian
Aspect – độ biến dạng của hình tròn. 1 vẽ hình tròn, 1.5 vẽ hình elip
Chú ý: Radian là đơn vị đo góc. 1 Radian =180 độ/ pi. Pi=3.14….
Xem ví dụ:

Mã: Chọn hết

  1. Printer.Circle (3000, 3000), 1000, RBG(100, 30, 30)

Vẽ hình tròn.
Để tô màu hình tròn, cần dùng lựa chọn FillStyle sẽ nói sau.
Dùng end và start, bạn có thể vẽ cung tròn.
Lưu ý:
Radian có quan hệ với pi, hằng số pi liên quan tới tham số end và start. Vậy hãy thêm miêu tả sau vào dự án của bạn:

Mã: Chọn hết

  1. Const pi = 3.141592654

Mã này

Mã: Chọn hết

  1. Printer.Circle (3000, 3000), 1000, vbBlue, 0, pi

Vẽ nửa hình tròn.
Nếu bạn vẽ giá trị âm, VB vẽ thêm các đoạn thẳng tới tâm hình tròn. Ví dụ:

Mã: Chọn hết

  1. Printer.Circle (3000, 3000), 1000, vbBlue, -1, -pi

Cuối cùng, dùng lựa chọn aspect để vẽ hình elip:

Mã: Chọn hết

  1. Printer.Circle (3000, 3000), 1000, vbBlue, , , 0.5

Hình ảnh
Hàm khác là PaintPicture cho bạn vẽ file hình ảnh tới đối tượng printer.
Cú pháp:

Mã: Chọn hết

  1. Printer.PaintPicture picture, x1, y1, [width1], [height1], [x2], [y2], [width2], [height2], [opcode]

Trong đó:
picture là lấy từ Form.Picture hoặc PictureBox.Picture hoặc LoadPicture.
X1,y1 là tọa độ để vẽ hình ảnh.
Width1, Height1: chiều cao, độ rộng hình ảnh xuất ra.
X2, y2, width2, height2: lấy một phần của hình ảnh.
Mã sau vẽ hình ảnh ra máy in lề là 1000 twip:
Printer.PaintPicture Picture1.Picture, 1000, 1000
Mã này:

Mã: Chọn hết

  1. PaintPicture LoadPicture("C:sample.jpg"), 1000, 1000

Nạp hình ảnh rồi vẽ nó.
Cuối cùng:

Mã: Chọn hết

  1. Printer.PaintPicture Picture1.Picture, 1000, 1000, 2000, 2000

Vẽ hình với kích thước định sẵn.
Các lựa chọn đồ họa
Lệnh Line và Circle cho bạn vẽ hình và đặt màu đường vẽ nhưng không cho bạn đặt độ rộng nét vẽ và tô màu bên trong.
Dùng chúng khá đơn giản. Xem dưới đây:
FillColor – Màu tô tô (RGB). Dùng hàm RGB hoặc hằng số màu để tạo nó.
FillMode – chế độ mẫu tô. Nhấn F2 chọn FillStyleConstants trong Classes.
DrawMode – chế độ vẽ. Trừ khi bạn hiểu rõ, nếu không hãy để chúng là 13-CopyPen. Các giá trị khác có thể dẫn tới kết quả không mong muốn. Xem các giá trị tại DrawModeConstants trong Object Browser.
DrawWidth – độ rộng của đường vẽ.
DrawStyle – kiểu đường vẽ như liền nét, dấu chấm… Xem DrawStyleConstants trong Object Browser.
Scale Mode – đặt đơn vị đo lường ngầm định là twip. 1444 twip=1 inch=2.54 cm.
Các lựa chọn in
Ngoài các chọn lựa đồ họa, cũng có một số thuộc tính ảnh hưởng trực tiếp tới in ấn. Đây là một số:
Copies – Số bản in.
DeviceName – Tên máy in.
DriverName – tên driver máy in.
Duplex – máy in ở chế độ Duplex hay không?
hDC – giá trị duy nhất gọi là A handle to the printers device context ( chưa biết từ tương đương trong tiếng Việt).
Orientation – hướng giấy. vbProrLandscape hay vbProrPortrait được dùng.
Page – Số của trang hiện tại. ( chỉ đọc)
PaperBin – hộc giấy dùng khi in. Xem PrinterObjectConstants xem các giá trị bắt đầu bằng vbPRBN.
PaperSize – cỡ giấy để in. Xem vbPRPS như trên.
Port – Tên cổng máy in ( chỉ đọc).
PrintQuality – Chất lượng bản in ( độ phân giải máy in). Xem vbPRPQ như trên.
TrackDefault – sẽ tự in ra máy in ngầm định khi thay đổi trong ControlPanel.
Zoom – Tỷ lệ phóng to thu nhỏ chỉ thực hiện khi máy in hỗ trợ.
Gặp lại các bạn trong những bài tiếp theo.
@vietteiv,anhtuyenbk: Xin lỗi nhé, tại soạn trước bằng MSWord nên không để ý.:)
Sửa lần cuối bởi phongvanvu vào ngày CN 20/04/2008 1:11 pm với 5 lần sửa.


Live to fight!

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Kỹ thuật In trong Vb6

Gửi bàigửi bởi truongphu » T.Hai 21/12/2009 11:13 pm

Tên bài viết: Kỹ thuật In trong Vb6
Tác giả: truongphu
Cấp độ bài viết: căn bản và nâng cao
Tóm tắt: Kỹ thuật In trong Vb6



Muốn in trong VB6, bạn cần gọi máy in, đó là Printer

1- Lệnh in kết thúc:

Mã: Chọn hết

   Printer.EndDoc


2- In Giao diện Form: Quá đơn giản:

Mã: Chọn hết

   Me.PrintForm
   Printer.EndDoc


3- In Text
* Printer.Print là lệnh in từng dòng, vd in 2 dòng sau"

Mã: Chọn hết

    Printer.Print "Chào các ban"
    Printer.Print "Câu Lac bô VB"
   Printer.EndDoc


Ta cũng có thể dùng vbCrLf xen vào chuỗi như sau:

Mã: Chọn hết

    Printer.Print "Chào các ban" & vbCrLf & "Câu Lac bô VB"
   Printer.EndDoc


* Dùng vbTab để nhảy khoảng cách và vbCrLf để xuống dòng trong chuỗi

* Bỏ dòng:

Mã: Chọn hết

    Printer.Print ""

hoặc vbCrLf & vbCrLf

* Sang trang mới:

Mã: Chọn hết

    Printer.NewPage


* Như các bạn thấy, lệnh in trực tiếp không hổ trợ tiếng Việt Unicode

4- In file
Để in tiếng Việt Unicode, có dấu hoàn chỉnh, buộc ta phải soạn qua file có hổ trợ Unicode, vd MSWord...sau đó gọi lệnh in các file nầy

Tôi cung cấp đến các bạn Hàm in file như sau:

  1. Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByValhwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  2.  
  3.  
  4. Private Sub Command1_Click()
  5. Dim aaa As String
  6. aaa = vbTab & vbTab & "Báo cáo Tình Hình Ðiên" & _
  7. vbCrLf & vbCrLf & "Tram Biê'n áp Sô' 28; 50KVA" & _
  8. vbCrLf & vbTab & "Dòng A 214V" & _
  9. vbCrLf & vbTab & "Dòng B 207V" & _
  10. vbCrLf & vbTab & "Dòng A 200V" & _
  11. vbCrLf & "Ti lê tiêu thu: 97%" & _
  12. vbCrLf & vbCrLf & vbTab & vbTab & vbTab & "Nguoi lâp báo cáo" & _
  13. vbCrLf & vbCrLf & vbTab & vbTab & vbTab & "Nguyen Ngoc Chau"
  14.  
  15. Dim obj: Set obj = CreateObject("Scripting.FileSystemObject").CreateTextFile(App.Path & "\Print.txt", True, True)
  16. obj.Write aaa
  17. PrintThisFile App.Path & "\Print.txt"
  18. Set obj = Nothing
  19. End Sub
  20.  
  21.  
  22. ' goi ShellExecute in file
  23. Public Sub PrintThisFile(FileName As String)
  24. Dim x As Long
  25. x = ShellExecute(Me.hWnd, "Print", FileName, vbNullString, 0&, SW_SHOWHIDE)
  26. End Sub


* Phần đầu là hàm API phục vụ cho hàm in file bên dưới cùng
* Phần tiếp là tạo String để In
* Phần tiếp là Gởi ra file TXT có hổ trợ Unicode, sau đó yêu cầu in

Project đính kèm:
download/file.php?id=8087

5- Dùng DataReport
Ta cũng có thể thêm vào Form một DataReport để in cho "hoành tráng"
Code như sau:

  1. Dim rsItems
  2. 'Developer: Brian M. Matumbura
  3. 'truongphu: editor
  4.  
  5. Private Sub Command1_Click()
  6. With DataReport1
  7.     Set .DataSource = rsItems
  8.     .DataMember = rsItems.DataMember
  9.     .Show
  10. End With
  11. End Sub
  12.  
  13. Private Sub Form_Load()
  14. Set rsItems = CreateObject("Adodb.Recordset")
  15. Set rsItems = CreateRecords
  16. End Sub
  17.  
  18. Private Function CreateRecords() As Variant
  19.  
  20.   Dim rsTemp, i As Integer
  21.   Set rsTemp = CreateObject("Adodb.Recordset")
  22.   With rsTemp
  23.  
  24.     .Fields.Append "Pha", 200, 4 ' 200=adVarChar
  25.   .Fields.Append "Dòng", 3 'adInteger
  26.   .Fields.Append "Ðiên Áp", 3 'adInteger
  27.  
  28.     .CursorType = 1 'adOpenKeyset
  29.   .LockType = 3 'adLockOptimistic
  30.   .Open
  31.     For i = 0 To 2
  32.  
  33.       .AddNew
  34.       u = 65 + i
  35.       ![Pha] = Chr(u) ' Thêm du liêu o' Ðây
  36.     ![Dòng] = 25 - i ' Thêm du liêu o' Ðây
  37.     ![Ðiên Áp] = 219 + i ' Thêm du liêu o' Ðây
  38.     .Update
  39.     Next
  40.   End With
  41.  
  42.   Set CreateRecords = rsTemp
  43. End Function


Project đính kèm:
download/file.php?id=8091

6- Set Font cho máy in: chọn và thay đổi các thuộc tính sau cho phù hợp

Mã: Chọn hết

    Printer.FontName = "Tahoma"
    Printer.FontBold = True
    Printer.FontBold = False
    Printer.FontItalic = True
    Printer.FontUnderline = True
    Printer.FontSize = 12
    Printer.FontStrikethru = False


7- Nếu máy in màu thì:

Mã: Chọn hết

    Printer.ForeColor = vbRed


8- Số trang: Printer.Page

Mã: Chọn hết

    Printer.Print vbTab & vbTab & vbTab & "Page: " & Printer.Page


9- Trình bày một chuỗi ngay dòng đầu, giữa trang:

Mã: Chọn hết

    Dim S$: S = "Câu Lac Bô VB"
    Dim SWidth: SWidth = Printer.TextWidth(S)
    Printer.CurrentX = Printer.ScaleWidth / 2 - SWidth
    Printer.Print S
    Printer.EndDoc


10- Trình bày một chuỗi ngay giữa trang:

Mã: Chọn hết

    Dim S$: S = "Câu Lac Bô VB"
    Dim SWidth: SWidth = Printer.TextWidth(S)
    Dim SHeight: SHeight = Printer.TextHeight(S) / 2
    Printer.CurrentX = Printer.ScaleWidth / 2 - SWidth
    Printer.CurrentY = Printer.ScaleHeight / 2 - HHeight
    Printer.Print S
    Printer.EndDoc


11- In một line: Printer.Line

Mã: Chọn hết

    Printer.Line (1000, 2000)-(5000, 2000), vbRed
    Printer.EndDoc


12- In một khung:

Mã: Chọn hết

    Printer.Line (1000, 2000)-(5000, 2000), vbRed 'Ðuong ngang (Y1=Y2)
    Printer.Line Step(0, 0)-Step(0, 2000), vbRed     'Ke'o xuô'ng (Y) thêm 2000
    Printer.Line Step(0, 0)-Step(-4000, 0), vbRed    'Lùi (X) -4000
    Printer.Line Step(0, 0)-Step(0, -2000), vbRed    'Kéo lên (Y) -2000

    Printer.EndDoc


gọn nhất là dùng tham số B (statement):

Mã: Chọn hết

    Printer.Line (1000, 2000)-(5000, 4000), vbRed, B
    Printer.EndDoc

(1000, 2000) là tọa độ điểm xuất phát với X1 và Y1, số 5000 tiếp theo là vẽ line với Y1 giữ nguyên (Y2=Y1) và X2 =5000; số 4000 là vẽ tiếp cạnh đứng với X2 giữ nguyên (X3=X2) và Y3=4000. Tham số B sẽ phụ trách vẽ 2 cạnh còn lại của hình chữ nhật.

13- In một vòng tròn: Printer.Circle với các tham số: Tâm (X,Y), bán kính, màu

Mã: Chọn hết

    Printer.Circle (3000, 3000), 2000, RGB(200, 30, 255)
    Printer.EndDoc


14- In một cung: Printer.Circle với các tham số: Tâm (X,Y), bán kính, màu, điểm cung phát xuất theo chiều lượng giác, điểm cung kết thúc. Khai báo số Pi.

Mã: Chọn hết

    Const pi = 3.141592654
    Printer.Circle (3000, 3000), 1000, vbBlue, 0, pi
    Printer.EndDoc


15- In hình quạt: như in một cung, nhưng 2 tham số cuối là âm, sẽ có 2 line từ tâm ra mép cung

Mã: Chọn hết

    Const pi = 3.141592654
    Printer.Circle (3000, 3000), 1000, vbBlue, -1, -pi
    Printer.EndDoc


16- In hình ellipse: như in một cung, nhưng 2 tham số của cung để trống, thêm tham số cuối là chiều cao của hình ellipse so với hình tròn

Mã: Chọn hết

    Printer.Circle (3000, 3000), 1000, vbBlue, , , 0.5
    Printer.EndDoc


17- In từ Picture Box: Lệnh Printer.PaintPicture với tọa độ trên giấy:

Mã: Chọn hết

    Printer.PaintPicture Picture1.Picture, 1000, 1000
    Printer.EndDoc


Ta có thể điều chỉnh độ rộng, cao của hình in với 2 tham số bổ sung phía sau:

Mã: Chọn hết

    Printer.PaintPicture Picture1.Picture, 1000, 1000, 8000, 5000
    Printer.EndDoc


Còn một đoạn nữa, giờ buồn ngủ...Hẹn tiếp
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Kỹ thuật In trong Vb6

Gửi bàigửi bởi truongphu » T.Ba 22/12/2009 7:19 pm

18- Đổ màu trong hình: FillStyle = 0 = Đổ màu; 1= không đổ màu; FillColor: màu đổ. Các lệnh nầy chỉ thị trước lệnh vẽ hình

Mã: Chọn hết

    FillStyle = 0
    FillColor = vbRed
    Printer.Circle (3000, 3000), 1000, vbBlue, , , 0.5
    Printer.EndDoc


19- DrawMode, DrawWidth, DrawStyle, ScaleMode... sử dụng như các control có hdc khác

20- Copies: số bản in, khó chính xác hoặc không hoạt động. Ta thử cách khác:

Mã: Chọn hết

    a = InputBox("Nhâp sô'")

    Do While a > 0
        'Printer.PaperSize = 11
        Printer.Height = 11905
        Printer.Width = 8390
        Printer.Print "Cafe My~ Dung Kính chào Quý Khách"
        Printer.EndDoc
        a = a - 1
    Loop


21- Orientation: chiều của giấy, đặt là vbPRORLandscape (ngang) hay vbPRORPortrait

22- PaperSize: cỡ giấy in, đặt là vbPRPSA4 (9) hay vbPRPSA3 (8), vbPRPSA5 (11), vbPRPSA4Small (10)

23- PrintQuality: chất lượng in, đặt là vbPRPQHigh (tốt) hay vbPRPQMedium, vbPRPQLow, vbPRPQDraft

=D>
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
xuanquy_th
Guru
Guru
Bài viết: 792
Ngày tham gia: T.Ba 05/08/2008 9:15 pm
Đến từ: Thanh Hoá
Has thanked: 1 time
Been thanked: 10 time
Liên hệ:

Re: In ấn trong VB6

Gửi bàigửi bởi xuanquy_th » T.Tư 23/12/2009 10:50 am

Thêm một cái không kém phần quan trọng nữa là
  1. Printer.ScaleMode = 6 '6 - Millimeter
Khi Chúa Trời đóng cánh cửa này lại, Ngài sẽ mở một cánh cửa khác cho ta.
Nhưng ta thường nhìn quá lâu vào cánh cửa đã đóng nên không thấy được có một cánh cửa khác đang mở ra cho ta!!!

voicon
Thành viên chính thức
Thành viên chính thức
Bài viết: 24
Ngày tham gia: T.Bảy 05/09/2009 10:40 am
Has thanked: 1 time
Been thanked: 1 time

Re: In ấn trong VB6

Gửi bàigửi bởi voicon » T.Năm 25/03/2010 3:19 pm

Để in nội dung 1 tờ thông báo , vì muốn định dạng trong word trước cho đẹp nên em đã ghi file doc sang dạng ảnh , rồi dùng lệnh sau:
Printer.PaintPicture LoadPicture("C:\Fonts\TB.bmp"), 15, ToY, 180, 120
Nhưng tốc độ in rất chậm. Vì vậy em đã làm thủ công là in từng dòng trong vb. ví dụ:
SetFont 12, ".VnTimeH", "B"
PutTXT 45, ToY, "th«ng b¸o ch­¬ng tr×nh"
. Việc in như thế này không thể căn chỉnh 2 bên nên văn bản trông rất xấu xí.
---
Vừa được bài in file này của bác thấy mừng mừng, thử nhưng nó báo lỗi biến SW_SHOWHIDE này chưa được định nghĩa, trong
Public Sub PrintThisFile(FileName As String)
Dim x As Long
x = ShellExecute(Me.hWnd, "Print", FileName, vbNullString, 0&, SW_SHOWHIDE)
End Sub
Bác gỡ lỗi giùm và cho lời khuyên nên dùng giải pháp nào là tối ưu nhé. Chân thành cảm ơn.
À quên, hàm PutTXT là tự viết để in 1 xâu tại vị trí x, y

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: In ấn trong VB6

Gửi bàigửi bởi truongphu » T.Năm 25/03/2010 5:35 pm

Bạn khai báo là xong:

Mã: Chọn hết

Private Const SW_SHOWHIDE = 0


(Ở Vb6, nếu không có phát biểu Option Explicit thì hằng hay biến nào không khai báo sẽ tự động nhận giá trị là 0)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

VB.NET
Thành viên chính thức
Thành viên chính thức
Bài viết: 31
Ngày tham gia: T.Bảy 24/04/2010 8:24 am
Has thanked: 11 time

Re: In ấn trong VB6

Gửi bàigửi bởi VB.NET » T.Bảy 24/04/2010 8:47 am

Xin chào,
Tôi là thành viên mới toanh. Cám ơn bác Truongphu và vài bác khác đã có nhiều bài bổ ích về in ấn trong VB6. Tuy nhiên, tôi có một câu hỏi nhờ các bác chỉ giúp:
- Làm sao để in text xoay ở một góc bất kỳ ra giấy? (tôi thường in ra file *.pdf bằng máy in ảo)
- Tôi có tham khảo một số code trên mạng về xoay text trên Form hay picture. Tuy nhiên khi áp dụng vào để in ra giấy thì ko có tác dụng.
Mong các cao thủ chỉ giúp =D>
Cám ơn rất nhiều,

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: In ấn trong VB6

Gửi bàigửi bởi truongphu » T.Bảy 24/04/2010 8:58 am

VB.NET đã viết:Làm sao để in text xoay ở một góc bất kỳ ra giấy?


1- bạn có nick VB.NET, sợ rằng code VB6 thích hôp với bạn chăng?
2- Làm gì in text ở chế độ xoay góc bất kỳ?
* Hoặc là đứng (default = PORTRAIT)
* Hoặc là Ngang: xoay 90 độ (LANDSCAPE)

Mã: Chọn hết

Private Sub Command1_Click()
    Const PORTRAIT = 1
    Const LANDSCAPE = 2
   
    Printer.Orientation = LANDSCAPE
    Printer.Print Text1.Text
    Printer.EndDoc
End Sub
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

VB.NET
Thành viên chính thức
Thành viên chính thức
Bài viết: 31
Ngày tham gia: T.Bảy 24/04/2010 8:24 am
Has thanked: 11 time

Re: In ấn trong VB6

Gửi bàigửi bởi VB.NET » T.Bảy 24/04/2010 9:17 am

truongphu đã viết:
VB.NET đã viết:Làm sao để in text xoay ở một góc bất kỳ ra giấy?


1- bạn có nick VB.NET, sợ rằng code VB6 thích hôp với bạn chăng?
2- Làm gì in text ở chế độ xoay góc bất kỳ?
* Hoặc là đứng (default = PORTRAIT)
* Hoặc là Ngang: xoay 90 độ (LANDSCAPE)

Mã: Chọn hết

Private Sub Command1_Click()
    Const PORTRAIT = 1
    Const LANDSCAPE = 2
   
    Printer.Orientation = LANDSCAPE
    Printer.Print Text1.Text
    Printer.EndDoc
End Sub


Cám ơn bác TruongPhu. Tuy nhiên, tôi xin nói rõ câu hỏi hơn như sau:
- Tôi sử dụng VB6 (dù nick của tôi là VB.NET :D )
- Trên giấy (hoặc file *.pdf) của tôi sẽ có những text mà: nằm ngang, text khác thì xoay 90o (hoặc 180o).
td: "Hello world" (nằm ngang) nhưng text: "I am VB.NET" lại xoay 90o (cả 2 đều nằm trên cùng một tờ giấy hoặc file *.pdf). Tôi có thử cách đổi hướng giấy sau mỗi lần printer.print text(i) nhưng VB báo lỗi, ko cho đổi chiều giấy quá 1 lần trên một chương trình.
- Code xoay text trên mạng khá phức tạp, họ xài DLL nhiều nhưng chỉ có tác dụng trên FORM hay PICTURE thui.

Hình đại diện của người dùng
vietteiv
Quản trị
Quản trị
Bài viết: 1318
Ngày tham gia: T.Bảy 10/02/2007 12:17 am
Đến từ: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 time
Been thanked: 69 time
Liên hệ:

Re: In ấn trong VB6

Gửi bàigửi bởi vietteiv » T.Bảy 24/04/2010 2:42 pm

viết chữ để in trực pdf tôi chưa làm nên không biết bạn dùng kỹ thuật như thế nào. còn in xong để xuất ra pdf thì đúng là phải viết chữ trên picture hoặc form. bạn nghiên cứu hàm DrawText thử xem sao: trong đó có các tham số để vẽ chữ theo góc độ
ví dụ: DrawText "ola, chạy thử, nghe rõ trả lời ! ", 1, 4, 10, 5, &HC0C0C0, , 2

VB.NET
Thành viên chính thức
Thành viên chính thức
Bài viết: 31
Ngày tham gia: T.Bảy 24/04/2010 8:24 am
Has thanked: 11 time

Re: In ấn trong VB6

Gửi bàigửi bởi VB.NET » T.Hai 26/04/2010 8:00 am

vietteiv đã viết:viết chữ để in trực pdf tôi chưa làm nên không biết bạn dùng kỹ thuật như thế nào. còn in xong để xuất ra pdf thì đúng là phải viết chữ trên picture hoặc form. bạn nghiên cứu hàm DrawText thử xem sao: trong đó có các tham số để vẽ chữ theo góc độ
ví dụ: DrawText "ola, chạy thử, nghe rõ trả lời ! ", 1, 4, 10, 5, &HC0C0C0, , 2


Cám ơn bạn đã chỉ dẫn. Tôi xin nói rõ thêm là tôi viết cho in lên giấy (dùng printer.print.**) nhưng khi in, tôi cho in ra file pdf thay vì in ra giấy (in ra giấy thì kết quả cũng y như vậy thôi, nhưng để tiết kiệm giấy ;-), tôi in ra pdf).
Tôi có kiếm được function Drawtext với nhiều tham số nhưng nó chỉ có tác dụng trên Form, còn trên giấy thì không.
Bạn tham khảo code dùng xoay chữ ở bất kỳ góc độ nào:
  1. Option Explicit
  2. Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal H As Long, ByVal W As Long, ByVal E As Long, ByVal O As Long, ByVal W As Long, ByVal I As Long, ByVal u As Long, ByVal S As Long, ByVal C As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal F As String) As Long
  3. Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  4. Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  5.  
  6. Private Sub DrawRotatedText(ByVal txt As String, _
  7.     ByVal X As Single, ByVal Y As Single, _
  8.     ByVal font_name As String, ByVal size As Long, _
  9.     ByVal weight As Long, ByVal escapement As Long, _
  10.     ByVal use_italic As Boolean, ByVal use_underline As Boolean, _
  11.     ByVal use_strikethrough As Boolean)
  12.  
  13. Const CLIP_LH_ANGLES = 16   ' Needed for tilted fonts.
  14. 'Const PI = 3.14159625
  15. 'Const PI_180 = PI / 180#
  16.  
  17. Dim newfont As Long
  18. Dim oldfont As Long
  19.  
  20.     newfont = CreateFont(size, 0, _
  21.         escapement, escapement, weight, _
  22.         use_italic, use_underline, _
  23.         use_strikethrough, 0, 0, _
  24.         CLIP_LH_ANGLES, 0, 0, font_name)
  25.    
  26.     ' Select the new font.
  27.    oldfont = SelectObject(hdc, newfont)
  28.    
  29.     ' Display the text.
  30.    CurrentX = X
  31.     CurrentY = Y
  32.     Print txt
  33.  
  34.     ' Restore the original font.
  35.    newfont = SelectObject(hdc, oldfont)
  36.    
  37.     ' Free font resources (important!)
  38.    DeleteObject newfont
  39. End Sub
  40.  
  41. Private Sub Command1_Click()
  42. Const FW_NORMAL = 40   ' Normal font weight.
  43.  
  44. Static angle As Long    ' Angle in degrees.
  45.  
  46.     ' Start from scratch.
  47.    Cls
  48.    
  49.     DrawRotatedText "Chris", 100, 100, _
  50.         "Times New Roman", 20, _
  51.         FW_NORMAL, angle * 10, _
  52.         False, False, False
  53.  
  54.     angle = angle + 10
  55. End sub

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: In ấn trong VB6

Gửi bàigửi bởi truongphu » T.Hai 26/04/2010 8:43 am

In nghiêng trực tiếp ra giấy:
howto_print_rotated.zip
(5.51 KiB) Đã tải 673 lần




Còn một vài bài nữa, in xoay đủ góc trên picture, lát nữa lục tìm...
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
vietteiv
Quản trị
Quản trị
Bài viết: 1318
Ngày tham gia: T.Bảy 10/02/2007 12:17 am
Đến từ: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 time
Been thanked: 69 time
Liên hệ:

Re: In ấn trong VB6

Gửi bàigửi bởi vietteiv » T.Hai 26/04/2010 10:08 am

trong code mà chú truongphu gởi lên có đoạn này
  1. ' Create the rotated font.
  2. With log_font
  3.     .lfEscapement = 3150
  4.     'bạn thay = số 900 sẽ in ra góc 90o, các góc vuông tương ứng sẽ là bội số của 900
  5. End With

VB.NET
Thành viên chính thức
Thành viên chính thức
Bài viết: 31
Ngày tham gia: T.Bảy 24/04/2010 8:24 am
Has thanked: 11 time

Re: In ấn trong VB6

Gửi bàigửi bởi VB.NET » T.Hai 26/04/2010 12:46 pm

vietteiv đã viết:trong code mà chú truongphu gởi lên có đoạn này
  1. ' Create the rotated font.
  2. With log_font
  3.     .lfEscapement = 3150
  4.     'bạn thay = số 900 sẽ in ra góc 90o, các góc vuông tương ứng sẽ là bội số của 900
  5. End With


Ah, cám ơn bạn (đề nghị Mode thêm vào 4R này nút bấm Cám ơn đi :-/ ). Hèn gì, tôi cứ thay số là 90 thay vì 900 nên góc xoay rất lạ. =D> . Vì sao lại lấy đến 3 chữ số nhỉ?

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: In ấn trong VB6

Gửi bàigửi bởi truongphu » T.Hai 26/04/2010 2:03 pm

VB.NET đã viết:Vì sao lại lấy đến 3 chữ số nhỉ?

Đơn vị của Prop lfEscapement là 1/10 độ

Sau đây là vài project tham khảo tiếp:
Tập tin đính kèm
howto_print_rotated_with_paintpicture.zip
(7.09 KiB) Đã tải 543 lần
rotate.rar
(4.38 KiB) Đã tải 552 lần
Create an API hFont from a VB StdFont object.rar
(2.52 KiB) Đã tải 541 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

VB.NET
Thành viên chính thức
Thành viên chính thức
Bài viết: 31
Ngày tham gia: T.Bảy 24/04/2010 8:24 am
Has thanked: 11 time

Re: In ấn trong VB6

Gửi bàigửi bởi VB.NET » T.Hai 26/04/2010 2:43 pm

truongphu đã viết:
VB.NET đã viết:Vì sao lại lấy đến 3 chữ số nhỉ?

Đơn vị của Prop lfEscapement là 1/10 độ

Sau đây là vài project tham khảo tiếp:


Cám ơn Mode truongphu và Vietteive nhiều. Sao trong phần Help của VB ko thấy nói lfEscapement là gì nhỉ. Tôi bấm F1 thì VB báo là Keyword not found. Các từ như hdc, gdi32, lfWeight..v .v...trong code của Mode Truongphu gởi cũng là trong thư viện của VB phải ko ạh? Xin lỗi vì nếu tôi hỏi ngớ ngẩn :(( bởi vì tôi là dân kỹ thuật nghiên cứu VB một cách amateur thui.
Xin cám ơn,

Hình đại diện của người dùng
vietteiv
Quản trị
Quản trị
Bài viết: 1318
Ngày tham gia: T.Bảy 10/02/2007 12:17 am
Đến từ: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 time
Been thanked: 69 time
Liên hệ:

Re: In ấn trong VB6

Gửi bàigửi bởi vietteiv » T.Hai 26/04/2010 3:11 pm


VB.NET
Thành viên chính thức
Thành viên chính thức
Bài viết: 31
Ngày tham gia: T.Bảy 24/04/2010 8:24 am
Has thanked: 11 time

Re: In ấn trong VB6

Gửi bàigửi bởi VB.NET » T.Hai 26/04/2010 3:22 pm

vietteiv đã viết:bạn tìm hiểu thêm ở đây:
http://www.khkt.net/chu-de/18742/st/40/ ... p-Trinh-C/

Xin cám ơn Mod Vietteiv nhiều.
Thân mến,
VB.NET

VB.NET
Thành viên chính thức
Thành viên chính thức
Bài viết: 31
Ngày tham gia: T.Bảy 24/04/2010 8:24 am
Has thanked: 11 time

Re: In ấn trong VB6

Gửi bàigửi bởi VB.NET » T.Tư 28/04/2010 10:24 am

truongphu đã viết:In nghiêng trực tiếp ra giấy:
howto_print_rotated.zip



Còn một vài bài nữa, in xoay đủ góc trên picture, lát nữa lục tìm...


Cho tôi hỏi tiếp là khi tôi áp dụng code của Mode truongphu vào việc in ra file pdf nhưng có gọi thêm một số thuộc tính của printer thì code này ko còn hiệu quả, nó ko hoạt động nữa. Xin xem code bên dưới:
Mong mọi người chỉ giúp lý do tại sao.

  1. ' Print rotated text.
  2. Private Sub cmdPrint_Click()
  3. '-----Doa.n the^m va`o:
  4. Printer.PaperSize = 8
  5. Printer.FillStyle = 0
  6. Printer.DrawWidth = Val(txtlinewidth.Text)  '1
  7. Printer.Orientation = 2 'cdlLandscape '2
  8. cdlprint.ShowPrinter
  9. Printer.ScaleMode = 6
  10. Printer.FontName = Trim(cmbFontname.Text)
  11. Printer.FontBold = Optbold.Value
  12. Printer.FontSize = Trim(txtfonsize.Text)
  13. If OptCoordinates(0).Value = True Then
  14. Printer.Scale (0, 0)-(420, 297)
  15. '-------------Code cua Mode truongphu posted:
  16. Const FONT_SIZE = 10
  17. Const FONT_FACE = "Times New Roman"
  18. Const TXT = "Here is some rotated text"
  19.  
  20. Dim printer_hdc As Long
  21. Dim log_font As LOGFONT
  22. Dim new_font As Long
  23. Dim old_font As Long
  24. cdlprint.ShowPrinter
  25.     ' Initialize the printer.
  26.    Printer.Print " "
  27.  
  28.     ' Save the hDC.
  29.    printer_hdc = Printer.hdc
  30.  
  31.     ' Create the rotated font.
  32.    With log_font
  33.         .lfEscapement = 900 '3150
  34.        .lfHeight = (FONT_SIZE * -20) / Printer.TwipsPerPixelY
  35.  
  36.         ' End the font name with a vbNullChar.
  37.        ' Thanks to Tim Rude (timrude@ hotmail.com) for finding this.
  38.        .lfFaceName = FONT_FACE & vbNullChar
  39.     End With
  40.     new_font = CreateFontIndirect(log_font)
  41.  
  42.     ' Select the font.
  43.    old_font = SelectObject(printer_hdc, new_font)
  44.     TextOut printer_hdc, 2000, 4000, TXT, Len(TXT)
  45.        
  46.     ' Restore the original font.
  47.    SelectObject printer_hdc, old_font
  48.     DeleteObject new_font
  49.  
  50.     Printer.EndDoc
  51. End Sub

hutra
Bài viết: 1
Ngày tham gia: T.Sáu 28/03/2008 11:02 pm
Has thanked: 2 time

Re: In ấn trong VB6

Gửi bàigửi bởi hutra » T.Tư 28/04/2010 1:49 pm

Hi, mình làm theo bác in rất tốt, nhưng có 1 vấn đề là khi in qua máy in kim thì khi hết lệnh in nó cứ load giấy mãi. Có cách nào khi in hết dòng cuối cùng thì máy in tự động ngưng ko load giấy nữa ko bác. Xin cảm ơn


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách