# 日本語 OpenVMS
日本語画面管理ライブラリ
利用者の手引き

前へ | 次へ | 目次 | 索引

## 2.2.6 仮想ディスプレイの属性の変更

SMG$CREATE_VIRTUAL_DISPLAY ルーチンを使用して仮想ディスプレイを作成する場合には，仮想ディスプレイ内に表示されるすべてのテキストに対して省略時の属性を指定します。既存の仮想ディスプレイの属性は， SMG$CHANGE_VIRTUAL_DISPLAY ルーチンを呼び出すことにより変更できます。

SMG$CHANGE_VIRTUAL_DISPLAY ルーチンを使用すれば，ディスプレイ全体のビデオ属性とディスプレイ属性の両方を変更できます。

仮想ディスプレイに対して省略時の属性を指定するには，ビット・マスクを使用してディスプレイ属性引数にビットを設定します。次の各ビットを設定できます。

表 2-1 ビットの設定
SMG$M_BLINK | 点滅文字を指定します。
SMG$M_BOLD | 通常より明るい輝度の文字を指定します。
SMG$M_REVERSE | 文字を反転表示することを指定します。つまり，仮想ディスプレイの現在の属性の反対の状態で，文字を表示します。
SMG$M_UNDERLINE | 下線付き文字を指定します。
SMG$M_INVISIBLE | 表示されない文字を指定します。つまり，文字は仮想ディスプレイ内に存在しますが，ペーストボードには表示されません。
SMG$M_USER1 から SMG$M_USER8 | ユーザ定義属性を指定します。

SMG$M_USER1 から SMG$M_USER8 のユーザ定義属性を使用する場合には， STRING_2 機能を使用して， TERMTABLE.TXT ファイルに適切な定義を指定しなければなりません。 TERMTABLE 定義と STRING_2 機能については 第 5 章 を参照してください。

これまで示した属性の一部またはすべてを，仮想ディスプレイの属性として指定できます。複数のビデオ属性を指定する場合には，これらの属性の論理和を使用します。たとえば，仮想ディスプレイの省略時の設定として下線付き文字を反転表示することを指定する場合には，適切なビット・マスクの論理和を display-attributes 引数に割り当てます。

    Display_attributes = ( SMG$M_REVERSE OR SMG$M_UNDERLINE )

この後，SMG$CREATE_VIRTUAL_DISPLAY ルーチンを呼び出すとき，この display-attributes 引数を指定します。

日本語 SMG 出力ルーチンを使用すれば，省略時の属性を変更できます。このようにすれば，他の属性でテキストを書き込むときに，そのたびに省略時の設定を変更する必要がなくなります。省略時の属性を変更するには，2 つの引数を使用します。それは rendition-set 引数と rendition-complement 引数です。これらの引数にビデオ属性を設定する方法は，仮想ディスプレイを作成するときにビデオ属性を設定する方法と同じです。

省略時のビデオ属性，rendition-set 引数，および rendition-complement 引数を組み合わせることにより，次の方法に従って，出力属性を指定できます。

1. 省略時のビデオ属性と rendition-set 引数を格納したマスクに対して，論理和またはビット単位の論理和演算が実行されます。

2. 前の論理和演算の結果と rendition-complement 引数に対して，排他的論理和演算またはビット単位の排他的論理和演算が実行されます。

この方法の結果は次の表に示すとおりです。

set | complement | 動作
--- | --- | ---
0 | 0 | 属性を省略時の値に設定する。
1 | 0 | 属性をオンに設定する。
0 | 1 | 属性を省略時の値の補数に設定する。
1 | 1 | 属性をオフに設定する。

この方法の結果は，仮想ディスプレイの現在の属性ではなく，省略時の属性設定に対して決まります。したがって，属性を明示的に指定する日本語 SMG 出力ルーチンをすでに使用している場合には，現在の属性はその仮想ディスプレイの省略時の属性と一致しない可能性があります。

## 2.2.7 ラインとライン描画文字を描く操作と削除する操作

水平線と垂直線を作成するための簡単な方法として， 3 つのルーチンが準備されています。

