none
透過CaptureScreen來列印文件,但是狀況連連 RRS feed

  • 問題

  • 各位先進們好,小弟胡搞瞎搞弄個資料庫系統終於告一個段落

    最近卻發現USER反應列印文件時文字失真,看得很不舒服,希望能改善,仔細看大多都失真了

    我透過以下步驟來完成列印文件

    1.word規畫表格後轉檔為.Png 並且設定Panel 將其BackGroundImage變更

    2.在Panel上建立幾個Label以及文字方塊,使得能夠將資料庫撈出來的資料顯示在表格上

    3.透過網路上提供的資訊(http://www.blueshop.com.tw/board/FUM20050124191756KKC/BRD20081027172623MCA.html),
    將Panel畫面完整擷取後使用PrintDocumenr or PrintDialog 進行列印,Code如下:

    <System.Runtime.InteropServices.DllImport("gdi32.dll")> Public Shared Function 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 Integer) As Long End Function 'get the screenshot Private memoryImage As Bitmap Private Sub CaptureScreen() Dim mygraphics As Graphics = Me.Panel1.CreateGraphics Dim s As Size = Me.Panel1.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.Panel1.ClientRectangle.Width, Me.Panel1.ClientRectangle.Height, dc1, 0, 0, 13369376) mygraphics.ReleaseHdc(dc1) memoryGraphics.ReleaseHdc(dc2) End Sub

    Private Sub printDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage e.Graphics.DrawImage(memoryImage, 0, 0) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click CaptureScreen() PrintDocument1.Print() End Sub


    仔細想想應該是CaptureScreen這地方造成要列印的部分嚴重失真

    拜讀google大神後 明白可以直接透過PrintDocument來直接建立列印文件,不用多繞螢幕截圖這段冤枉路

    我在PrintDocument1.PrintPage中寫下此行,可完整列印表格格式

     e.Graphics.DrawImage(Panel1.BackgroundImage, e.MarginBounds.Left, e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height)

    也可下 e.Graphics.DrawString來寫入文字,問題來了
    請問各位我該如何精準地將文字寫入在正確的位置上呢?

    若我希望在表單上增加checkbox or radiobutton等項目時又該從何下手?

    總不能設定一個String的location就Run一次試試看吧O_o"



    • 已編輯 ShadoL 2016年9月9日 上午 03:14 修改文字
    2016年9月9日 上午 03:12

解答

所有回覆

  • 你可以利用e.Graphics.DrawString的參數控制文字輸出的位置, 另外列印文件(非報表)通常不需要與使用者互動, 不知道加入checkbox or radiobutton要做什麼?

    2016年9月9日 上午 06:13
  • 你可以利用e.Graphics.DrawString的參數控制文字輸出的位置, 另外列印文件(非報表)通常不需要與使用者互動, 不知道加入checkbox or radiobutton要做什麼?

    您好,感謝您以往的無私回覆,小弟受益良多

    加入Radiobutton主要是我在表格上有一行是四個選項,這四個選項分別為A,B,C,D

    這個文件會從資料庫撈出資訊,顯示使用者勾選的選項為何,CheckBox也是希望能夠顯示使用者在程式上啟用了哪些功能

    只不過目前頭疼的地方就是在參數控制文字輸出的位置這點,這樣代表我每建一行文字就必須用"猜"的去Try座標參數

    不知道先進們有沒有聰明點的方法,感謝您提供的意見m(_"_)m

    2016年9月9日 上午 06:35
  • 如果您要列印的是資料庫記錄, 應該用報表功能, 而不是用PrintDocument
    2016年9月9日 上午 07:11
  • 你可以先看:Graphics.CopyFromScreen,就不用管 BitBlt

    若要用 PrintDocument ,你可以先用 PictureBox 輸出,在畫到 PrintDocument 上,這樣 PictureBox 就是預覽畫面了。

    在本論壇搜尋 預覽列印 ,會看到很多既有討論。

    https://social.msdn.microsoft.com/Forums/zh-TW/home?sort=relevancedesc&brandIgnore=True&searchTerm=%E9%A0%90%E8%A6%BD%E5%88%97%E5%8D%B0+PrintDocument


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年9月9日 下午 05:50
  • 以前回的一篇:

    https://social.msdn.microsoft.com/Forums/zh-TW/2bcb466f-8443-494a-b5a1-476ab1e1f458?forum=232


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年9月17日 下午 03:32