C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 印刷プレビュー(PrintPreviewDialog)で表示


(過去ログ 87 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■51831 / inTopicNo.1)  印刷プレビュー(PrintPreviewDialog)で表示
  
□投稿者/ じいおい (1回)-(2010/07/21(Wed) 23:12:16)

分類:[.NET 全般] 

おせわになります。じいおいといいます。
どうしても分からないので、教えていただければ幸いです。開発環境はWindowsXPsp3のVB2008です。

プリンタでは、出力できるのに、印刷プレビューではちゃんと表示しません。
していることは、PrintDocumentのPrintPageにおいて
Graphics.DrawLinesで10000点以上の連続線を書かせているだけです。

御教授お願いいたします。

引用返信 編集キー/
■51832 / inTopicNo.2)  Re[1]: 印刷プレビュー(PrintPreviewDialog)で表示
□投稿者/ じいおい (2回)-(2010/07/21(Wed) 23:39:09)
じいおいです。書いたコードです。


Private Sub Button1_Click(ByVal sender As Object,ByVal e As EventArgs) Handles Button1.Click

  Dim pdlg As New PrintDialog()
  pdlg.Document = PrintDocument1
  pdlg.ShowDialog()

  Dim ppd As PrintPreviewDialog()
  ppd.Document = PrintDocument1
  ppd.ShowDialog()

End Sub

Privete Sub PrintDocument1_PrintPage(ByVal sender As Object,ByVal e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
  
  Dim g = e.Graphics
  Dim w = g.VisibleClipBounds.Width
  Dim h = g.VisibleClipBounds.Height

  Dim c = 10000I
  Dim p(c) As PointF
  For i = 0 To c
    p(i) = New PointF(w / c * i,h / c * i)
  Next

  g.DrawLines(Pens.Aqua,p)

End Sub

引用返信 編集キー/
■51838 / inTopicNo.3)  Re[2]: 印刷プレビュー(PrintPreviewDialog)で表示
□投稿者/ 魔界の仮面弁士 (1714回)-(2010/07/22(Thu) 10:08:49)
No51832 (じいおい さん) に返信
> じいおいです。書いたコードです。
これって、実際のコードでは無いですよね。

変数宣言時の [New] が抜けて、配列宣言になってしまっていたり、
Private もスペルミスしていて、このままでは実行できません。


> プリンタでは、出力できるのに、印刷プレビューではちゃんと表示しません。
当方環境でも同様でした。

さらに言えば、変数 c が 8124 以下であればプレビューされましたが、
c = 8125 以上になると、DrawLines 以降の描画処理が行われませんでした。
http://objectmix.com/dotnet/101440-drawlines-drawpolygon-bug.html


(対策案 1) DrawLines を DrawLine に切り替えて対応する。

 For i = 1 To c
  g.DrawLine(Pens.Aqua, p(i - 1), p(i))
 Next


(対策案 2) 一度に描画する個数を減らして対応する。

 Dim p1 = p.Where(Function(d, i) i < 4000)
 g.DrawLines(Pens.Aqua, p1.ToArray())

 Dim p2 = p.Where(Function(d, i) 4000 <= i AndAlso i < 8000)
 g.DrawLines(Pens.Aqua, p2.ToArray())

 Dim p3 = p.Where(Function(d, i) 8000 <= i)
 g.DrawLines(Pens.Aqua, p3.ToArray())
引用返信 編集キー/
■51839 / inTopicNo.4)  Re[3]: 印刷プレビュー(PrintPreviewDialog)で表示
□投稿者/ じいおい (4回)-(2010/07/22(Thu) 10:58:32)
魔界の仮面弁士 さん、早速の返答ありがとうございます。

> これって、実際のコードでは無いですよね。
> 変数宣言時の [New] が抜けて、配列宣言になってしまっていたり、
> Private もスペルミスしていて、このままでは実行できません。
もうしわけありません。手入力して確認が甘かったです。


> さらに言えば、変数 c が 8124 以下であればプレビューされましたが、
> c = 8125 以上になると、DrawLines 以降の描画処理が行われませんでした。
> http://objectmix.com/dotnet/101440-drawlines-drawpolygon-bug.html
> 
> 
> (対策案 1) DrawLines を DrawLine に切り替えて対応する。
> 
>  For i = 1 To c
>   g.DrawLine(Pens.Aqua, p(i - 1), p(i))
>  Next
> 
> 
> (対策案 2) 一度に描画する個数を減らして対応する。
> 
>  Dim p1 = p.Where(Function(d, i) i < 4000)
>  g.DrawLines(Pens.Aqua, p1.ToArray())
> 
>  Dim p2 = p.Where(Function(d, i) 4000 <= i AndAlso i < 8000)
>  g.DrawLines(Pens.Aqua, p2.ToArray())
> 
>  Dim p3 = p.Where(Function(d, i) 8000 <= i)
>  g.DrawLines(Pens.Aqua, p3.ToArray())

チャートを描画するソフトでして、点数が多いときには何万点にもなるので、DrawLineですと描画に、より時間が掛かってしまいます。
代案2の書き方は、初めて見ました。直感的に分かり易いですね。勉強になります。もしかしてLINQ?

しかしこの現象は、プレビューの仕様なのでしょうか?どうしようもないのでしょう?



引用返信 編集キー/
■51843 / inTopicNo.5)  Re[4]: 印刷プレビュー(PrintPreviewDialog)で表示
□投稿者/ 魔界の仮面弁士 (1715回)-(2010/07/22(Thu) 12:37:34)
No51839 (じいおい さん) に返信
> 代案2の書き方は、初めて見ました。
済みません、Where の内容が微妙に間違っていますね。

A,B,C,D の 4 点に線分を描画する場合、A,B と C,D に分割してしまうと、
線分BC が描画されなくなってしまいます。適宜修正して下さい。


> 直感的に分かり易いですね。勉強になります。もしかしてLINQ?
LINQ です。この場合、クエリ構文では都合が悪いので、拡張メソッドで表現しています。


> しかしこの現象は、プレビューの仕様なのでしょうか?
済みません、そこまでは分かりません。

.NET4 で改善されているかどうかは未検証ですが、3.5 においては、
実験結果からして、恐らく 8124以下/8125以上 が閾値であろうかと予想します。

もしも VB2010 でも解決していないようであれば、フィードバックしておいた方が良いでしょうね。
https://connect.microsoft.com/VisualStudioJapan/


> どうしようもないのでしょう?
緊急性が高い場合には、情報提供や回避策の提案を得るために
Microsoft のサポートを利用するのも手ですよ。
引用返信 編集キー/
■51845 / inTopicNo.6)  Re[5]: 印刷プレビュー(PrintPreviewDialog)で表示
□投稿者/ じいおい (5回)-(2010/07/22(Thu) 13:05:03)
魔界の仮面弁士 さん

どうしてそうなるのか分からなく、ずっとそこでハマり込んでいたので助かりました。
そうなるものとして分割して対応しようと思います。
いろいろ丁寧に教えていただきどうもありがとうございました。



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -