VB6.0
WindowsXP
Printerオブジェクトで印刷をするプログラムを作成しています。
行間を設定する方法がわからないので教えてください。
文字列は 1 行ずつ Print で描画するようにし、
各行の開始位置は CurrentY プロパティで位置調整してみてください。
文字列の本来の高さは、TextHeight メソッドで測定できます。
魔界の仮面弁士さん
回答ありがとうございます。
CurrentYで設定するということは、少しやってみましたが
1行ずつずれてしまいます。それは、現状ScaleMode=vbCharacters
で設定しているからだと思われます。
行間を設定するプロパティは存在しないのでしょうか。
探してみたけどわかりませんでした。
> CurrentYで設定するということは、少しやってみましたが
> 1行ずつずれてしまいます。それは、現状ScaleMode=vbCharacters
> で設定しているからだと思われます。
vbCharacters であろうとなかろうと、特に関係ないと思いますよ。
たとえ、1行ずつずれてしまうような事があったとしても、CurrentY には
小数値も設定できますので、「1行ずつずれる」事が分かっているのであれば、
それを踏まえて、そこから -0.5 行なり、+0.3 行なりの補正を加えれば良いかと。
で、その「1行ずれ」ですが…もしかして、Tab 関数を併用していませんか?
たとえば
For n = 1 To 10
Printer.Print Tab(1); n, n; "TEST",
Next
などのように、Tab 関数によって次行送りが発生するようなケースにおいては、
既定の行間で描画されることになります。
もし、Tab関数などを使っているわけでも、データに改行等があるのでも無いなら、
Print メソッドの利用時に、末尾改行を抑制しているかどうかを確認してみてください。
一応サンプル。
Option Explicit
Private Sub Form_Load()
'行の高さ(%)
HScroll1.Min = 50
HScroll1.Max = 200
HScroll1.Value = 100
HScroll1.LargeChange = 10
HScroll1.SmallChange = 1
'プレビュー代わりのPictureBox
Picture1.ScaleMode = vbCharacters
Picture1.Font.Size = 12
Picture1.FontTransparent = True
'印刷用
Text1.Text = "一行目" & vbCrLf & "二行目" & vbCrLf & "終わり"
Command1.Caption = "印刷"
End Sub
Private Sub HScroll1_Change()
Caption = CStr(HScroll1.Value) & "%"
Picture1.Refresh
End Sub
Private Sub HScroll1_Scroll()
Caption = CStr(HScroll1.Value) & "%"
Picture1.Refresh
End Sub
Private Sub Text1_Change()
Picture1.Refresh
End Sub
Private Sub Picture1_Paint()
Dim rows() As String
rows = Split(Text1.Text, vbCrLf)
Dim h As Single
h = Picture1.TextHeight("X") * CSng(HScroll1.Value) / 100!
Dim y As Single, s As Variant
Picture1.Cls
y = 0!
For Each s In rows
Picture1.CurrentY = y
Picture1.CurrentX = 0!
Picture1.Print Tab(1); s;
y = Picture1.CurrentY + h
Next
End Sub
Private Sub Command1_Click()
Dim rows() As String
rows = Split(Text1.Text, vbCrLf)
Printer.ScaleMode = vbCharacters
Dim h As Single
h = Printer.TextHeight("X") * CSng(HScroll1.Value) / 100!
Dim y As Single, s As Variant
y = 0!
For Each s In rows
Printer.CurrentY = y
Picture1.CurrentX = 0!
Printer.Print s;
y = Printer.CurrentY + h
If y > Printer.ScaleHeight Then
y = 0!
Printer.NewPage
End If
Next
Printer.EndDoc
End Sub
魔界の仮面弁士さん
回答ありがとうございます。お礼の書込みを忘れていました。
申し訳ありません。
教えていただいたサンプルをアレンジして、思った動作をさせることができました。
ありがとうございます。
ツイート | ![]() |