C++アプリケーションへの組み込み

<目次>


ライブラリーのコンパイル

先ずはライブラリーをコンパイルしないと始まりません。 コンパイル手順を読んで下さい。


ヘッダの取り込み

必要な場所でヘッダを取り込みます。 bzpath.h を取り込むとアプリケーション作成に必要そうな全てのヘッダを 取り込むようになっています。 ただし、現在取り込まないようになっていても、使ってはいけない内部関数だということではなく、 単にサンプルアプリケーションで使っていないという理由の場合が多いので、 必要であれば付け足してください。

ライブラリーのヘッダのあるディレクトリパスを、 コンパイラの検索パスのオプションに指定するのを忘れないようにしてください。

依存関係を減らすためにクラスの名前だけを定義するならbzpath_forward.hを取り込んでください。


名前空間

ライブラリーの名前空間は既定では bzp になっています。 ライブラリーの名前空間をアプリケーションの名前空間に取り込みます。
using namespace bzp;
ほかとかち合ったりコンパイラにあいまいだなどといわれたら、 関数や定数の前にbzp::をつけてください。

名前を変えたい場合はsiteconfig.hを書き換えてください。


オブジェクトの作成


ツールのイベント処理

WindowsのウィンドウメッセージをToolHolderオブジェクトに処理させます。 履歴の後処理もToolHolderオブジェクトに処理させます。

同じパスを二ヶ所以上に表示している場合は消す。

このライブラリでは内部ビットマップを一組だけ確保するので、 パスの表示を同時に二ヶ所で書き換えることができません。

同じパスを二ヶ所に表示している場合はマウスで操作しようとする場所以外に表示されている パスをいったん消しておかなければいけません。

Graph::SetDrawModeで DRAWMODE_HIDEALLを設定して表示しなおすとパスを消せます。 お勧めしませんが、反転表示なので二回表示しても消えます。

ツールの動作が終了したら表示しなおしてください。

サムネイル表示のようにパスの後ろに何もかかれていないか、 全てを書き直すのが難しくなければ、 消しておかなくてもツールの動作が終了してから全て書き直せば良いでしょう。

デバイスコンテキストを取得

APIのGetDCでパスを表示するウィンドウのデバイスコンテキストを取得します。

スクロールするウィンドウならビューの左上の座標を設定します。 パスの表示座標をいちいち変更するよりは楽です。

Graph::SetViewDCでデバイスコンテキストを設定します。

必要ならGraph::SetDrawModeで表示方法を設定します。

Redrawオブジェクトを作成

Redrawオブジェクトをローカル変数で作成します。

ツールの処理なのでRedraw::SetPath Redraw::SetGraph Redraw::SetToolを設定してください。

内部ビットマップへ変更前の描画

Redraw::DrawBeforeを呼んで、 パスを変更する前の状態を内部ビットマップへ描きます。

イベント処理

ToolHolder::Entryを呼び出してください。

変更後の表示

Redraw::Endを呼んで、 表示更新を完了させてください。 Endの前に描画方法を変えることもできます。

履歴の登録

ToolHolder::CanStopで、 履歴を登録できるタイミングであるかを調べます。 ToolHolder::DidModifyでパスに何らかの変更があったかを調べます。 両方とも真なら履歴を登録します。

下記のパスのバックアップで作った元のパスと現在のパスを比較して、 履歴情報を作ります。

DifferenceSizeで 履歴情報を入れるバッファの大きさを計算します。 この大きさは最大の場合を示します。

CreateDifferenceで 履歴情報を作ります。

できた履歴情報をアプリケーションの履歴を管理するところへ登録してください。

パスのバックアップ

パスの履歴情報を作るには比較するために元のパスが必要です。 それに、ツールの処理中にエラーや例外が起きた場合には、 Pathオブジェクトは中途半端に変更されてしまいます。

パスに何らかの変更があった場合は ToolHolder::DidModifyが真を返すので、 Path::Copyで、 パスを別のPathオブジェクトに複製してバックアップを取ります。

変更フラグを戻す

履歴の登録とパスのバックアップが終わったら、 ToolHolder::ClearModifiedFlagでフラグを戻します。

カーソルの表示を変える

状態によってカーソルを変えるなら、ツールの処理を呼び出すたびにカーソルを設定します。 マウスキャプチャーを取得しているとウィンドウメッセージのWM_SETCURSORが発生しなくなるし、 ツールの処理中は状態が頻繁に変わるので、イベントハンドラだけで変更してもうまくいきません。

ToolHolder::GetConditionで 状態を得てカーソルのリソース番号に置き換えてください。

ずっと同じカーソルにしておきたいなら何もしなくて良いです。

マウスキャプチャーの取得または解放

ToolHolder::IsCapturingが真なら、 マウスキャプチャーを取得してください。偽なら解放してください。

他の場所のパスを表示する

一番最初の手順で消しておいた他の場所にパスを表示します。


表示

表示するにはRedrawオブジェクトを作成します。 一つの場所でパスを表示しなおしている最中に他の場所でパスを表示することはできません。

ツールごとに特別な指示線やマウスカーソルでつかむ部分を表示している場合があるので、 ツールを利用するドキュメントが表示されているウィンドウで表示する場所では、 ツールを経由して表示しなければなりません。 Redraw::SetToolで設定してください。

サムネイル表示であれば方向点などを表示する必要がないので、 Graph::SetDrawModeでDRAWMODE_HIDE_KNOTを 指定してください。


等間隔の点の描画

今のところドローソフトにあるような太さや角の丸みを設定して線を引くような機能はついていません。 パスに沿った等間隔の座標を計算する機能がついています。

詳しくはStepsクラスの説明を読んで下さい。

アプリケーション側にたぶん筆パターンを描くルーチンがあるでしょうから、それを呼び出してください。


領域を塗りつぶす

パスの領域を塗りつぶすにはFillクラスを使います。

詳しくはFillクラスの説明を読んで下さい。

クリップボード

例外処理

BZPathは実行時のエラーには例外をなげます。tryブロックで囲んでください。 bzp::Exception例外、STLの例外、他にもライブラリーによっては数学関数の例外など 何か投げるかもしれません。 ライブラリー側でこれらをbzp::Exceptionにまとめてなげ直しはしていません。 最後のcatchブロックは"..."で全ての例外を受けてください。


<頁の先頭> <目次>