チュートリアル > DotNet の使用 > DotNet を使用した印刷 |
次のチュートリアルでは、DotNet を使用してテキスト ファイルを表示、印刷するときの基本事項を示します。
3ds Max 固有のコントロールを含むカスタム アセンブリをロードします。
フォント名 Arial、フォント サイズ 10 で System.Drawing.Font クラスのオブジェクト インスタンスを作成して、このオブジェクトを後で使用するためにユーザ変数に格納します。
System.Drawing.Size オブジェクトを使用して、フォームのサイズを 640 x 480 に設定します。
また、フォームの境界スタイルを、System.Windows.Forms.FormBorderStyle クラスによって公開される定義済みの FixedToolWindow に設定します。
あるいは、左側の hForm.FormBorderStyle 値は右側で割り当て元とするクラスと同一となることを利用して、次のようにできます。
...新しいフォームが Windows のタスクバーに表示されないことを確認します。
ここで、印刷するファイルの内容を表示するテキストボックスが必要になります。
このテキストボックスは複数行テキストには対応しますが、ワード ラップには対応しません。
txtTextBox.Size = dotNetObject "System.Drawing.Size" 500 430 txtTextBox.Location = dotNetObject "System.Drawing.Point" 10 10
このテキストボックスには 500x430 ピクセルが格納され、その左上隅はフォームの左上隅に対して相対的に、座標 10,10 に配置されます。
btnOpenFile = dotNetObject "System.Windows.Forms.Button" btnOpenFile.Location = dotNetObject "System.Drawing.Point" 520 10 btnOpenFile.Text = "Open File"
新しいボタン オブジェクトを作成して、その位置をフォーム内の座標 520,10 に設定します。キャプションは[ファイルを開く](Open File)となります。
btnPrint = dotNetObject "System.Windows.Forms.Button" btnPrint.Location = dotNetObject "System.Drawing.Point" 520 40 btnPrint.Text = "Print"
新しいボタン オブジェクトを作成して、その位置をフォーム内の座標 520,40 に設定します。キャプションは[印刷](Print)となります。
frmOpenFileDialog = dotNetObject "System.Windows.Forms.OpenFileDialog" frmOpenFileDialog.Filter = "txt files (*.txt)|*.txt|Script Files (*.ms)|*.ms|ini files (*.ini)|*.ini|XML files (*.xml)|*.xml|All files (*.*)|*.*"
印刷するファイルを選択するために、通常のファイル タイプをフィルタする OpenFileDialog オブジェクト セットが必要になります。
[ファイルを開く](Open File)ボタンが押されたときに呼び出されるイベント ハンドラ関数が必要になります。
以前に定義済みの OpenFileDialog を使用します。このため、ダイアログの結果と定義済みの結果とを比較するための DialogResult クラスを含むユーザ変数が必要になります。
ダイアログを表示してユーザにファイルを取得させる OpenFileDialog オブジェクトの ShowDialog() メソッドを呼び出します。値が戻されたら、ダイアログの戻り値と DialogResult クラスの OK 値とを比較して、(ユーザによるキャンセルではなく)処理が正常に終了したことを確認します。
IOFile = dotNetClass "System.IO.File" txtTextBox.Text = IOFile.ReadAllText frmOpenFileDialog.Filename
有効なファイルが選択されたら、System.IO.File クラスを使用して、ファイルを読み込み、その内容をフォームのテキストボックスに割り当てます。System.IO.File クラスの ReadAllText メソッドを呼び出し、引数として OpenFileDialog により返されるファイル名を渡します。このメソッドの結果はテキストボックスのテキストに割り当てられます。
ここで、ローカル変数の filetoprint に選択したファイル名を格納します。このファイル名はファイルの印刷時に使用できます。
[印刷](Print)ボタンのイベント ハンドラ関数を定義する前に、印刷処理全体を実行する関数が必要です。これは 2 つの引数、つまり sender と event をとります。
テキストの処理時に行数を増加させるカウント変数が必要となります。
1 ページごとの行数を計算するには、マージン内にあるドキュメントの印刷ページの高さを、印刷フォントの高さで除算する必要があります。
この変数は、印刷する垂直位置を計算、格納するために使用されます。
この変数には、DrawString メソッドで以降に必要となるオブジェクトが含まれます。
カウンタがページごとの行数よりも少ない間は、以下を繰り返します
ストリームリーダから行を読み込みます - 初めに変数が開始され、[印刷](Print)ボタンのイベント ハンドラに割り当てられます。
currentline 変数に未定義のものが含まれている場合(つまり、ファイルの最後に達しても読み込みが続く場合)には、ループを終了します。
現在の行カウンタによるフォント強度の高さを上部のマージンに追加することによって、印刷する垂直位置を計算します。
最後に、左マージンと同じ水平位置、および前のステップで計算された yPos 値と文字列形式オブジェクトに基づくフォーマットに従った垂直位置にある現在のフォントおよびブラシを使用して、現在の行の文字列を描画できます。
カウンタに 1 が加算され、ページの最後またはファイルの最後に達するまでループが繰り返されます。
ループが終了した理由を確認します - 現在の行が定義されている場合、印刷するページ数が多いため、PrintDocument オブジェクトの対応するプロパティを設定して印刷を続ける必要があるかどうかを通知します。
[印刷](Print)ボタンのイベント ハンドラを定義できるようになりました。
印刷用に選択したファイル名が空の文字列でない場合は、次の処理を試行します。
スクリプトの先頭で初期化される streamReader 変数を System.IO.Streamreader クラスの dotNetObject インスタンスに設定します。これは、MAXScript の fileStream 値に類似しており、ディスク上のファイルに対する IO アクセスが可能になります。
また、実際の印刷を行う PrintDocument オブジェクトを作成します。
イベント ハンドラを、以前に定義した MAXScript 関数を呼び出す PrintDocument オブジェクトに追加します。
PrintDocument オブジェクトの Print() メソッドを呼び出して、印刷を開始することができます。これによって、各ページにつき 1 回、PrintDocument の hasMorePages プロパティが、戻り値が返されるポイントで false に設定されるまで、印刷のイベント ハンドラ関数が呼び出されます。
印刷コードに問題がある場合は、エラーを捕捉し、前回の例外を出力します。
)--end if )--end fn dotNet.AddEventHandler btnOpenFile "Click" btnOpenFile_Click dotNet.AddEventHandler btnPrint "Click" btnPrint_Click
以前に定義した 2 つのイベント ハンドラ関数を 2 つのボタンに追加できるようになりました。
テキストボックスと 2 つのボタンもフォームに追加できます。
スクリプト化されたイベント ハンドラを DotNet コントロールに追加し、コントロールをラップする MAXScript 値より長い寿命をもつフォームにこれらのコントロールを配置しているため、これらのボタンの寿命コントロールが DotNet によりコントロールされるように設定します。
上記の方法は、その他の DotNet オブジェクトに配置される DotNet オブジェクトにのみ適用されるものです。
イベント ハンドラがあり、オブジェクトの寿命コントロールで変更が生じないようにする場合の例として、タイマ オブジェクトがあります。オブジェクトをラップしている MAXScript 値が削除されるときにタイマ オブジェクトを削除したい場合があります。タイマ オブジェクトの寿命コントロールを #dotnet に設定すると、DotNet オブジェクトではタイマ オブジェクトへの参照が維持されないため、以降のランダムなポイントで DotNet ガベージ コレクションによってタイマ オブジェクトが削除されます。