1. 程式人生 > >PageSetupDialog 控制元件頁邊距bug的完整解決

PageSetupDialog 控制元件頁邊距bug的完整解決



       列印設定對話方塊點選確定頁邊距不斷變化的問題,網上找到了一部分解決辦法,都是隻解決了列印設定對話方塊點選確定頁邊距不斷變化的問題,沒有解決初次開啟對話方塊的資料準確問題、沒有考慮和列印預覽、真實列印設定資料準確聯動的問題,也就是列印預覽裡的邊距那些資料的同步。

       如果使用者的區域採用美製,那麼完全沒有此BUG;但採用公制,系統底層一律會將對話方塊設定的邊距儲存為以百分之一英寸為單位,但是讀取的時候出了叉子,以十分之一毫米為單位提取到對話方塊裡,這就是bug的由來。比如預設設定100(官方說明:Margins ,表示頁邊距,以百分之一英寸為單位。 預設情況下各邊的邊距都為 1 英寸),100(十分之一毫米)轉換為毫米,那麼對話方塊裡顯示10毫米,實際上應該為25.4毫米,也就是1英寸。同時預覽對話方塊(以百分之一英寸為單位)理應為100。另外,如果幾個對話方塊都關聯到列印文件的話,無論設定哪個的頁邊距,都會同時變化,也就是說他們引用和設定的都是同一個物件。上程式碼:

Imports System.IO
Imports System.Drawing.Printing

Public Class Form1

    Private stringToPrint As String
    Private printFont As New Font("Arial", 10)
    Private blnMetric As Boolean    '記錄頁面邊距的單位是否是公制

    Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click
        OpenFileDialog1.Filter = "Text files (*.txt)|*.txt"
        OpenFileDialog1.ShowDialog()
        If OpenFileDialog1.FileName <> "" Then
            Try
                Dim MyFileStream As New FileStream(OpenFileDialog1.FileName, FileMode.Open)
                RichTextBox1.LoadFile(MyFileStream, RichTextBoxStreamType.PlainText)
                MyFileStream.Close()
                btnPrint.Enabled = True
                btnSetup.Enabled = True
                btnPreview.Enabled = True
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End If
    End Sub

    Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
        Try
            stringToPrint = RichTextBox1.Text
            PrintDialog1.Document = PrintDocument1
            If blnMetric Then
                PageSetupDialog1.PageSettings.Margins = PrinterUnitConvert.Convert( _
                    PageSetupDialog1.PageSettings.Margins, PrinterUnit.TenthsOfAMillimeter, PrinterUnit.Display)
                blnMetric = False
            End If
            Dim result As DialogResult = PrintDialog1.ShowDialog()
            If result = DialogResult.OK Then
                PrintDocument1.DocumentName = "我的文件"
                PrintDocument1.Print()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim numChars, numLines As Integer
        Dim stringOnePage As String
        Dim strFormat As New StringFormat
        Dim rectDraw As New RectangleF(e.MarginBounds.Left, e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height)
        Dim sizeMeasure As New SizeF(e.MarginBounds.Width, e.MarginBounds.Height - printFont.GetHeight(e.Graphics))
        strFormat.Trimming = StringTrimming.Word
        e.Graphics.MeasureString(stringToPrint, printFont, sizeMeasure, strFormat, numChars, numLines)
        Console.WriteLine(numLines)
        stringOnePage = stringToPrint.Substring(0, numChars)
        e.Graphics.DrawString(stringOnePage, printFont, Brushes.Black, rectDraw, strFormat)
        If numChars < stringToPrint.Length Then
            stringToPrint = stringToPrint.Substring(numChars)
            e.HasMorePages = True
        Else
            e.HasMorePages = False
            stringToPrint = RichTextBox1.Text    '無此句則列印預覽裡列印一次過後再次列印只打最後一頁
        End If
    End Sub

    Private Sub btnSetup_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetup.Click
        Try
            PageSetupDialog1.Document = PrintDocument1
            If Not blnMetric Then     '載入列印設定對話方塊,如果現在的單位是美製,則轉為公制
                PageSetupDialog1.PageSettings.Margins = PrinterUnitConvert.Convert( _
                PageSetupDialog1.PageSettings.Margins, PrinterUnit.Display, PrinterUnit.TenthsOfAMillimeter)
                blnMetric = True
            End If
            If PageSetupDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                PageSetupDialog1.PageSettings.Margins = PrinterUnitConvert.Convert( _
                PageSetupDialog1.PageSettings.Margins, PrinterUnit.Display, PrinterUnit.TenthsOfAMillimeter)
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
        Try
            PrintPreviewDialog1.Document = PrintDocument1
            If blnMetric Then
                PageSetupDialog1.PageSettings.Margins = PrinterUnitConvert.Convert( _
                    PageSetupDialog1.PageSettings.Margins, PrinterUnit.TenthsOfAMillimeter, PrinterUnit.Display)
                blnMetric = False
            End If
            stringToPrint = RichTextBox1.Text
            PrintPreviewDialog1.ShowDialog()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        PrintDocument1.DefaultPageSettings.Margins.Top = 100
        PrintDocument1.DefaultPageSettings.Margins.Bottom = 100
        PrintDocument1.DefaultPageSettings.Margins.Left = 80
        PrintDocument1.DefaultPageSettings.Margins.Right = 80
    End Sub
