ToolHolderクラスの解説

<ソース解説> <目次>


クラスの説明

アプリケーションからツールを操作する橋渡しとなるクラスです。

アプリケーションはSelectTool変換表内の番号を指定します。 ToolHolderクラスがキー入力を判定してツールを切り替えます。 イベントを渡すとToolHolderクラスがそれぞれのツールの処理にまわします。 例えばTOOLTABLE_MOVEにするとキーを何も押さない状態では移動ツールとして働き、 コントロールキーを押すと方向点の切り替えツールとして働きます。 アプリケーションはツールの違いを気にする必要がありません。

アプリケーションはGetConditionで ツールの状態を得て、カーソルやステータスバーの文字を変更してください。 状態の番号は全てのツールで重ならないので、ツール区別せずに同じルーチンで処理できます。

ツール使用中のパスの表示の更新はRedrawクラスを使います。 Redraw::SetToolでToolHolderオブジェクトのポインタを設定すると、 ツール固有の表示処理を経由して表示されます。

ツールの使用中はパスを表示しなおします。 2つの画面を同時に表示しなおすことはできないので、 「別のウィンドウに表示」や「ウィンドウを分割する」機能を持っているアプリケーションや サムネイル表示などで、 他のウィンドウに同じパスが表示されている場合は、 ツールの動作が終了するまで他のウィンドウのパスを消しておく必要があります。


ツール変換表

サンプルの場合では、ユーザーがツールのボタンを押すとツールが選ばれ、 シフトキーなどを押すとツールが切り替わります。 ボタンとキーの関係を示したのがツール変換表です。

表にはキーを押していない状態と幾つかのキーを押した状態での、 ツールとオプションの値を並べてあります。 アプリケーションはSelectToolで変換表の番号を選びます。

表には同じツールを何度でも並べることもできます。 ライブラリーとしては一つのツールにまとめられているものを別のツールとして割り当てることもできます。

変換表はSetToolTableで アプリケーション独自のものに取り替えられます。変換表にはツールのラベルとオプションを設定します。

変換をするキーはconfig::SetConfigで設定します。


メンバー関数

ToolHolder()

説明

コンストラクタ


~ToolHolder()

説明

デストラクタ


void SelectTool(int index,Path *path,Graph *graph)

説明

変換表の番号を指定してツールを切り替えます。

ツールが動作中の場合は中止します。

切り替えの際にパスの表示が変わる場合があるのでGraphオブジェクトは 表示できるように正しく設定されていなければいけません。

引数

index 番号

path Pathオブジェクトのポインタ

graph Graphオブジェクトのポインタ


int GetCurrentIndex() const

説明

初期値か前回設定した変換表の番号を得ます。

戻り値

現在の変換表の番号


void Entry(EVENT event,Path *path,Graph *graph,POINT point,int key=0)
void Entry(EVENT event,Path *path,Graph *graph)

説明

イベント処理をする。

イベントによってはpointやkeyが必要ない場合もあるので省略してください。

中止をする場合でも表示を更新するのでGraphオブジェクトは毎回正しく設定されてされていなければいけません。

引数

event イベントの種類

path Pathオブジェクトのポインタ

graph Graphオブジェクトのポインタ

point 表示座標でのカーソルの座標

key 押したまたは離したキー


void Cancel(Path *path,Graph *graph)

説明

中止のイベント処理をする。 ソースを簡単にするために作った関数で、 EntryEVENT_CANCELを渡すだけです。

全ての場面で中止することができます。


bool IsOperating() const

説明

ツールが動作中かを調べます。

アプリケーションは、同じパスを2ヶ所以上に表示する場合は、 ツールが動作する前に操作対象ではない場所に表示されているパスを消して、 動作が終わってから表示してください。

パスをツール以外で利用する場合にツールが動作中なら、 Cancelで中止してください。

戻り値

動作中ならtrue。


bool CanStop() const

説明

ツールの動作を中断できる区切りかを調べます。 区切りであればツールが動作中でも、終わらせて履歴やメニューなど他の操作をできます。 中断できないツールの場合に中止をするとそれまでの変更が無効になる場合もあります。

イベント処理前にツールが動作をしていて、 イベント処理後に中断可能なら履歴の保存をしてください。

戻り値

中断できるならtrue。


bool IsCapturing() const

説明

