tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 改ページ
投稿日: 2006/03/17(Fri) 02:03
投稿者魔界の仮面弁士
No.3270 の、元の内容ってどうなっていましたっけ?
(中途半端に編集されてしまっていて、話の流れが分かりにくくなっているような…)


> しようかと思いあぐねましたが, VB 6.0 のようにサブルーチンして
> Callで呼び出すことができるとわかって、本当にありがたい思いでしたが、
# VB6 でサブルーチンというと、(On...)GoSub / Return の事を指す場合もあるので、
# Sub プロシージャという言い方の方が誤解が少ないかも。


> これから先が、まったくわかりません。
具体的なサンプルは、YASさんが書いてくださっていますので……印刷の考え方について。


どうやら、VB6 での開発経験がおありのようですね。
ならば、VB.NET の印刷処理を考える前に、「VB6 の Timer イベントの処理」を
思い出してみてください。


たとえば、「1 秒ごとに現在時刻を表示」し、それを「5 秒間続けるアプリ」を作る場合、
VB6 では、Timer を使って、このようなコードを書く事ができますよね。
========================================
  Option Explicit
  Private FinishTime As Date

  Private Sub Command1_Click()
    FinishTime = DateAdd("s", 5, Now)  '5秒後の時刻を取得(終了条件)
    Timer1.Interval = 1000
    Timer1.Enabled = True    '★時計の開始★
  End Sub

  '☆繰り返し呼ばれるイベント☆
  Private Sub Timer1_Timer()
    Call DrawTime(Now)       '★描画処理を Call★
    If Now >= FinishTime Then
      Timer1.Enabled = False '★終了条件を満たしたら、このイベントの発生を止める★
    End If
  End Sub

  '☆画面への描画処理☆
  Private Sub DrawTime(ByVal D As Date)
    Label1.Caption = FormatDateTime(D, vbLongTime)
  End Sub
========================================

上記では、Timer イベント自体が呼ばれるたびに、描画処理を Call して、
時刻表示を更新するといった作りになっています。


そして VB.NET の印刷処理も、これと同じような流れで記述する事ができます。

たとえば、「1 ページごとに、現在のページ番号を印字」して、
それを「5 ページ繰り返すアプリ」は、下記のように書けます。

(実行すると、左上に 1〜5 のページ番号が書かれた 5 ページの文書が出力されます)
========================================
  Private 現在のページ番号 As Integer
  Private 終了ページ番号 As Integer

  Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    現在のページ番号 = 1
    終了ページ番号 = 5      '5ページ目が終了条件

    '印刷の場合
    'PrintDocument1.Print() '★印刷の開始★

    'プレビューの場合
    PrintPreviewDialog1.Show()
  End Sub

  '☆繰り返し呼ばれるイベント☆
  Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Call DrawPage(現在のページ番号, e)  '★描画処理を Call★

    現在のページ番号 += 1
    If 現在のページ番号 > 終了ページ番号 Then
      e.HasMorePages = False '★終了条件を満たしたら、このイベントの発生を止める★
    Else
      e.HasMorePages = True
    End If
  End Sub

  '☆ Grahpics への描画処理☆
  Private Sub DrawPage(ByVal ページ As Integer, ByVal e As Printing.PrintPageEventArgs)
    Dim G As Graphics = e.Graphics
    Dim myFont As Font = New Font("MS ゴシック", 220, FontStyle.Bold, GraphicsUnit.Pixel)
    Dim bluePen As Brush = Brushes.Blue.Clone()
    Dim bmpPen As Brush = New TextureBrush(Icon.ToBitmap(), Drawing2D.WrapMode.TileFlipXY)
    G.FillEllipse(bmpPen, 0, 0, 300, 300)
    G.DrawString(CStr(ページ), myFont, bluePen, 40, 40)
    bmpPen.Dispose()
    bluePen.Dispose()
    myFont.Dispose()
  End Sub
========================================


先の VB6 の Timer イベントの処理と、上記の VB.NET の PrintPage イベントの
処理とを、よく見比べて見てください。使っているメソッドやオブジェクトこそ異なりますが、
処理の流れとしては、さほど大きな違いはありませんよね。



なお、5ページ分印刷するからといって、
  Private Sub PrintDocument1_PrintPage(……
    For 現在のページ番号 = 1 To 終了ページ番号
      Call DrawPage(現在のページ番号, e)
      If 現在のページ番号 > 終了ページ番号 Then
        e.HasMorePages = False
      Else
        e.HasMorePages = True
      End If
    Next
  End Sub
といった書き方はできません。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。