※ ※ このページは書きかけです。以下の可能性があります。 ※ ・誤字、脱字等のチェックをおこなっていません。 ※ ・テキスト、表などフォーマットがされていない。 ※ ・画像が抜けている。 ※
この章では、ディスプレイマネージャの構成や各ファンクションについて説明します。
11.1 ディスプレイマネージャとは
MSXViewでの画面表示はすべて、VDP(V9958)のビットマップグラフィックスモードを使用したオーバーラップウィンドウ(互いに重なりあうことのできるウィンドウ)環境で行われます。ディスプレイマネージャは、このオーバーラップウィンドウ環境を統一的に管理する重要なマネージャで、VDPの4種類すべてのビットマップグラフィックスモードを使用することができます。
MSXViewでは、ウィンドウ環境を維持するために、画面への表示は必ずディスプレイマネージャをとおして行います。一般的なオーバーラップウィンドウ環境(例えば、MacOSやMS-Windowsなど)では、他のウィンドウによって隠されたウィンドウを表に出すためには、アプリケーションがウィンドウを再描画しなければなりません。しかし、MSXViewのウィンドウ環境では、ウィンドウの重なりにより失われる部分は、ディスプレイマネージャが自動的に退避・回復するので、アプリケーション側で、再描画する必要はありません。ただし、重ねられるウィンドウの総面積は、裏VRAM1画面分までに制限されます。このウィンドウを、「FLOATウィンドウ」と呼びます。
FLOATウィンドウは、画面上に開ける面積に限りがあるため、MSXViewには、「FIXウィンドウ」というオーバーラップができないウィンドウもあります。各アプリケーションの描画領域、作業領域など大きな面積を使用する部分をウィンドウ管理するには、FIXウィンドウが便利です。FIXウィンドウは重なりあうことができませんが、FIXウィンドウとFLOATウィンドウとが重なりあうことはできます。
11.2 ディスプレイマネージャの使い方
画面に何かを描くときは、以下の手順で処理を進めます。
- 描画するウィンドウをカレントウィンドウにする。
- 描画するエリアをズームする。
- グラフパック、フォントパックなどを使用して描画する。
- エンドズームして、描画環境を回復する。
- ウィンドウ環境を元に戻す。
画面に何か図形を描くときは、ウィンドウ上の描画領域をズームし、グラフパック、フォントパックを使って書き込んで行きます。ズーム中は描画領域内では、カーソルは自動的に消えます。書き込みが終了したら、必ずエンドズームして、描画環境を元に戻して下さい。
ウィンドウ間を図形が横切るような特別の場合(ウィンドウの移動など)は、ダイレクトにルートボードに書き込むこともできますが、ラバーバンド(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の内容
ビット | 意味 |
7 | FIX |
6 | Closed |
5 | Clear |
4 | reserved |
3 | Window style |
2 | Window style |
1 | Window style |
0 | Window 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 表記法
ファンクションの説明では、次のように表記します。
ファンクションの機能を示します
機 能 番 号 |
各ファンクションに割り当てられている番号です。
書 式 |
戻 り 値 |
解 説 |