MSX Datapack wiki化計画

11章 ディスプレイマネージャ

※
※ このページは書きかけです。以下の可能性があります。
※ ・誤字、脱字等のチェックをおこなっていません。
※ ・テキスト、表などフォーマットがされていない。
※ ・画像が抜けている。
※

 この章では、ディスプレイマネージャの構成や各ファンクションについて説明します。

 11.1 ディスプレイマネージャとは

 MSXViewでの画面表示はすべて、VDP(V9958)のビットマップグラフィックスモードを使用したオーバーラップウィンドウ(互いに重なりあうことのできるウィンドウ)環境で行われます。ディスプレイマネージャは、このオーバーラップウィンドウ環境を統一的に管理する重要なマネージャで、VDPの4種類すべてのビットマップグラフィックスモードを使用することができます。
 MSXViewでは、ウィンドウ環境を維持するために、画面への表示は必ずディスプレイマネージャをとおして行います。一般的なオーバーラップウィンドウ環境(例えば、MacOSやMS-Windowsなど)では、他のウィンドウによって隠されたウィンドウを表に出すためには、アプリケーションがウィンドウを再描画しなければなりません。しかし、MSXViewのウィンドウ環境では、ウィンドウの重なりにより失われる部分は、ディスプレイマネージャが自動的に退避・回復するので、アプリケーション側で、再描画する必要はありません。ただし、重ねられるウィンドウの総面積は、裏VRAM1画面分までに制限されます。このウィンドウを、「FLOATウィンドウ」と呼びます。
 FLOATウィンドウは、画面上に開ける面積に限りがあるため、MSXViewには、「FIXウィンドウ」というオーバーラップができないウィンドウもあります。各アプリケーションの描画領域、作業領域など大きな面積を使用する部分をウィンドウ管理するには、FIXウィンドウが便利です。FIXウィンドウは重なりあうことができませんが、FIXウィンドウとFLOATウィンドウとが重なりあうことはできます。

 11.2 ディスプレイマネージャの使い方

 画面に何かを描くときは、以下の手順で処理を進めます。

  1. 描画するウィンドウをカレントウィンドウにする。
  2. 描画するエリアをズームする。
  3. グラフパック、フォントパックなどを使用して描画する。
  4. エンドズームして、描画環境を回復する。
  5. ウィンドウ環境を元に戻す。

 画面に何か図形を描くときは、ウィンドウ上の描画領域をズームし、グラフパック、フォントパックを使って書き込んで行きます。ズーム中は描画領域内では、カーソルは自動的に消えます。書き込みが終了したら、必ずエンドズームして、描画環境を元に戻して下さい。
 ウィンドウ間を図形が横切るような特別の場合(ウィンドウの移動など)は、ダイレクトにルートボードに書き込むこともできますが、ラバーバンド(11.3.1「ルートボード」参照)を使うなどして、画面を壊さないように注意して下さい。

 11.3 ディスプレイマネージャの構成

 ディスプレイマネージャは、以下のような概念で画面を管理します。

11.3.1 ルートボード

 ルートボードとは、ウィンドウが配置される画面そのもので、画面と同じサイズの特殊なウィンドウです。画面上で動くことのない情報などを表示します。ウィンドウを移動するときは、_setrub()を使って、ルートボード上にラバーバンドで枠を表示することができます。ルートボードは色とタイルパターンを持つことができます。MSXViewでは、ルートボードも1つのウィンドウとして扱うようになっており、ウィンドウハンドル1が割り当てられています。

11.3.2 ウィンドウ

 ウィンドウには「FIXウィンドウ」と「FLOATウィンドウ」の2種類があります。「FIXウィンドウ」には、「FLOATウィンドウ」にはない制限があります。

FIXウィンドウ
 FIXウィンドウとは、退避画面エリアを持たないウィンドウのことです。このウィンドウには、画面を保存する領域がないので、クローズしたときは画面の情報が消えてしまいます。FIXウィンドウどうしを重ねることはできませんが、画面上で重ならない限り、画面一杯まで開くことができます。

FLOATウィンドウ
 FLOATウィンドウと違い、制限はありません。自由に重ねあうことができ、移動させることもできます。ただし、開けるFLOATウィンドウの面積は、合計で画面1枚分までです。

表3.4 FLOATウィンドウの種類

名前
TWIN何もなし(特別な用途のための透明なウィンドウ)
CWIN枠なし
FWIN枠つき
RWIN角の丸い枠つき
IWINインデックス(上端の角が丸い枠)つき
SWIN影付き(右下に影がつく)
BWIN二重枠つき

画像ファイルが存在しません。
図3.2 各ウィンドウの形状

 通常の描画領域にはFWINを、ポップアップメニューなど注目させたい部分には、SWINまたはBWINを使うのが一般的です。
 それぞれのウィンドウがどのように定義されているかは、9.3.1「ウィンドウスタイルの定数」を参照して下さい。

11.3.3 ズームの概念

11.3.4 ディスプレイマネージャで使用するデータ構造