End Class


相關推薦

PageSetupDialog 控制元件bug完整解決

        列印設定對話方塊點選確定頁邊距不斷變化的問題,網上找到了一部分解決辦法,都是隻解決了列印設定對話方塊點選確定頁邊距不斷變化的問題,沒有解決初次開啟對話方塊的資料準確問題、沒有考慮和列印預覽、真實列印設定資料準確聯動的問題,也就是列印預覽裡的邊距那些資料的

[轉]簡單的動態修改RDLC報表和列寬的方法

schema serve def name star nbsp http 動態 xpath 本文轉自:http://star704983.blog.163.com/blog/static/136661264201161604413204/ 1.修改頁邊距 XmlDo

使用freemarker匯出html格式的word(調整,頁面檢視,正常表格樣式)

RT,耗費了博主半個月的時間才擠出來的成果,在此記錄下開發過程。 一、建立freemark模板 首先在web專案中指定目錄下建立一個HTML格式的freemarker模板: <!DOCTYPE html> <html xmlns:v="urn:schemas-mic

PHPExcel設定 格式 顏色 大小等

這篇為phpexcel的中文翻譯版,基本涵蓋了你想要做的任何東西,主要是別人寫的東西,又加了一些自己經過實踐過的,僅供參考 PHPExcel開發者文件 1.目錄 2. 4先決條件 2.1。軟體要求4 2.2。安裝說明4 2.3。入門4 2.4。有用的連結和工具4 2.4.1。的OpenXML

頁面直接匯出為PDF檔案,支援分

將WEB頁面直接匯出為pdf檔案是經常會用到的一個功能,尤其是各種報表系統。總結了一下目前幾種主流的做法: 在後端用程式碼生成pdf檔案,比如iText一類; 在後端抓取頁面並生成pdf檔案,比如phantomjs一類; 在前端用js直接生成pdf檔案; 方案3的優勢在於前端直接

Latex之設定

geometry 巨集包可以方便地調整頁邊距。 \usepackage{geometry} 整體調整 \geometry{a4paper,scale=0.8} 設定了紙張為a4,並且版心佔頁面長度的比例為80%;scale也可以改為ratio,表示版面邊距

【語言-c#】關於Excel換算

Excel預設的單位為釐米(cm)。 C#程式碼設定頁邊距對應的(pt)。 pt全稱為point,是一種專用的印刷單位"點"。 英寸(inch,縮寫為in.)在荷蘭語中的本意是大拇指,一英寸就是指

Android控制元件--側欄SideBar

