IMPORT WEVENT wevt;
typedef struct { W wid; /* ウィンドウID */ W chgmod; /* ウィンドウ属性 */ /* 0x10+(W_MOVE/W_MOVEC/WHOLD):全面モード可 */ /* 0x20 : ドラッグ変形禁止 */ /* 0x40 : ドラッグ移動禁止 */ RECT limit; /* 変形リミット */ W pid[3]; /* スクロールバーパーツID */ W info[2]; /* アプリケーション用 */ } WINFOREC;
typedef WINFOREC *WINFOPTR;
typedef struct { W (*bgfn)(void); /* バックグラウンド処理 */ VOID (*idlefn)(void); /* idle 処理 */ W (*msgfn)(MESSAGE *msg); /* 一般メッセージ処理 */ W (*menufn)(void); /* メニュー処理 */ VOID (*dspfn)(W ix, W mode, RECT *new); /* 表示処理 */ VOID (*stsfn)(W ix, W sts); /* 状態変化処理 */ W (*keyfn)(void); /* キー入力処理 */ W (*presfn)(W ix); /* PDプレス処理 */ W (*finfn)(W ix, W mode); /* 終了処理 */ W (*pastefn)(W ix, PNT pos); /* 張り込み処理 */ W (*respfn)(W ix, W cmd); /* 応答処理 */ VOID (*scrlfn)(W ix, W type, W diff); /* スクロール処理 */ VOID (*devfn)(TC *devname); /* デバイスイベント処理 */ VOID (*vobjfn)(W ix); /* 仮身要求イベント処理 */ } WFUNCREC; typedef WFUNCREC *WFUNCPTR;
IMPORT FUNCP p_oprc_dev;
|
W evt_loop(WFUNCPTR wf, WINFOPTR wi)
WFUNCPTR wf ウィンドウイベント関数テーブルへのポインタ WINFOPTR wi ウィンドウ情報レコードへのポインタ
= 0 処理継続 ≠ 0 処理終了
イベントループ処理を実行する。 アプリケーションは処理対象とするファイル ( 実身 ) をオープンして必要な情報を取り出し、 ウィンドウを開いた後に、この関数を実行してイベントループ処理に入る。
各イベント処理関数で戻された値を返す。
イベントループ処理では、順次ウィンドウ・イベントを取り出し、取り出したイベントに対応した関数を実行する。
wi
は、使用するウィンドウに関する属性を示す、
以下のウィンドウ情報レコード配列へのポインタである。
typedef struct { W wid; -- ウィンドウID(0は最後、< 0 は無効) W chgmod; -- ウィンドウ属性 RECT limit; -- 変形リミット W pid[3]; -- スクロールバー・パーツID W info[2]; -- アプリケーション情報 } WINFOREC;
typedef WINFOREC *WINFOPTR;
ウィンドウ情報レコード配列は、
使用するウィンドウの個数 + 1 の要素が必要であり、
最後の要素の wid
は 0 でなければならない。
ウィンドウ情報レコード配列の内容は、evt_loop()
を実行した後も、イベント処理関数の中で動的に変更することが可能である。
従って、ウィンドウの数自体が動的に変化する場合は、
あらかじめ 最大数 + 1
の要素のウィンドウ情報レコード配列を用意しておき、
無効なウィンドウに対しては,wid
として負の値を設定しておくことになる。
ウィンドウ情報レコード配列上でのインデックス値
( 0 〜 ) は、
対象ウィンドウの識別のために使用され、evt_loop()
関数の中から起動されるイベント処理の関数にも、
このインデックス値が、
イベントの対象となったウィンドウの識別情報として渡される。
ウィンドウ属性は、ウィンドウの移動 / 変形 / 全面モードの可否を示す以下の値である。
XXXX XXXX XMSF XXmm
wchg_wnd()
の mode
パラメータの値であり、
W_MOVE
、W_MOVEC
、
W_HOLDのいずれかの値
。
F = 0
の場合は意味を持たない。
変形リミットは、ウィンドウ属性の S=0
の場合にのみ意味を持ち、
ウィンドウのドラッグ変形の最小 / 最大サイズを示し、
wrsz_drg()
のパラメータとしてそのまま使用される。
ただし、変形リミットをすべて 0 とした場合には、
wrsz_drg()
の limit
パラメータは
NULL
とされる。
スクロールバー・パーツ ID は、以下の 3
つのスクロールバーのパーツIDであり、
最初の evt_loop()
実行時に自動的に設定されるため、
特にアプリケーション側で設定する必要はない。
pid[0] -- 右スクロールバー ( < 0 は未設定を意味する) pid[1] -- 下スクロールバー ( < 0 は未設定を意味する) pid[2] -- 左スクロールバー ( < 0 は未設定を意味する)
ただし、evt_loop()
実行後にアプリケーションによってウィンドウを追加した場合、
その追加したウィンドウの情報に対しては自動的に設定されないので、
アプリケーションの側で設定しなければならない。
(スクロールバーを持つ場合は対応するスクロールバー・パーツIDを設定し、
スクロールバーを持たない或いは対応するスクロールバーがない場合は、
負の値を設定しなければならない)
アプリケーション情報は、
アプリケーション側で任意に使用できるデータであり、
evt_loop()
関数では、
参照も変更もしないデータである。
wf
は、ウィンドウ・イベントに対応する関数を示す、
ウィンドウ・イベント関数テーブルへのテーブルへのポインタである。
この内容も、evt_loop()
実行後に動的に変更することが可能である。
これらの関数ポインタは、
使用しない場合には NULL
として良いものもあるが、
いくつかの関数は必ず設定しなくてはいけない。
typedef struct { W (*bgfn)(void); /* バックグラウンド処理 */ VOID (*idlefn)(void); /* idle 処理 */ W (*msgfn)(MESSAGE *msg); /* 一般メッセージ処理 */ W (*menufn)(void); /* メニュー処理 */ VOID (*dspfn)(W ix, W mode, RECT *new); /* 表示処理 */ VOID (*stsfn)(W ix, W sts); /* 状態変化処理 */ W (*keyfn)(void); /* キー入力処理 */ W (*presfn)(W ix); /* PDプレス処理 */ W (*finfn)(W ix, W mode); /* 終了処理 */ W (*pastefn)(W ix, PNT pos); /* 張り込み処理 */ W (*respfn)(W ix, W cmd); /* 応答処理 */ VOID (*scrlfn)(W ix, W type, W diff); /* スクロール処理 */ VOID (*devfn)(TC *devname); /* デバイスイベント処理 */ VOID (*vobjfn)(W ix); /* 仮身要求イベント処理 */ } WFUNCREC; typedef WFUNCREC *WFUNCPTR;
取り出したウィンドウ・イベントは、 以下の外部変数に格納されるので、 イベント処理関数で直接使用することができる。
IMPORT WEVENT wevt;
イベントループ処理では、 基本的に、 イベントの取り出しとイベントのタイプに応じた各処理の関数の呼び出しを行うが、以下に示す定型的な処理も行っているため、 アプリケーションは、基本的に、 このライブラリ関数を使用してイベントループ処理を行う必要がある。
unget_wevt()
により、戻されたイベントの処理。
W (*bgfn)(void);
ウィンドウが入力受付状態でない場合のバックグラウンド処理のための関数であり、
wf->bgfn= NULL
の場合は、
ウィンドウ・イベントは
WAIT
モードで取り出される。NULL
でない場合は、ウィンドウ・イベントは NOWAIT
モードで取り出され、EV_NOMSG
が得られた場合、
この関数が実行される。
関数値 ≠ 0 の場合は、evt_loop()
からリターンし、
evt_loop()
の関数値は、bgfn()
の関数値となる。
VOID (*idlefn)(void);
EV_NULL
が得られた場合に実行される。
通常は、ポインタ形状の変更 ( 自ウィンドウ内にポインタがある時 )、
カレット / 選択領域のチラツキ処理等を行う。
wf->idlefn = NULL
の場合は何もしない。
W (*msgfn)(MESSAGE *msg);
EV_MSG
が得られた場合に実行される。
msg
は、
得られた一般メッセージの先頭 4 バイトが格納されている領域へのポインタである。
この関数では、rsv_msg()
によりメッセージを取り出して対応する処理を行なうことになる。
関数値≠ 0 の場合は、evt_loop()
からリターンし、
evt_loop()
の関数値は、msgfn()
の関数値となる。
wf->msgfn = NULL
の場合は得られたメッセージを取り出して捨てる。
W (*menufn)(void);
EV_MENU
が得られた場合に実行される。
実行時にはポインタ形状は「選択指」の形状に変更されているため、
関数の中ではポインタ形状を設定する必要はない。
関数値≠0 の場合は、evt_loop()
からリターンし、
evt_loop()
の関数値は、menufn()
の関数値となる。
wf->menufn = NULL
の場合は何もしない。
VOID (*dspfn)(W ix, W mode, RECT *new);
ウィンドウの表示用の関数であり、
ix
は対象ウィンドウのウィンドウ情報レコード配列のインデックス
( 0 〜) を示し、
mode
は、以下の再表示要因を示す。
再表示の要否 | newの値 | ||
---|---|---|---|
mode | = -1 : 初期表示要求 | 要 | NULL |
= 0 : 再表示要求イベント | 要 | NULL | |
= 1 : ドラッグ移動 | 要 | NULL | |
= 2 : ドラッグ変形 | 否 | 新作業領域 | |
= 3 : ドラッグ変形 | 要 | 新作業領域 | |
= 4 : 通常モード切換 | 否 | 新作業領域 | |
= 5 : 全面モード切換 | 要 | 新作業領域 | |
= 6 : 通常モード切換 | 要 | 新作業領域 | |
= 7 : パネル削除 | 要 | NULL | |
= 8 : 配置変更 | 否 | 新作業領域 | |
= 9 : 配置変更 | 要 | 新作業領域 |
初期表示要求は、evt_loop()
を実行した場合に、
最初の一回目だけウィンドウ情報レコード配列に登録してあるウィンドウに対して発生する。
パネル削除は、パネルが削除された場合に、
パネルに隠れていたウィンドウに対して呼び出されるもので、
パネル表示中にウィンドウの内容を変更した場合に再表示を行なう必要がある。
ウィンドウの内容を変更していない場合は、
再表示を行なう必要はない。
この要求は、WA_BGDSP
属性を持つウィンドウでかつ、
bgfn≠NULL
の場合のみ発生する。
配置変更は、ウィンドウの配置が変更された場合に発生する。
再表示が必要な場合は、wsta_dsp()
〜wend_dsp()
により、
再表示の必要な領域を取り出して、速やかに再表示を行なう必要がある。
wf->dspfn = NULL
であってはいけない。
ウィンドウの配色などが変更された場合、以下の外部変数に 1 が設定されて、
再表示要求イベントが発生する。
ウィンドウ情報レコードからパターンや色の情報を取り出して使用している場合には、
再表示処理で、この外部変数が 1 に設定されている場合は、ウィンドウ情報レコード
を再度取り出して処理する必要がある。
IMPORT W wcolor_changed; /* ウィンドウ配色変更 */
VOID (*stsfn)(W ix, W sts);
ウィンドウの状態変更に対して実行される関数であり、
ix
は対象ウィンドウのウィンドウ情報レコード配列のインデックス
( 0 〜 ) を示し、
sts
は、以下の状態変更要因を示す。
sts | = 0 | : EV_INACT が発生 ( 他ウィンドウへの切り換え) |
= 1 | : EV_SWITCH または EV_RSWITCH が発生 | |
= 2 | : W_SWITCH が発生 (他ウィンドウからの復帰) | |
= 0x100 | : EV_INACT が発生 (パネルへの切り換え) | |
= 0x102 | : W_SWITCH が発生 (パネルからの復帰) | |
< 0 | : W_CLOSED が発生 (クローズした wid は -sts となる) |
EV_RSWITCH
が発生した場合は、
まず dspfn()
が実行され、
その後、stsfn()
が、sts = 1
で実行され、
最後に PD のプレス位置に応じて presfn()
等が実行される。
EV_SWITCH
が発生した場合は、
stsfn()
が sts = 1
で実行され、
次に PD のプレス位置に応じて presfn()
等が実行される。
sts = 2(W_SWITCH)
の場合は、
stsfn()
の実行後に、PDのプレスに対応する処理が実行されるので、
stsfn()
では状態変更の処理のみを行なうことになる。
sts=0x100 (EV_INACT)
、0x102(W_SWITCH)
は、
それぞれパネルがオープンされた場合、
および、クローズされた場合に発生する。
パネルの場合は、表示イメージは保存 / 復帰されるため、
原則として表示を変更する処理を行ってはいけない。
sts = 0,1,2
および sts < 0
のときは、
ウィンドウ内のパーツはすべて P_ACT
状態、
かつ P_NODISP
状態に設定されるため、
パーツの再表示を行う必要がある。
また、sts = 0
の時は、
ウィンドウ内のパーツはすべて P_INACT
状態、
かつ P_NODISP
状態に設定されるため、
パーツの再表示を行う必要がある。
wf->stsfn = NULL
であってはいけない。
W (*keyfn)(void);
EV_KEY, EV_AUTKEY
が発生した場合に実行される関数である。
関数値 ≠ 0 の場合は、evt_loop()
からリターンし、
evt_loop()
の関数値は、keyfn()
の関数値となる。
wf->keyfn = NULL
の場合は何もしない。
W (*presfn)(W ix);
ウィンドウの作業領域内での PD プレスに対して実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示す。
関数値≠ 0 の場合は、
evt_loop()
からリターンし、
evt_loop()
の関数値は、presfn()
の関数値となる。
wf->presfn = NULL
の場合は何もしない。
W (*finfn)(W ix, W mode);
ウィンドウの終了要求に対して実行される関数であり、
ix
は対象ウィンドウのウィンドウ情報レコード配列のインデックス
( 0 〜 ) を示し、mode
は、以下の終了要求要因を示す。
mode | = 0 | : ピクトグラムのダブルクリックによる終了要求 |
= 1 | : W_DELETE 要求イベントによる終了要求 | |
= 2 | : W_FINISH 要求イベントによる終了要求 |
mode = 0
の場合、
関数値≠ 0
の時は、evt_loop()
からリターンし、
その関数値は finfn()
の関数値となる。
mode=1 (W_DELETE 要求)
の場合、
アプリケーションは編集中の内容に変更があれば、
パネルを表示せずに、その内容を保存した後、
ウィンドウを閉じてできる限り迅速に処理を終了しなくてはいけない。
mode=2 (W_FINISH 要求)
の場合、
アプリケーションは編集中の内容を廃棄して即座にウィンドウを閉じて処理を終了しなくてはいけない。
mode = 1, 2
で、
終了要求を受け入れる場合は、関数値≠0 を戻すことにより、
要求を発したプロセスに W_ACK
レスポンスが戻され、
evt_loop()
からリターンし、
その関数値は finfn()
の関数値となる。
終了要求を受け入れられない場合は、
関数値 = 0を戻すことにより、
要求を発したプロセスに W_NAK
レスポンスが戻され、
evt_loop()
は続行される。
終了要求の応答は即座に戻す必要があるため、
finfn()
では、受け入れの可否のみを判断し、
実際のウィンドウのクローズ処理等は finfn()
を終了した後に行う必要がある。
wf->finfn = NULL
であってはいけない。
W (*pastefn)(W ix, PNT pos);
ウィンドウへのドラッグによる貼り込み要求 ( W_PASTE
要求イベント )
に対して実行される関数であり、 ix
は対象ウィンドウのウィンドウ情報レコード配列のインデックス
( 0 〜 ) を示し、pos
は貼り込み位置 ( 相対座標 ) を示す。
pos
は通常、貼り込まれるデータ領域の左上の位置を示すものとする。
従って W_PASTE
要求イベントを送信する側のアプリケーションは、
pos
として貼り込むデータ領域の左上の座標値を、
貼り込み先のウィンドウの相対座標値で設定する必要がある。
さらに、要求イベントを送信する側のアプリケーションは、
貼り込んだ時点のポインタの座標値を、
貼り込み先のウィンドウの相対座標値で、
wevt.s.time
に次の形式で設定しておく必要がある。
ビッグエンディアンの CPU の場合:( pt.x << 16 | pt.y
)
リトルエンディアンの CPU の場合:( pt.y << 16 | pt.x
)
通常は、エンディアンに関係なく wevt.s.time = PNTtoUW(pt)
のように記述するとよい。
貼り込みの処理では、pos
で指定されるデータ領域の左上の位置、
もしくはwevet.s.time
で示されるポインタの位置のいずれかを使用することになる。
関数値 = W_ACK
の場合は ACK
レスポンスが戻され、
関数値 ≠ W_ACK
の場合は NAK
レスポンスが戻される。
アプリケーションによっては、
すべての貼り込みは複製として取り扱いたいケースがあり、
そのような場合は、W_ACK
の関数値を戻す前に、
wevt.s.pos.x = wevt.s.pos.y = 0x8000
に設定しておく。
貼り込んだ側のアプリケーションは W_ACK
の応答が得られたとき、
wevt.s.pos.x == wevt.s.pos.y == 0x8000
の場合は、
移動ではなく常に複写として取り扱わなくてはいけない。
貼り込みに伴う再表示等に時間がかかる場合は、
貼り込み元でのタイムアウトとなる可能性があるため、
できるだけ早く、pastefn()
を終了し、
別途、再表示を行う必要がある。
wf->pastefn = NULL
の場合は何もせずに、NAK
レスポンスが戻される。
W (*respfn)(W ix, W cmd);
何らかの応答イベントを受信した場合に実行される関数であり、
ix
は対象ウィンドウのウィンドウ情報レコード配列のインデックス
( 0 〜 ) を示し、cmd
は受信した応答イベントの cmd を示す。
cmd には W_ACK
または W_NAK
が必ずセットされている。
関数値≠0
の場合は、evt_loop()
からリターンし、
evt_loop()
の関数値は、respfn()
の関数値となる。
wf->respfn = NULL
の場合は何もしない。
VOID (*scrlfn)(W ix, W type, W diff);
ウィンドウのスクロール要求に対して実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示し、 type はスクロールの種類を示す以下の値である。
XXXX XXXX XXCC TTDD
CC =
TT =
DD =
X
diff
はジャンプスクロールの場合、
( ジャンプスクロール前の clo
の値 )
- ( ジャンプスクロール後の clo
の値) となる。
スムースクロールの場合、
この値は連続したスムーススクロール中のスクロール処理関数の呼び出しカウント
( 最初は 0 ) を示す値となる。
ページスクロールの場合、この値は意味を持たない。
アプリケーションは対応するスクロール処理を行なった後、 スクロールバー表示に更新を行なう必要がある。
ウィンドウにスクロールバーが存在する場合は、
wf->scrlfn = NULL
であってはいけない。
スクロールバーが存在しない場合は、wf->scrlfn = NULL
でよい。
なお、ユーザ環境設定によってスクロール動作が追従して表示されるよう設定されている場合は、
対応するスクロールバーに対してcchg_par( PID, P_DRAGBREAK)
によって、
追従スクロールへの対応がアプリケーションの側からも宣言されている場合に限り、
追従スクロールを行うことができる。
VOID (*devfn)(TC *devname);
EV_DEVICE
が発生した場合に、
実身 / 仮身マネージャの oprc_dev()
関数を実行した後に、
実行される関数であり、devname
には、EV_DEVICE
の対象となる論理デバイス名へのポインタが渡される。
ディスク挿入による EV_DEVICE
の場合は、
実身/仮身マネージャの処理により、
すでにディスクは接続されており、
その接続名は論理デバイス名と同一である。
ただし、システムディスクの接続名は "SYS"
となる。
実身/仮身マネージャの oprc_dev()
の代わりに特殊な関数を実行させたい場合は、
evt_loop()
を実行する前に、
関数ポインタ p_oprc_dev
に oprc_dev()
と互換の特殊な関数を設定しておくことにより、
設定した特殊な関数を oprc_dev()
の代わりに実行させることができる。
wf->devfn = NULL
の場合は何もしない ( 実身 / 仮身マネージャの処理は実行される )。
VOID (*vobjfn)(W ix);
仮身要求イベント ( W_VOBJREQ
) が発生した場合に実行される関数であり、
ix
は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示す。
仮身要求イベントは、 実身/仮身マネージャから発行される
cmd = W_VOBJREQ
の要求イベントであり、
wevt.g.data[2]
により、
その要求のタイプが示される。いずれの場合も応答イベントは戻されない。
wevt.g.data[2] = | 0 | 名称変更された |
1 | 処理状態になった | |
2 | 処理状態が解除された | |
3 | 虚身状態になった | |
4 | 虚身状態が解除された | |
5 | 虚身ウィンドウになった | |
6 | 虚身ウィンドウが解除された | |
7〜14 | (予約) | |
15 | 仮身の変更通知 | |
16 | 仮身の挿入要求(ファイルシステム接続) | |
17 | 仮身の挿入要求(新規実身への保存) | |
18〜 | (予約) | |
128 | 編集内容の一時ファイルへの格納要求 | |
wevt.g.data[3] = |
対象仮身ID ( vid )ただし、虚身ウィンドウの場合は、 ウィンドウの生成元の仮身ID ( vid ) |
oend_prc()
の結果、
または実身管理情報パネルで変更された場合に送信される。
従って、アプリケーションはこのイベントを受信した場合は、
登録した仮身/付箋の内容が変更されているため、
保存時には、仮身/付箋の状態と取り出して保存する必要がある。
wevt.g.data[3]
にその仮身IDが入っているので、
その仮身の情報を取り出して自プロセスの管理下に置く必要がある。
登録された仮身はウィンドウの右上に位置しているが、
必要に応じて位置を移動してもよい。
wevt.g.data[3]
にその仮身 ID が入っているので、
その仮身の情報を取り出して自プロセスの管理下に置く必要がある。
登録された仮身は元の仮身の上または下に位置しているが、
必要に応じて位置を移動してもよい。
oreq_prc()
により送信された仮身要求イベントであり、
これを受けた場合は、必ず orsp_prc()
により応答を戻さなくてはいけない。
orsp_prc()
により、応答として戻す必要がある。
wf->vobjfn = NULL
の場合は、
要求タイプ < 128 の場合は何もせず、
要求タイプ ≧ 128 の場合は、ER_NOSPT
エラー応答を
orsp_prc()
により戻す。
仮身を含むウィンドウの場合は、NULL
であってはいけない。
|
W unget_wevt(void)
なし
= 0 正常終了
< 0 戻したイベント数が 16 以上 ( EX_NOSPC
)
wevt
に格納されているウィンドウ・イベントを戻して、
次に実行される、evt_loop()
または evt_proc()
関数で取り出すウィンドウ・イベントとする。
最大16個のウィンドウ・イベントをスタック上に戻すことができる。
この処理は 1 つのプロセス内で行なわれるため、 戻したイベントは、 他のプロセスには影響しない点に注意が必要である。
この関数は、
パーツやパネルの処理で期待外のイベントが得られた場合、
そのイベントを一旦戻して、evt_loop()
、または evt_proc()
により、
後で処理するために使用される。
なお、この関数では、wugt_evt(&wevt)
を実行しているだけである。
|
W evt_proc(void)
なし
=0 処理継続 ≠0 処理終了
ウィンドウ・イベントを取り出し、evt_loop()
関数により登録された、
WINFOREC
, WFUNCREC
に基づいたイベント処理を実行して戻る。
evt_loop()
は、
この evt_proc()
を以下のように連続して実行するものである。
while ((ret = evt_proc()) == 0);
この関数は、パーツやパネルの処理で期待外のイベントが得られた場合、 そのイベントを単発的に処理するために使用される。
関数値は各イベント処理関数で戻された値である。
|
W update_sbar(W ix, W cmd, W *ptr)
W ix ウィンドウ指定 W cmd スクロールバーの位置 W *ptr スクロールバーを設定する値の配列
= 0(ER_OK) : 正常終了 < 0 : エラー (関数値はエラーコード)
ix
で指定したウィンドウの cmd
で指定したスクロールバーの値を ptr
で指定した領域に格納されている
( clo, chi, lo, hi
) の 4 word の値に変更する。
cmd
は、スクロールバーの位置を示す以下の値である。
cmd = | 0 : 右スクロールバー |
1 : 下スクロールバー | |
2 : 左スクロールバー |
ptr = NULL
の時は何もせずに関数値 0 を戻す。
|
PNT chk_scroll(W type, W diff, W unit, RECT view, RECT frame)
W type スクロールのタイプ W diff ジャンプスクロールの移動量 W unit スムーススクロール時の移動量 RECT view 現在の表示領域 RECT frame データ全体の領域
表示スクロール必要量
evt_loop()
の scrlfn()
に渡された
type, diff
に対応して必要とされる表示スクロール量をチェックして、
関数値として戻す。
各パラメータは以下の意味を持つ。
type : |
スクロールのタイプ ( scrlfn() に渡された値そのもの) |
diff : |
ジャンプスクロールの移動量view 、frame と同一の単位の値でなくてはいけない。
スクロールバーの設定値が、view 、frame
と同一単位の場合は、scrlfn() に渡された値そのものとなる。 |
unit : |
スムーススクロールの時の移動量 ( > 0 ) ページスクロールの場合の重複量ともなる。 |
view : |
現在の表示領域 この領域の幅、または ( 高さ - unit ) がページスクロールの場合の移動量となる。
|
frame : |
データ全体の領域 この領域をはみでたスクロールは行われない。 view と同一の座標系でなくてはいけない。
|
関数値は、PNT
型の以下の値となる。
result.x | : 水平方向のスクロール必要量 ( > 0 左、< 0 : 右、= 0 : 不要) |
result.y | : 垂直方向のスクロール必要量 ( > 0 上、< 0 : 下、= 0 : 不要) |