先說一下上次發布的“ 發布一個支援大量文字列印的PrintDocument派生對象,公開原始碼”
的文章,我發布了一個繼承與System.Drawing.Printing.PrintDocument的對象,這個對象支持從文件流和文本字符串內生成打印作業文檔,當時我沒有仔細測試,發現其中有一個很大的邏輯bug 。
bug的表現是假如你使用字串賦值的辦法生成物件實例,那麼列印預覽的時候你會驚奇的發現預覽的時候文檔內容列印了兩遍。而我後來才發現這個問題。
經過查找,我發現了原因,但這個原因很奇妙。
原理是,我為了一次讀取一行文本,我使用了System.IO.StringReader類別作為讀取器。而它的建構子就是傳遞進來的保存文本內容的字串,然後使用StringReader.ReadLine() 方法來讀取文本,產生列印的內容。
但是我必須要實作一個機制,這個機制用來檢查讀取器是否讀取到最後的內容,而StringReader.Peek()方法就是偵測後面是否有內容,如果沒有內容就回傳-1值。而經過我的測試,無論是否怎樣檢測,都不返回-1,而是把內容輸入兩次後才返回-1,這樣就導致同樣的內容顯示了兩遍。
這個bug已經修改,我透過其他的辦法修改了檢測手段,這次無需打兩次內容了。請下載的各位重新下載一次。
現在開始說PrintPreveiwControl控制。
首先要提醒大家注意的是,它是一個自訂windows 控件,而不是新的列印預覽視窗。它就是列印預覽視窗中顯示列印預覽的那部分內容,如果大家要使用的話,必須建立一個windows窗體,然後使用它既可。
說實話,微軟在.net中自帶的列印預覽視窗非常不好,即不好看,也不好用,所以微軟就提供了一個System.Windows.Forms.PrintPreviewControl控件,而這個控件也不太好,主要是不支援滑鼠滾輪,另外最重要的就是不支援列印頁面計數,而列印預覽時的可用頁面數目是列印預覽視窗中“上頁”,“下頁”這樣的按鈕所必須的屬性。
所以我使用了Reflector反編譯了微軟的PrintPreviewControl控件,使用它的原始程式碼並添加了“OnMouseWheel”事件處理程序,而OnMouseWheel就是專門處理滑鼠滾輪滾動時的操作的。同樣公佈原始碼。
OnMouseWheel方法內我添加了大量註釋,有要處理滑鼠滾輪的朋友可以根據這個程式碼的原理來發揮。
下載:按此下載
http://www.cnblogs.com/submaie/archive/2006/08/11/474568.html