- SMG$DRAW_LINE ルーチンは指定されたラインの端点をもとに，水平線または垂直線を作成します。

- SMG$DRAW_RECTANGLE ルーチンは，指定された左上の角と右下の角の位置をもとに，長方形を描きます。

- SMG$DRAW_CHAR ルーチンは1文字のライン描画文字を描きます。

SMG$DRAW_LINE ルーチンまたは SMG$DRAW_RECTANGLE ルーチンを使用して描いたラインを消去する場合には， SMG$REMOVE_LINE ルーチンを使用します。このルーチンはラインを削除しますが，ラインの交点にあるライン描画文字は保存されます。

他のすべての日本語 SMG ルーチンと同様に，これらのルーチンも装置から独立しています。ラインを VT 100 で描く場合には，VT 100 の曲線描画文字設定が使用されます。同じラインを VT 52で描く場合には ( VT 52はこのハードウェア機能を備えていません )，ラインはプラス記号 (+)，縦線 (|)，ダッシュ (--) を使用することにより自動的に近似されます。ユーザ・プログラムが各ターミナル・タイプに対して異なる文字コードを提供する必要はありません。

さらに，これらのルーチンは2本のラインの交点に，適切な文字を自動的に描きます。たとえば，プログラムが画面に直接水平線を書き込み，その後，その水平線と交差する垂直線を書き込む場合には，通常， 図 2-7 のようになります。

図 2-7 SMG$DRAW_LINE ルーチンを使用せずに描いたライン

SMG$DRAW_LINE ルーチンを使用して，これらの同じラインを描いた場合には，画面は 図 2-8 に示すようになります。

図 2-8 SMG$DRAW_LINE ルーチンを使用して描いたライン

## 2.2.8 外部テキストの表示

外部テキストを仮想ディスプレイまたはターミナルに表示する， 2 つのルーチンがあります。

- SMG$PUT_HELP_TEXT ルーチンは，仮想ディスプレイに指定されたトピックのヘルプ・テキストを出力します。

- SMG$PUT_STATUS_LINE ルーチンは，テキスト行をターミナルのハードウェア・ステータス行に出力します。一部のターミナルでは，ハードウェア・ステータス行がスクリーンの一番下(25行目)にあります。この行が「ホスト制御」に設定されていれば，このルーチンを使って1行のテキストを出力することができます。

## 2.2.9 仮想ディスプレイからの読み込み

SMG$READ_FROM_DISPLAY ルーチンを使用すれば，仮想ディスプレイからテキストを簡単に読み込むことができます。このルーチンは，仮想ディスプレイを使用することにより，画面にメニュー項目を表示するアプリケーションで使用できます。このようなアプリケーションでは，ユーザはメニュー項目間でカーソルを移動し，その後，適切な項目を選択できます ( たとえば，`[Return]` を押すことにより )。この時点で，プログラムはディスプレイの現在のカーソルの位置から文字を読み込み，どのメニュー項目が選択されたかを判断できます。

このルーチンはまた，SMG$M_INVISIBLE 属性を使用して書き込まれた文字を読み込むための方法としても使用できます。

## 2.2.10 ビューポート

仮想ディスプレイは非常に大きくなる可能性があるため，ディスプレイ全体を一度に画面に表示できるとは限りません。ユーザは大きな仮想ディスプレイの各部分を表示するために，仮想ディスプレイを再ペーストしなければなりません。仮想ディスプレイに対応づけられたビューポートはこの操作を容易にします。

ビューポート操作 とは，仮想ディスプレイの各部分を表示するために，仮想ディスプレイ上で長方形の表示領域を移動する処理のことです。ビューポートは仮想ディスプレイに対応づけられるため，仮想ディスプレイに対して実行され，出力操作はすべて，ビューポート上で反映されます。

### 2.2.10.1 ビューポートの作成

SMG$CREATE_VIEWPORT ルーチンは，特定の仮想ディスプレイに対応するビューポートを作成します。仮想ディスプレイは,ビューポートを作成する前に作成しておかなければならず，各仮想ディスプレイに対してビューポートを1つだけ作成できます。

ビューポートを表示するには， SMG$PASTE_VIRTUAL_DISPLAY ルーチンを呼び出すことにより，仮想ディスプレイをペーストしなければなりません。仮想ディスプレイの中で，ビューポートの内部に存在する部分だけが表示されます。

### 2.2.10.2 ビューポートの削除

ビューポートは SMG$DELETE_VIEWPORT ルーチンを使用して削除できます。このルーチンを呼び出すと，ビューポートはペーストされているペーストボードから自動的にアンペーストされます。しかし，ビューポートに対応づけられている仮想ディスプレイは削除されません。したがって，SMG$PASTE_VIRTUAL_DISPLAY ルーチンを呼び出すことにより，その仮想ディスプレイを表示できます。

### 2.2.10.3 ビューポートのペーストとアンペースト

SMG$PASTE_VIRTUAL_DISPLAY ルーチンは，ビューポートまたは仮想ディスプレイをペーストボードにペーストします。ビューポートを仮想ディスプレイに対応づけた後， SMG$PASTE_VIRTUAL_DISPLAY ルーチンを呼び出す場合には，仮想ディスプレイではなく，ビューポートが使用されます。つまり，仮想ディスプレイに対するビューポートを作成した後，その仮想ディスプレイの中で表示できる部分は，ビューポートの内部に含まれる長方形の領域だけです。ビューポートを削除せずに，そのビューポートをアンペーストする場合には， SMG$UNPASTE_VIRTUAL_DISPLAY ルーチンを使用します。

対応する仮想ディスプレイがすでにペーストされているときに，ビューポートを作成する場合には，そのビューポートは表示されません。 SMG$PASTE_VIRTUAL_DISPLAY ルーチンを呼び出すと，仮想ディスプレイはアンペーストされ，その場所にビューポートがペーストされます。

### 2.2.10.4 ビューポートのスクロールと移動

仮想ディスプレイに対応するビューポートは，ペーストボードに全体，またはある一部分をペーストできます。あるいはペーストボードの完全な外に置くこともできます。ただし，ビューポートは対応づけられた仮想ディスプレイを越えて拡大することはできません。仮想ディスプレイの境界をこえてビューポートを拡張しようとした場合には，日本語 SMG は仮想ディスプレイの内部に収まるように，自動的にビューポートを切り詰めます。

ビューポートを "スクロール" するには，そのビューポートに対応する仮想ディスプレイをスクロールします。この場合には，SMG$SCROLL_VIEWPORT ルーチンを呼び出します。実際には，スクロールをシミュレートするために，ビューポートが仮想ディスプレイ上で移動するたびに，ビューポートの座標が変化します。しかし，画面上でのビューポートの位置は変化しません。 SMG$SCROLL_VIEWPORT ルーチンを使用する場合には，スクロールの方向(上，下，左，右)を指定できます。

ビューポートを移動する場合には，SMG$CHANGE_VIEWPORT ルーチンを呼び出します。このルーチンを使用する場合には，ビューポートの新しい開始位置とサイズを指定できます。ビューポートの開始位置とサイズを変更すれば，仮想ディスプレイ上でウィンドウを移動できます。

### 2.2.10.5 ビューポート属性の変更

SMG$GET_VIEWPORT_CHAR ルーチンを使用すれば，ビューポートの現在の属性を検索できます。ビューポートの属性は，ビューポートの開始行と終了行，および開始カラムと終了カラムで構成されます。このルーチンは SMG$CHANGE_VIEWPORT ルーチンと組み合わせて使用でき，既存のビューポートの開始位置と終了位置を変更できます。

開始位置または終了位置以外のビューポート属性を変更する場合には， SMG$CHANGE_VIRTUAL_DISPLAY ルーチンを使用しなければなりません。仮想ディスプレイへのすべての変更は，対応するビューポートで反映されます。

たとえば，仮想ディスプレイに境界がある場合には，対応するビューポートにも境界があります。仮想ディスプレイに境界がない場合には，ビューポートにも境界がありません。ビューポートに境界を追加したり，削除する場合には，SMG$CHANGE_VIRTUAL_DISPLAY ルーチンを使用して仮想ディスプレイに境界を追加するか，または仮想ディスプレイから境界を削除します。この変更操作はビューポートで自動的に反映されます。