說明 很多應用中我們都能看到關於側邊欄的使用,比如微信啊,QQ啊,美團啊等等,最常見的應該就是通訊錄裡面對聯絡人進行A~Z的排序。側邊欄主要是方便使用者進行字母索引。資料連結:http://blog.csdn.net/xiaanming/article/det

JavaScript實現網頁列印,可設定首、尾、

WebBrowser是IE內建的瀏覽器控制元件,無需使用者下載,即可實現客戶端頁面列印。 關於這個元件還有其他的用法,列舉如下: WebBrowser.ExecWB(1,1) 開啟 Web.ExecWB(2,1) 關閉現在所有的IE視窗,並開啟一個新視窗 Web.Exe

需要這樣一個記事本-15 ReportViewer列印預設、頁面方向問題

問題描述 利用ReportViewer列印,預設總是縱向列印,且橫向列印不可選,頁邊距每次都要調整。導致結果就是一頁內容卻列印在了多張紙上。 解決方案 設定*.rdlc檔案報表屬性 Margins屬

js頁面設定與列印(尾,設定)

//獲得IE瀏覽器版本        function checkIEV() {             var X, V, N;             V = navigator.appVersion;             N = navigator.appName;             if (

latex設定頁面,頁面大小,,geometry巨集包

很多latex模板都將頁面邊距設定好了,自己不用怎麼修改。但有時候也需要自己來設定頁邊距,查閱了相關資料,發現使用 geometry 巨集包可以方便地調整頁邊距。 \usepackage{geometry} \geometry{a4paper,scale=0.8} 上面

js列印分

做檔案系統的時候。需要列印多張圖片。客戶使用ie9-11  背景如上。下面是開啟列印頁面。使用了ie自帶的execwb if(format==0){ for(var i=0;i<pageArray.length;i++){ i

一個關於tableView的footerView的子控制元件y 座標的 BUG

#import"ZJHAboutViewController.h" #import "ZJHUserProtocolViewController.h" #import "UIView+Extension.h" #import "UIColor+Helpers.h"#define kWIDTH [UIScree

IE6下margin雙倍Bug的處理辦法

改了一天,我才發現了問題,除了IE6雙倍邊距之外,其他的瀏覽器都沒有問題,為此改了無數次的程式碼。為了修復雙倍邊距bug,整理了一下的資料。 一、什麼是雙邊距Bug? 先來看圖: 我們要讓

Java PDF頁面設置——頁面大小、、紙張方向、頁面旋轉

.html 上下 tin sca ref 效果 方法 image ++ 下面的示例將介紹通過Java編程來對PDF頁面進行個性化設置的方法,包括設置頁面大小、頁邊距、紙張方向、頁面旋轉等。這裏有如下多種頁面大小尺寸可供選擇; 同時,設置文檔內容旋轉時,可支持如下角度進行內

IE6的雙倍bug

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

Java 設定Word、頁面大小、頁面方向、頁面邊框

本文將通過Java示例介紹如何設定Word頁邊距(包括上、下、左、右)、頁面大小(可設定Letter/A3/A4/A5/A6/B4/B5/B6/Envelop DL/Half Letter/Letter 11x17等常見紙張大小)、頁面方向(Landscape/Portrait)、頁面邊框(包括頁面邊框、段落

VS2017 使用者自定義控制元件未出現在工具箱的解決方案

 在專案中增加幾個使用者自定義控制元件,想及時在視窗Form上新增時卻發現工具箱根本就沒有這些使用者自定義控制元件,研究了很久,發現有兩個解決辦法。通過以下兩種方法操作後,再重新編譯,在工具箱上就會出現使用者自定義控制元件了,專案中所有的自定義控制元件都會及時顯示到工具箱上。 【1】工

IE6雙倍問題及其解決方法

IE6雙倍邊距在網頁佈局中是一個很常見的問題,網上關於IE6雙倍邊距的問題討論很多,但大多比較籠統,一般認為在塊元素(比如div)中同時出現flaot和margin兩個樣式時就會在IE6中產生雙倍邊距,寫這篇文章的目的,就是把這個問題討論得透徹一些,讓大家明白,到底在什麼