表3.5 statusの内容

ビット意味
7FIX
6Closed
5Clear
4reserved
3Window style
2Window style
1Window style
0Window style

11.3.5 ペンハンドルとフォントハンドル

 MSXViewでは、描画のための環境をペン(PEN)と呼び、文字の属性を表現するためのさまざまな情報の集まりをフォントテンプレート(FONT)と呼びます。ディスプレイマネージャは、PENやFONTを、ハンドルを通して扱うための機能を持っています。これらの情報をハンドル管理することにより、以下のようなメリットがあります。

  • PEN、FONTなどはサイズの大きな構造体なので、ハンドルで管理するとメモリ効率が良い。
  • 複数のモジュールで共通のPEN、FONTを簡単に共用することができる。
  • 異なるウィンドウでは、描画に使用するペンやフォントの環境が大きく異なることが多いが、PENやFONTをウィンドウの属性として持たせておくことで、ウィンドウを切り換えるだけで、PENやFONTも自動的に切り替えられる。

 PENやFONTの詳細については、グラフパック及びフォントパックを参照して下さい。

11.3.6 デフォルトとカレント

 ペンハンドルとフォントハンドルには、それぞれカレントペン、カレントフォントが1つだけ存在します。同時に複数のペンやフォントがカレントになることはありません。グラフパックはカレントペンに基づいて描画し、フォントパックはカレントフォントに基づいて、文字を表示します。
 カレントペンを変更するには、_chpen()、_pushpen()などのファンクションを使用します。また、カレントフォントを変更するには、_chfont()、_pushfont()などのファンクションを使用します。
 これとは別に、デフォルトペン、デフォルトフォントというものが、ウィンドウごとに存在します。これは、ウィンドウを作成した時に指定したペンとフォントのことで、_chpen(0)、_chfont(0)などの簡単な手続きで、カレントペンやカレントフォントをデフォルトペン、デフォルトフォントに戻すことができます。そのウィンドウで、最も使用頻度の高いペンやフォントをデフォルトにしておくと便利です。

 11.4 ファンクション一覧

 ディスプレイマネージャには、以下のファンクションがあります。

表3.6 ディスプレイマネージャのファンクション一覧

機能番号名前意味ページ
2_screen()スクリーンモードの設定406
47_initpenhd()ペンハンドルの初期化399
48_createpen()ペンの作成400
49_deletepen()ペンの削除401
50_chpen()カレントペンの変更402
51_currentpen()カレントペンの獲得402
52_pushpen()保存をともなうカレントペンの変更403
53_poppen()カレントペンの復帰403
54_penadrs()ペン情報の獲得404
55_renewpen()ペンの更新405
56_getdefpen()デフォルトペンの獲得406
57_initfonthd()フォントハンドルの初期化400
58_createfont()フォントの作成401
59_deletefont()フォントの削除401
60_chfont()カレントフォントの変更402
61_currentfont()カレントフォントの獲得403
62_pushfont()保存をともなうカレントフォントの変更404
63_popfont()フォントの復帰404
64_fontadrs()フォント情報の獲得405
65_renewfont()フォントの更新405
66_getdeffont()デフォルトフォントの獲得406
68_clearrootbd()ルートボードのクリア399
71_initwin()ウィンドウマネージャの初期化389
72_createwin()ウィンドウの作成390
73_openwin()カレントペンの変更391
74_closewin()カレントペンの変更391
75_deletewin()ウィンドウの削除392
76_clearwin()ウィンドウのクリア392
77_getwininfo()ウィンドウ情報の獲得392
78_setwininfo()ウィンドウの変更393
79_frontwin()ウィンドウを最前面に移動393
80_backwin()ウィンドウを最後面に移動394
81_movewin()ウィンドウの位置の移動394
82_resizewin()ウィンドウサイズの変更395
83_findwin()ウィンドウハンドルの獲得395
84_chwin()カレントウィンドウの変更396
85_currentwin()カレントウィンドウの獲得396
86_pushwin()保存をともなうカレントウィンドウの変更396
87_popwin()カレントウィンドウの復帰397
88_gtol()グローバル座標からローカル座標への変換397
89_ltog()ローカル座標からグローバル座標への変換397
90_movepopup()ポップアップウィンドウ位置の設定399
91_zoom()エリアのズーム398
92_zoomwin()ウィンドウのズーム398
93_endzoom()ズームの終了398
374_screensize()スクリーンサイズの獲得407
388_getscreenmode()スクリーンモードの獲得407

 11.5 ファンクションの説明

 以下では、ディスプレイマネージャの各ファンクションについて説明します。

11.5.1 表記法

 ファンクションの説明では、次のように表記します。

ファンクションの機能を示します

機 能 番 号

 各ファンクションに割り当てられている番号です。

書 式
 各ファンクションを使用するときの書式を示します。
戻 り 値
 そのファンクションの動作の結果、どのような値が返されるのかを示します。
解 説
 そのファンクションがどのような動作をするかを示します。