Scintilla/Printing

Last-modified: 2008-03-01 (土) 22:01:29

印刷

Windowsでは、プリンタ表示コンテキストを含むことができる表示コンテキストを作成するのにSCI_FORMATRANGEを使用できる。
プリント出力はスクリーンのようにテキストスタイリングを示しているが、それは行番号マージン以外のすべてのマージンを隠す。
すべての特別なマーカー効果を取り除き、選択とキャレットを隠す。

  • SCI_FORMATRANGE(bool bDraw, RangeToFormat *pfr)
  • SCI_SETPRINTMAGNIFICATION(int magnification)
  • SCI_GETPRINTMAGNIFICATION
  • SCI_SETPRINTCOLOURMODE(int mode)
  • SCI_GETPRINTCOLOURMODE
  • SCI_SETPRINTWRAPMODE
  • SCI_GETPRINTWRAPMODE

SCI_FORMATRANGE(bool bDraw, RangeToFormat *pfr)

Windowsで、指定範囲の文字列をデバイスコンテキストにレンダリングする。
これを印刷に用いた場合、ページのヘッダやフッタも欲しいところだが、Scintillaは特に何もしない。
SciTEWinDlg.cxxのSciTEWin::Print()のコードを例として参照せよ。
これらのメッセージはそれぞれテキストを矩形範囲にレンダリングし、文書内で次に印刷を始める位置を返す。


bDrawは出力が実行されたかどうかを制御する。
丁づけする場合はfalseにする。
たとえばMFCで使うなら各頁を出力する前にOnBeginPrinting()の中で丁づけする必要があるだろう。

struct RangeToFormat {
    SurfaceID hdc;        // The HDC (device context) we print to
    SurfaceID hdcTarget;  // The HDC we use for measuring (may be same as hdc)
    PRectangle rc;        // Rectangle in which to print
    PRectangle rcPage;    // Physically printable page size
    CharacterRange chrg;  // Range of characters to print
};

hdcとhdcTargetは両方とも出力デバイス(通常はプリンタ)のデバイスコンテキストハンドルである。
Windowsメタファイル(拡張メタファイルではないようなもの)とは異なるメタファイルに印刷するときは、返値の情報にすべてのAPIを実装しない。
この場合、hdcTargetには画面のデバイスコンテキストを設定する。
rcPageは{0, 0, maxX, maxY}の形で指定する矩形である。
maxX+1とmaxY+1は物理的な印刷可能ピクセル数の横方向と縦方向の値である。
rcはテキストをレンダリングする範囲である。
当然ながらrcPageの内側に収まるように指定する。
chrg.cpMinとchrg.cpMaxは出力する文字の開始位置と最大位置を指定する。
この文字範囲の中のそれぞれの行のすべてが描かれる。


印刷に当たってもっとも面倒なのは、ヘッダとフッタの印刷や印刷不可区域を考えた上の余白をどうすればいいかいうことである。
SciTE の印刷に関するコードでは、その大部分をこの構造体によって定めている。
余白、印刷不可区域、ヘッダ、フッタを切り落としてしまえばScintillaのテキストレンダリングループはとても単純である。

SCI_SETPRINTMAGNIFICATION(int magnification)

SCI_GETPRINTMAGNIFICATION

画面のフォントとは異なる大きさで印刷するにはSCI_GETPRINTMAGNIFICATION を用いる。
magnificationは画面上での大きさに加算される値でポイント単位である。

  • 3や-4は小さく印刷するの便利である。
    この値はSCI_GETPRINTMAGNIFICATIONで取得できる。

SCI_SETPRINTCOLOURMODE(int mode)

SCI_GETPRINTCOLOURMODE

これら2個のメッセージは、たぶん白い紙を使用しているプリンタ上で設定して、着色されたテキストを印刷するために使うメソッドをセットおよび取得する。
暗いか黒い画面の背景を使用するなら、色の処理を考えるのは特に重要です。
黒に白で印刷すると、トナーとインクは逆より非常に多く早く使いきられる。
あなたは以下のモードのうち1個を設定できる:

 

[heart] 表: カラー印刷モード

シンボル目的
SC_PRINT_NORMAL0現在のスクリーン色を使って印刷する。これはデフォルトである。
SC_PRINT_INVERTLIGHT1暗い背景色の場合は、明度を反転して白地に印刷することでインクを節約する。
SC_PRINT_BLACKONWHITE2白の背景に黒ですべてのテキストを印刷する。
SC_PRINT_COLOURONWHITE3白の背景にそれぞれの色で印刷する。
SC_PRINT_COLOURONWHITEDEFAULTBG4白地に画面通りの色で印刷するが、行番号だけは自分自身の背景色を使う。
 

SCI_SETPRINTWRAPMODE(int wrapMode)

SCI_GETPRINTWRAPMODE

プリンタの行クリップモードを設定または取得する。
wrapModeはSC_WRAP_NONE (0)とSC_WRAP_WORD (1)のいずれかである。
初期設定ではSC_WRAP_WORDになっており、これは行クリップを行うのですべての文字が印刷範囲の矩形に収まる。
SC_WRAP_NONEを指定すると、文書の各行が一行として出力されるので、印刷範囲からはみ出るような長い行は切り捨てられてしまう。
SC_WRAP_CHAR (2)はSC_WRAP_WORDと異なり行クリップのために空白文字列を検索せず、必要な場所で文字を問わずに折り返すようになる。
SC_WRAP_WORDが余白かスタイルによって示されるように、単語だけの間で包装しようとする単語が行より長いかどうかを変える。
SC_WRAP_CHARは単語の間に余白が全くないアジアの言語のためにSC_WRAP_WORDより好まれる。