テキストのプリンタオブジェクトによる印刷範囲を設定するには?

解決


Cappuccino  2004-03-04 23:38:29  No: 112183  IP: [192.*.*.*]

いつもお世話になっております。質問させていただきます。
Text1.MultiLine = True
Text1.Left = 100
Text1.Top = 100
Text1.Text = "文字列文字列文字列@@@@@@@" & _
             "@@@@@@@@@@@@"
Printer.ScaleMode = vbTwips
Printer.CurrentX = Text1.Left
Printer.CurrentY = Text1.Top
Printer.Print Text1.Text
のようなコードで印字する場合、文字列がテキストボック
スに入りきらない場合はテキストボックス内で文字列が折り
変えされるのですが、このままで印字すると、過去ログに
あるように
    文字列文字列文字列@@@@@@@@@@@@
@@@@@@@
というようにずれて印字されてしまいます。
そこで、実行画面のテキストボックスの中で自動的に折り
変えされて表示されている場合と見た目が同じように印字
するために、文字列をテキストボックスの1行目に入って
いる文字数で区切り、そのたびに座標を再設定し1行ずつ印
字するようにして、
    文字列文字列文字列@@@@@@@@
    @@@@@@@@@@@
というように印字したいのです。API関数のSendMessage等を
使って、行数の文字数を取得したりもしてみたのですが、
ずれてしまいます。実行画面と印字を同じイメージにするに
は、どのようにして文字列を区切ったらできますでしょうか?
どなた様かご教授、よろしくお願いします。

編集    削除
nanashi  2004-03-05 03:04:20  No: 112184  IP: [192.*.*.*]

SendMessageで1行ずつ取り出して1行ずつ印字すれば良いと思います。

編集    削除
Cappuccino  2004-03-05 05:19:07  No: 112185  IP: [192.*.*.*]

nanashiさん、ご回答ありがとうございます。
先頭行の文字列は取得できたのですが、次の行へ指定行が移動せず、
2行目以降の文字列が取得できませんでした・・。
SendMessageにEM_GETLINECOUNTで行数を取得して行数*文字数で行指定
ではだめなのでしょうか・・?
SendMessage(Text1.hWnd, EM_LINEFROMCHAR, XXXXX, ByVal CLng(0))
のXXXXX部分の指定方法がだめなようなのですが・・。

編集    削除
Cappuccino  2004-03-05 06:13:12  No: 112186  IP: [192.*.*.*]

追記です。
文字列の行指定はできました。が、印字すると最後の1文字が印字範囲から
あぶれてしまいます。
    @@@@@@@@@@@*
と印刷したいのですが、
    @@@@@@@@@@@

というような感じです。Printerオブジェクトを使った場合、印字範囲の
幅指定はPrinter.ScaleWidthでするといったようなことがヘルプに書いて
あるのですが、設定しても印字位置が変わりません。過去ログで値が小さ
すぎて見た目にわからないだけでは?という指摘もあったので大きくして
みたのですが、一字だけあふれてしまいます。。
指定項目自体が違うのでしょうか?

編集    削除
魔界の仮面弁士  2004-03-05 08:19:10  No: 112187  IP: [192.*.*.*]

EM_FMTLINESメッセージが利用できるかもしれません。

wParamを1にする(ソフト改行文字をONにする)と、折返し部分に
「vbCr & vbCr & vbLf」が挿入されますので、それを
vbNewLineにReplaceしてみるとか。

> 幅指定はPrinter.ScaleWidthでするといったようなことがヘルプに書いて
それだとスケールの指定になるので、想定している物とは、若干異なるかも。

編集    削除
Cappuccino  2004-03-05 09:47:20  No: 112188  IP: [192.*.*.*]

魔界の仮面弁士さん、ご返答ありがとうございます。

すみません。行の指定もうまくできてませんでした。。
1行ずつ文字列を取りだすコードはわかったのですが、
マウスで選択せずに、行指定をするにはどうしたらいい
のでしょうか?行数は
lngLineCount = SendMessage(Text1(intObjIndex).hWnd, _
                           EM_GETLINECOUNT, _
                           0, _
                           ByVal CLng(0))
という風に取得しています。
この戻り値を使って行数指定をしたいのですが・・・。
For intCount = 0 To lngLineCount
・・・・・・
    lngLine = Clng(intCount)
・・・・・
    lngLineIndex = SendMessage(Text1.hWnd, _
                               EM_LINEFROMCHAR, _
                               lngLine, _
                               ByVal CLng(0))


    lngGetLine = SendMessage(Text1.hWnd, _
                             EM_GETLINE, _
                             lngLineIndex, _
                             ByVal strGetTxt)

    Printer.Print Left(strGetTxt, lngGetLine)

Next intCount
とやっても、予想通りだめでした。

編集    削除
Cappuccino  2004-03-05 12:16:42  No: 112189  IP: [192.*.*.*]

nanasiさん、魔界の仮面弁士さん、ご返答ありがとうございました。
すごく参考になりました。下記のコードでほぼ思った印字ができるよ
うになりました。
For intPrnCount = 0 To lngLineCount - 1
    strMidText = vbNullString
    lngCharIndex = SendMessage(Text1(intObjIndex).hWnd, _
                               EM_LINEINDEX, _
                               CLng(intPrnCount), _
                               ByVal CLng(0))
    lngSelLineNo = SendMessage(Text1(intObjIndex).hWnd, _
                               EM_LINEFROMCHAR, _
                               lngCharIndex, _
                               ByVal CLng(0))
    lngWin32ApiReturnCode = SendMessage(Text1(intObjIndex).hWnd, _
                                        EM_FMTLINES, _
                                        CLng(1), _
                                        ByVal CLng(0))
    Replace Text1(intObjIndex).Text, vbCr, vbNewLine
    lngGetLineNo = SendMessage(Text1(intObjIndex).hWnd, _
                               EM_GETLINE, _
                               lngSelLineNo, _
                               ByVal strMidText)
    strGetText = RTrim$(Left$(strMidText, lngGetLineNo))
    .CurrentX = lngX
    .CurrentY = lngY + intPrnCount * .TextHeight(strGetText)
    Printer.Print strGetText
Next intPrnCount

ただ、先ほどの追記で書いた処理なのですが、どうしても
  @@@@@@*

  @@@@@@

になってしまいます。魔界の仮面弁士さんにお答えいただいたように
やってみたのですが、だめでした。(やり方がまずいのかもですが)
とにかくありがとうございました。m(_ _)m

編集    削除