## 2.2.11 メニュー

日本語 SMG には，メニューに選択項目を作成する機能とメニューから項目を選択する機能があります。メニューはブロック・メニュー，垂直メニュー，水平メニューのいずれでもかまいません。ブロック・メニューは項目を2次元に並べた配列であり，おもに使用されるメニュー・タイプです。垂直メニューはメニュー項目を1列に縦に並べて表示し，水平メニューはメニュー項目を1行に横に並べて表示します。ビューポートの境界内に収まらないメニュー項目は，表示領域にスクロールされるまで表示されません。

### 2.2.11.1 メニューの作成

SMG$CREATE_MENU ルーチンは，指定された仮想ディスプレイのスクロール領域にメニューを作成します ( 省略時の設定では，スクロール領域は仮想ディスプレイ全体です。 SMG$SET_DISPLAY_SCROLL_REGION ルーチンを使用すれば，スクロール領域を変更できます )。メニューを作成するときに，メニューの形式 ( ブロック，垂直，水平のいずれか ) を指定します。

ブロック・メニューはメニューの省略時の形式です。メニュー内の項目は一定の文字列配列の形式でルーチンに渡されます。省略時の設定では，各メニュー項目はシングル・スペースで配置されますが，ダブル・スペースも要求できます。水平方向には，各メニュー項目は4つのスペースで区切られます。さらに，メニュー項目を 固定形式 カラムに表示することも要求できます。この場合には，カラムの幅は渡される固定長文字列のサイズに等しくなります。

各仮想ディスプレイには，1 つのメニューだけを格納できます。また，SMG$CREATE_MENU ルーチンを呼び出した後，ディスプレイ内のメニューを格納した領域に，他の文字を出力することはできません。このような操作を実行すると，予測できない結果になります。メニューは仮想ディスプレイのスクロール領域に出力されます。

### 2.2.11.2 メニューの削除

メニューを削除するには，SMG$DELETE_MENU ルーチンを使用します。このルーチンは，指定された仮想ディスプレイ内のメニュー項目に対するアクセスを禁止します。さらに，SMG$DELETE_MENU ルーチンがメニューを削除するときに，すべてのメニュー項目をディスプレイから削除することも要求できます。

### 2.2.11.3 メニューからの選択

メニューを作成した後， SMG$SELECT_FROM_MENU ルーチンを使用してそのメニューから項目を選択できます。 1 つのメニュー項目から別のメニュー項目に移動すると，省略時の設定では，現在選択されている項目が反転表示されます。 SMG$SELECT_FROM_MENU ルーチンを呼び出したときに，省略時の選択項目を指定できます。省略時の選択項目を指定しなかった場合には，前に選択した項目が強調表示されたままになります。

SMG$SELECT_FROM_MENU ルーチンには，3 種類の操作モードがあります。これらのモードは flags 引数を使用して切り換えることができます。各モードについては，この後の項で説明します。

#### 2.2.11.3.1 省略時のモード

SMG$SELECT_FROM_MENU ルーチンの省略時の操作モードは， flags 引数を省略することにより有効になります。このモードでは，矢印キーを使用して各メニュー項目間を移動でき，項目を選択した後，別の項目を追加選択できます。また，省略時のモードでは，すでに選択されている項目を "再選択" できます。

#### 2.2.11.3.2 RETURN_IMMED モード

SMG$SELECT_FROM_MENU ルーチンの flags 引数の値として， SMG$M_RETURN_IMMEDを指定した場合には，矢印キーを使用してメニュー項目間を移動できます。しかし，他のキーを押すと，制御はユーザに戻されます。 `[Ctrl/Z]` は現在の項目を選択し，SMG$_EOF を戻します。他のキーを押した場合には，現在の項目が選択されます。

省略時のモードが提供するキー定義以外のキー定義が必要な場合には， SMG$M_RETURN_IMMED モードを使用します。

前へ | 次へ | 目次 | 索引