この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

7.4.7 顧客情報の印刷処理
●印刷プレビューフォームが表示されたときの処理

3)プレビュー画面の表示
 55〜70行目が,プレビュー画面を表示する処理部である。

 まず,56行目と57行目において,表示するページ番号を1に設定する。g_Page変数は,2行目で宣言したLong型のグローバル変数である。この変数は,表示しているページ番号を示すものとする。この変数に格納された値は,これから実装してゆく処理で使う。TXT_PAGEテキストボックスはFig.7-45に示したように,表示するページ番号を入力させるテキストボックスである。

 次に59〜65行目において,最大ページ番号を算出する。60行目ではgetMaxPageプロシージャを呼び出し,その戻り値をg_MaxPage変数に格納している。g_MaxPage変数は4行目で宣言したLong型のグローバル変数である。この変数には,最大ページ番号を格納するものとする。この変数に格納された値は,これから実装してゆく処理で使う予定である。肝心のgetMaxPageプロシージャは,全ページ数を戻り値として返すように,後述の「●プレビュー処理」で実装する。63行目では取得した最大ページ数をUpDown_PageアップダウンコントロールのMaxプロパティに設定し,ユーザーがUpDown_Pageアップダウンコントロールならびにそれに結び付けられたTXT_PAGEテキストボックスにおいて最大ページ数以上の値を設定できないような処理にした(アップダウンコントロールの連結については「○表示ページ設定部分」を参照のこと)。65行目は,LABEL_MAXPAGEラベルの文字列を変更するだけの処理である。

 67〜69行目は,実際にプレビュー画面を描画する処理である。まず,69行目ではPicDocピクチャボックスのClsメソッドを呼び出し,描画されているものすべてを消去する。そして次に,70行目にあるようにDrawPreviewプロシージャを呼び出し,プレビュー画面を描画する。

 DrawPreviewプロシージャはプレビュー描画機能を備えたプロシージャで,次の書式で呼び出すように実装する(後述の「●プレビュー処理」を参照)。

DrawPreview 描画するオブジェクト, _
            開始ページ番号, 終了ページ番号

 本来ならば,ここですぐに,最大ページ数を返すgetMaxPageプロシージャとプレビュー画面を描画するDrawPreviewプロシージャを作るべきだが,これらの処理はかなり複雑になるので,もう少しあとで説明する。

  COLUMN    論理単位

 ここで,論理単位について補足説明をしておく。Windowsでは,ユーザーが利用しているディスプレイサイズやプリンタの解像度が違っても,ほぼ同じ大きさの図形を描画することができるよう,絶対的な単位ではなく論理単位という仮想的な値で座標や大きさを扱う。

 プリンタの場合,論理単位と絶対的な単位は同じである。つまり,1論理インチ=1インチ,1論理ミリメートル=1ミリメートル,1論理センチメートル=1センチメートルである。一方,画面の場合には,論理単位と絶対的な単位は必ずしも一致しない。なぜならば,ユーザーが使っているディスプレイの大きさと解像度によって,大きさが変わってくるためである。

 ディスプレイの解像度は画面のプロパティの[設定]−[詳細]ページで設定される(Fig.7-52)。

Fig.7-52 画面のプロパティの[設定]−[詳細]ページ
fig7_52a
fig7_52b

 Fig.7-52の場合,画面の解像度は96dpiになっている(これは筆者が使っている環境の場合である。個々の環境に応じて,設定内容は異なる)。そのため,ディスプレイに表示する際には,96dpiとして表示される。本稿の執筆時点で,筆者はFig.7-52のディスプレイを横:1792ピクセル,縦:1344ピクセルの設定で使っている。ディスプレイの解像度は96dpiであるから,大きさは横:1792÷96=18.6[インチ],縦:1344÷96=14[インチ],となる。

 だが,この値は実際にユーザーが見ている絶対的な大きさとは一致することはない。なぜなら,ビデオカードに接続されているディスプレイの大きさによって適時,拡大縮小されるためである。たとえば,17インチディスプレイの場合の実サイズは横:13.6[インチ],縦:10.2[インチ],21インチディスプレイの場合の実サイズは横:16.8[インチ],縦:12.6[インチ]となる。つまり,96dpiであっても,それが正確に96dpiに相当した横18.6[インチ],縦:14[インチ]の大きさで表示されるのではなく,接続しているディスプレイの大きさに依存するということになる。

 一般にプログラムを開発するときには,あまり論理単位と絶対単位を区別しなくてもよい。なぜなら,プリンタの場合には論理単位と絶対単位が一致するし,ディスプレイの大きさによってユーザーに見える大きさが違うというのはあたりまえだからである。しかし,SDKのドキュメントなどには,「論理単位」という言葉がかなり多く登場するので,資料を読むときにはこういった知識が役立つだろう。

Prev 45/134 Next