いつもお世話になっております。質問させていただきます。
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等を
使って、行数の文字数を取得したりもしてみたのですが、
ずれてしまいます。実行画面と印字を同じイメージにするに
は、どのようにして文字列を区切ったらできますでしょうか?
どなた様かご教授、よろしくお願いします。
SendMessageで1行ずつ取り出して1行ずつ印字すれば良いと思います。
編集 削除nanashiさん、ご回答ありがとうございます。
先頭行の文字列は取得できたのですが、次の行へ指定行が移動せず、
2行目以降の文字列が取得できませんでした・・。
SendMessageにEM_GETLINECOUNTで行数を取得して行数*文字数で行指定
ではだめなのでしょうか・・?
SendMessage(Text1.hWnd, EM_LINEFROMCHAR, XXXXX, ByVal CLng(0))
のXXXXX部分の指定方法がだめなようなのですが・・。
追記です。
文字列の行指定はできました。が、印字すると最後の1文字が印字範囲から
あぶれてしまいます。
@@@@@@@@@@@*
と印刷したいのですが、
@@@@@@@@@@@
*
というような感じです。Printerオブジェクトを使った場合、印字範囲の
幅指定はPrinter.ScaleWidthでするといったようなことがヘルプに書いて
あるのですが、設定しても印字位置が変わりません。過去ログで値が小さ
すぎて見た目にわからないだけでは?という指摘もあったので大きくして
みたのですが、一字だけあふれてしまいます。。
指定項目自体が違うのでしょうか?
EM_FMTLINESメッセージが利用できるかもしれません。
wParamを1にする(ソフト改行文字をONにする)と、折返し部分に
「vbCr & vbCr & vbLf」が挿入されますので、それを
vbNewLineにReplaceしてみるとか。
> 幅指定はPrinter.ScaleWidthでするといったようなことがヘルプに書いて
それだとスケールの指定になるので、想定している物とは、若干異なるかも。
魔界の仮面弁士さん、ご返答ありがとうございます。
すみません。行の指定もうまくできてませんでした。。
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
とやっても、予想通りだめでした。
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