none
請教在同一次多頁列印中, 各別橫印/列印問題 RRS feed

  • 問題

  • 各位前輩好,

     Dim quePrtEmf As New Queue(Of Imaging.Metafile)

    (在一些程序中繪製要列印的表格/圖型, 加入到 quePrtEmf Queue 中)
    (使用者要列印的表格/圖型有些是橫向, 有些是直向, 頁數不定)

        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            If (quePrtEmf Is Nothing) OrElse (quePrtEmf.Count = 0) OrElse StopFlag OrElse e.Cancel Then
                e.Cancel = True
                e.HasMorePages = False
                Exit Sub '----->>>>>
            End If
          
            Dim EmfPrt As Imaging.Metafile = quePrtEmf.Dequeue    '依序取出要列印的EMF圖

            e.PageSettings.Landscape = (EmfPrt.Width > EmfPrt.Height)    '橫向或直向列印

            e.Graphics.DrawImage(EmfPrt, 0, 0, e.PageSettings.Bounds.Width, e.PageSettings.Bounds.Height)    '畫EMF圖

            DisposeImg(EmfPrt)

            Application.DoEvents()  '可能連續列印大量頁面

            e.HasMorePages = quePrtEmf.Count > 0    '還有圖要印

        End Sub

    問題:
    假設 quePrtEmf 有三張圖要印, 依長寬比分別要 1.直印, 2.橫印, 3.橫印,
    但經上述 PrintDocument1_PrintPage 印出結果, 第2張的紙張卻是直向的,
    如圖: http://www.nexttech.com.tw/try/apm_try.pdf

    請問是否是遺漏了什麼設定?
    謝謝!

    2011年4月19日 上午 08:51

解答

  • 有可能是 文件高 > 文件寬 > 紙張寬 所以被設定成直印

     如果可以的話 把相關的資料一同輸出至文字檔 會比較好判斷


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

     

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

     

    在標題或文章註明很急
    不會增加網友回覆速度
    • 已標示為解答 Ader.Chen 2011年4月25日 上午 04:30
    2011年4月20日 上午 03:05
  • Please try to run it in debug mode or writelog, get the EmfPrt.width and .height to see if it really set into LandScape as true.
    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    • 已標示為解答 Ader.Chen 2011年4月25日 上午 04:30
    2011年4月20日 上午 03:51

所有回覆

  • 有可能是 文件高 > 文件寬 > 紙張寬 所以被設定成直印

     如果可以的話 把相關的資料一同輸出至文字檔 會比較好判斷


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

     

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

     

    在標題或文章註明很急
    不會增加網友回覆速度
    • 已標示為解答 Ader.Chen 2011年4月25日 上午 04:30
    2011年4月20日 上午 03:05
  • Please try to run it in debug mode or writelog, get the EmfPrt.width and .height to see if it really set into LandScape as true.
    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    • 已標示為解答 Ader.Chen 2011年4月25日 上午 04:30
    2011年4月20日 上午 03:51
  • 謝謝各位的建議!

    在 PrintPage() 中, 逐一記錄各頁列印時的 e.PageSettings.Landscape, e.PageSettings.Bounds, e.PageBounds, 等內容,

    歸納出規則: 

    1> 紙張的範圍(長寬)取決於 e.PageBounds, 但在 PrintPage() 內唯讀不能更改.
    2> 在 Print 之前更改 DefaultPageSettings.Landscape, 及於 PrintPage() 內更改 e.PageSettings.Landscape, 才能影響"下次" PrintPage() 中的 e.PageBounds.

    套用到我的程式:

    1> 在 Print 之前, 先讓第一頁的方向正確.
    ex.
            PrintDocument1.DefaultPageSettings.Landscape = (quePrtEmf.Peek.Width > quePrtEmf.Peek.Height) '第一頁要先設定好.
            PrintDocument1.Print() '<<<>>>

    2> 在 PrintPage() 中, 列印當頁後, 設定下一頁的方向.
    ex.

            If quePrtEmf.Count > 0 Then '還有圖要印
                '設定下次列印是橫向/縱向
                e.PageSettings.Landscape = (quePrtEmf.Peek.Width > quePrtEmf.Peek.Height)

                Application.DoEvents()  '可能連續列印大量頁面

                e.HasMorePages = True

            Else
                e.HasMorePages = False 'Default
            End If

    修改後測試, 各項橫豎混合的列印結果都正確無誤了.
    以上是個人粗淺的方式供參考, 可以 Work, 不過可能會有更好/正規的解法.
    謝謝!

    2011年4月20日 上午 06:28
  • Good that you solve it.
    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    2011年4月20日 上午 07:02
  • 若無更好的作法, 就醬結案了.

    解題源起於兩位前輩的提示.

    謝謝!

    2011年4月25日 上午 04:30