マウスキャプチャーをする必要があるかを調べます。 必要であればアプリケーションが操作対象のウィンドウにマウスキャプチャーを固定してください。

戻り値

必要ならtrue。


bool DidModify() const

説明

ツールの処理中にパスが変更されるような処理をした後かを調べます。

アプリケーションはCanStopで履歴を更新できる状態か調べて、 履歴を作ったら、ClearModifiedFlagでフラグを戻してください。

変更するような処理をするとフラグが立ちますが、必ず変更されているわけではありません。 履歴を作ろうとして差がなければ履歴を登録しないようにすると良いでしょう。

戻り値

変更があったならtrue。なければfalse。


void ClearModifiedFlag()

説明

DidModifyのフラグを元に戻します。

アプリケーションが戻さないとずっとそのままです。


int GetCondition() const

説明

ツールの状態を得ます。ツールの種類やカーソルがパスのどこを指しているかなどがわかります。

ツールが違っていても同じ数にはなりません。

この情報によってカーソルやステータスバーを変更してください。

戻り値

ツールの状態


int GetToolOption(int lowBit=-1,int hiBit=-1) const

説明

ツールに設定されているオプションを得ます。

利用者がキーを押したり、ツールを切り替えたりするとツールとオプションが変わります。

引数

lowBit オプションの下位ビット

hiBit オプションの上位ビット

戻り値

オプションの値


void SetToolTable(const TOOLTABLE *toolTable,int count)

説明

ツール変換表を設定します。

引数

toolTable 表のポインタ

count 表の数


イベント

EVENT_MOUSEMOVE

カーソルを移動した。 ウィンドウがWM_MOUSEMOVEを受けたら渡します。

座標が必要です。


EVENT_LEFTDOWN

左ボタンを押した。 ウィンドウがWM_LBUTTONDOWNを受けたらドラッグをし始めるか調べてください。 ドラッグしていなかったらEVENT_LEFTDOWNを渡して、 ドラッグしていたらEVENT_DRAGを渡してください。

座標が必要です。


EVENT_DRAG

ドラッグを始めた。 左ボタンを押してドラッグを始めた場合に渡します。 EVENT_LEFTDOWNを読んでください。


EVENT_LEFTUP

左ボタンを離した。 ウィンドウがWM_LBUTTONUPを受けたら渡します。

座標が必要です。


EVENT_LEFTDUBLECLICK

左ボタンを2度押した。 ウィンドウがWM_LBUTTONDBLCLKを受けたら渡してください。

座標が必要です。


EVENT_RIGHTDOWN

右ボタンを押した。 ウィンドウがWM_RBUTTONDOWNを受けたら渡してください。

座標が必要です。


EVENT_KEYDOWN

キーを押した。 ウィンドウがWM_KEYDOWNを受けたら渡してください。

仮想キー番号と座標が必要です。ウィンドウメッセージハンドラの引数には座標がありませんが、 APIを使って出してください。


EVENT_KEYUP

キーを離した。 ウィンドウがWM_KEYUPを受けたら渡してください。

仮想キー番号と座標が必要です。ウィンドウメッセージハンドラの引数には座標がありませんが、 APIを使って出してください。


EVENT_CANCEL

ツールの動作を中止する。 Cancel関数でも良いです。


EVENT_UNDO

「元に戻す」をした。 アプリケーションがパスの情報を元に戻してから渡します。 ライブラリーが自動的に元に戻すわけではありません。 ツールが動作したまま元に戻せる場合には呼び出さないとおかしくなります。


EVENT_REDO

「やり直し」をした。 アプリケーションがパスの情報をやり直してから渡します。 ライブラリーが自動的にやり直すわけではありません。 ツールが動作したままやり直せる場合には呼び出さないとおかしくなります。


EVENT_DRAW

説明

パスの表示をする。

ライブラリーの内部から呼ばれます。 アプリケーションから呼び出す必要はありません。


EVENT_MOVEOUTSIDEWINDOW

カーソルがウィンドウの外に出た。

ライブラリーの内部から呼ばれます。 アプリケーションから呼び出す必要はありません。


EVENT_MOVEINSIDEWINDOW

外に出ていたカーソルがウィンドウの中に戻った。

ライブラリーの内部から呼ばれます。 アプリケーションから呼び出す必要はありません。


<頁の先頭> <ソース解説> <目次>