4.3 DOSのコンソールエミュレータ

目次のページ; 前のページ; 次のページ

 DOSの環境では、見かけは一つのモニタ画面ですが、機能の異なるキャラクタディスプレイとグラフィックスディスプレイとが同居しています。したがって、例えば、N88-Basic, Quick Basic のCLS文は、パラメータによって、二種の画面を選択して消去するような機能になっています。二種の画面の機能を指示する命令も別々になっていて、文字位置の座標指定は SCREEN文、LOCATE文、グラフィックスの座標系を指定するには VIEW文、WINDOW文などを使い分けます。VBでは、文字と図形とは共に座標指示がグラフィックス座標になりました。文字の場合と図形の場合とでは座標系の考え方が異なりますので、VB_Graphics では別々の子ウインドウに分け、それぞれに、グラフィックスの用語でいうウインドウ・ビューポート変換を行って座標系を定義します。コンソールウインドウ上の文字位置を指定するプロシージャとして、Nscreen, Nlocate を作成してあります。これらは、プロトタイプの標準モジュール N88sub0.bas にまとめました。主要部分のリストを次ページに載せました。このモジュールは、コンソールのフォームデザインと関連付けてありますので、フォームモジュール Console0.frmと対で使用します。

 下のリスト中の Nscreen プロシージャが、文字表示に関するウインドウ・ビューポート変換を行うものです。文字表示に考えている画面は640×400ピクセルであって、そのアスペクト比 0.625 はコモン定数として aspect0 で引用しています。

 コンソールウインドウ(子)の寸法とアスペクト比は任意に変更できますので、この作業領域(フォーム)の有効寸法を求めます。コンソールウインドウの標準設計では、テキスト入力用の一行文のテキストボックスをフォームの最上段に貼付けますし、メニューバーなどの領域に高さが食われますので、その高さ相当を引いた分が有効領域になります。そして、この有効領域から実効のアスペクト比 asp を計算します。

 フォーム上に、原稿画面として考えたアスペクト比 aspect0 を持ったピクチャーボックスを最大に接する様に左上詰めで載せます。このとき、asp と aspect0 との大小関係で、フォームに右か下かに余白がでます。ピクチャーボックスの背景色を白とし、フォームの背景色を灰色にしましたので、有効なピクチャーボックスの寸法と配置とが分ります。

 次いで、このピクチャーボックスに文字位置を指定する座標系を割り付けます。これは原稿画面のピクセル数に基づく相対的な座標値、ここでは640×400を割り付けます。文字幅と文字高さとは、この値にたいして8×16に割り当てます。この文字高さは、モニタの解像度を考えて、モニタ上の実寸法を Screen.TwipsPerPixelY で計算し、表示に利用する文字フォントのポイント数を決定します。文字の寸法は連続的には変化させることができませんので、システムは、計算値に近いポイント数を自動的に選んでくれます。Windowsのシステムが提供している文字の字体は種々ありますが、MS明朝体がポイント数の選択の幅が広く、画面の寸法に比較的よく馴染む表示が得られます。他の字体のフォントを選ぶと、ポイント数の選択の範囲が狭いことがありますので、文字並びが思ったようになりません。

 文字の書き出し位置の指定は、Nlocate プロシージャで指定します。DOSの場合には文字は等幅フォントでしたので、文字位置の調整には適当な数のスペースを使う事ができました。Windows では基本的にプロポーショナルフォントですので、文字並びの調整にスペースを挟む方法が使えません。等幅フォントも使えなくもないのですが、一般的な方法ではありません。

 プロシージャのNscreen と Nlocate とは、文字表示の環境設定をしますので、表示するテキストの体裁に関しては一般に言う文字の書式処理で行わせます。この処理に関しては、N88-Basic, Quick Basic では PRINT-USING文が、また FORTRAN では FORMAT 文を使いました。VBではUSING文が無く、その代りに Format 関数が定義されました。表のような形式で文字並びを縦に揃えたいときは、タブ、文字コードの Chr(9) を併用します。文字データの入出力に関するプロシージャは、標準モジュール ConsoleIO.bas に集めました。

'=======================================================
'       N88-Console Screen-Control Subroutines
'=======================================================
Public Sub Nscreen()
    Dim asp, pwidth, pheight, ppwidth, ppheight
    FormConsole.ScaleMode = 1
    pwidth = FormConsole.Width
    pheight = FormConsole.Height - 2.5 * FormConsole.Prompt.Height
    asp = pheight / pwidth
    If asp > aspect0 Then
        ppwidth = pwidth
        ppheight = pwidth * aspect0
        FormConsole.Picture1.Top = FormConsole.Prompt.Height
        FormConsole.Picture1.Left = 0
    Else
        ppwidth = pheight / aspect0
        ppheight = pheight
        FormConsole.Picture1.Top = FormConsole.Prompt.Height
        FormConsole.Picture1.Left = 0
    End If
'
    FormConsole.Picture1.Width = ppwidth
    FormConsole.Picture1.Height = ppheight
    Xwidth = FormConsole.Picture1.Width / Screen.TwipsPerPixelX
    Yheight = FormConsole.Picture1.Height / Screen.TwipsPerPixelY
    Ifont = Yheight / 40
    FormConsole.Picture1.FontSize = Ifont
    FormConsole.KeyInText.Width = FormConsole.Width - FormConsole.Prompt.Width
'
    FormConsole.Picture1.ScaleLeft = 0
    FormConsole.Picture1.ScaleTop = 0
    FormConsole.Picture1.ScaleWidth = 640
    FormConsole.Picture1.ScaleHeight = 400
    FormConsole.Show FormConsole.Picture1
End Sub
'--------------------------------------------------------------------------
Public Sub Nlocate(IX As Integer, iy As Integer)
    FormConsole.Picture1.CurrentX = 8 * IX
    FormConsole.Picture1.CurrentY = 16 * iy
End Sub
'--------------------------------------------------------------------------
Public Sub Mcolor(icol As Integer)
    Icolor = QBColor(icol)
    FormConsole.Picture1.ForeColor = Icolor
End Sub

次のページ