cisqua.dll 及び付属する cisqua.h ヘッダファイルを用いることで、汎用的なレイヤを取得することができます。 Cisqua はレイヤの機能を抽象化しているため、ビットマップレイヤの他にベクタレイヤを実装することも可能です。
このバージョンにおいては、できるだけ自由に画面を操作することができるようにするため、レイヤは HDC を返さなければならないという仕様を採用しています。 これは、本バージョンが書籍における学習用のコードという性質を持っているため、制限は少ない方がよいと考えたためです。 将来のバージョンにおいては、Windows への依存を低下させ、他のプラットフォームへの移植を容易にするための改良が加えられる可能性があります。
レイヤオブジェクトを表す構造体は次のように宣言されています。
typedef struct _tagCqLayer {
/*
リファレンスカウンタを加算して、このオブジェクトを複製します。
この複製はカウンタをインクリメントするだけの軽量の複製です。
*/
void * (*SmartCopy)(struct _tagCqLayer*);
/*
リファレンスカウンタをデクリメントします。
カウンタが 0 になった場合、オブジェクトを破棄します。
*/
BOOL (*Release)(struct _tagCqLayer*);
/*このレイヤの名前です。*/
VOID (*SetName)(struct _tagCqLayer* , PCTSTR);
PCTSTR (*GetName)(struct _tagCqLayer*);
/*
このレイヤを表すオブジェクトの型名を表します。
公開するオブジェクトは、特に一意の名前になるように注意する必要があります。
レイヤオブジェクトが提供する独自の機能にアクセスする場合
このレイヤインタフェースが適切なオブジェクトかどうかを判断する材料となります。
オブジェクト名は常に "開発組織名.オブジェクト名.バージョン" を推奨します
*/
PCTSTR (*GetType)(VOID);
/*
サブレイヤを管理するマネージャオブジェクトを返します。
この関数が返すオブジェクトの寿命は、レイヤの寿命と同じです。
*/
cqILayerManager (*GetLayerManager)(struct _tagCqLayer*);
/*親レイヤ*/
VOID (*SetParent)(struct _tagCqLayer* , struct _tagCqLayer*);
struct _tagCqLayer* (*GetParent)(struct _tagCqLayer*);
/*座標*/
VOID (*SetLocation)(struct _tagCqLayer*, LONG x, LONG y);
LONG (*GetX)(struct _tagCqLayer*);
LONG (*GetY)(struct _tagCqLayer*);
/*サイズ*/
VOID (*SetSize)(struct _tagCqLayer*, LONG w, LONG h);
LONG (*GetWidth)(struct _tagCqLayer*);
LONG (*GetHeight)(struct _tagCqLayer*);
/*可視性*/
VOID (*SetVisible)(struct _tagCqLayer*, BOOL visible);
BOOL (*GetVisible)(struct _tagCqLayer*);
/*不透明度*/
VOID (*SetOpaque)(struct _tagCqLayer*, BYTE value);
BYTE (*GetOpaque)(struct _tagCqLayer*);
/*
このレイヤを指定したデバイスコンテキストにコピーします
*/
BOOL (*DrawLayer)(struct _tagCqLayer*, HDC, LONG , LONG , DWORD , DWORD , LONG , LONG , DWORD , DWORD);
/*
レイヤに描画を行うためのデバイスコンテキストです。
ベクタレイヤの場合、ビットマップ関連処理はできないので注意が必要です。
*/
HDC (*GetDC)(struct _tagCqLayer*);
VOID (*DeleteDC)(struct _tagCqLayer*, HDC);
/*
マスクデータとなる2色ビットマップのデバイスコンテキストです。
*/
HDC (*GetMaskDC)(struct _tagCqLayer*);
VOID (*DeleteMaskDC)(struct _tagCqLayer*,HDC);
/*
マスクデータを使って透過処理を有効にするかどうかを表すプロパティです。
*/
VOID (*SetMaskEnable)(struct _tagCqLayer* , BOOL);
BOOL (*GetMaskEnable)(struct _tagCqLayer*);
/*
レイヤオブジェクト独自の拡張メソッドを呼び出します
*/
DWORD (*Method)(struct _tagCqLayer*, PCTSTR , DWORD, DWORD);
} cqLayer , *cqILayer;
この構造体のメンバは全てメソッドです。 第一引数には、必ず構造体オブジェクト自身への参照を指定してください。
レイヤオブジェクトを作成するのは cisqua.dll の cqCreateLayer() 関数です。 この関数は、第一引数に DLL モジュールのパスを指定し、関数内でこのモジュールからコンストラクタを検索して呼び出します。 レイヤオブジェクトを作成する関数は、必ず CreateLayer という名前で、指定された引数と戻り値型で宣言されていなければなりません。 レイヤオブジェクトを公開する DLL モジュールは、Cisqua が定める仕様に従って、CreateLayer 関数を公開してください。
関数 | 解説 |
---|---|
cqILayer CreateLayer(LONG x ,LONG y ,LONG width ,LONG height); | レイヤオブジェクトを作成します。 |
cqILayer 型のレイヤオブジェクトを生成して返します
cqILayer CreateLayer(LONG x ,LONG y ,LONG width ,LONG height);
レイヤの名前を設定します。 名前は自由に指定することができますが、一意になることが望まれます。
VOID SetName(cqILayer layer , PCTSTR name);
レイヤの名前を取得します。
PCTSTR GetName(cqILayer layer);
このレイヤオブジェクトを作成したベンダを識別するための文字列を取得します。 他の開発者と文字列が衝突しないようにするため、以下の命名規則に従うことを推奨します。
開発組織.プロジェクト名.型名.バージョン
個人や小規模集団の場合は、開発組織に代表者や著作権者などでもよいでしょう。
PCTSTR GetType(VOID);
レイヤの参照コピーを作成します。 このメソッドによってオブジェクト内部のリファレンスカウンタをインクリメントします。
cqILayer SmartCopy(cqILayer layer);
レイヤの参照コピーを解放します。 このメソッドによってオブジェクト内部のリファレンスカウンタをデクリメントします。 リファレンスカウンタが 0 になった場合、オブジェクトはメモリ空間から破棄されます。
BOOL Release(cqILayer layer);
このレイヤのサブレイヤを管理する cqILayerManager オブジェクトを取得します。 このメソッドは NULL を返す可能性もあります。
cqILayerManager GetLayerManager(cqILayer layer);
親レイヤを設定します。 通常、このメソッドは cqILayerManager オブジェクトによって自動的に設定されます。
VOID SetParent(cqILayer layer , cqILayer parent);
親レイヤを取得します。
cqILayer GetParent(cqILayer layer);
このレイヤの座標を設定します。
VOID SetLocation(cqILayer layer, LONG x, LONG y);
このレイヤが配置されている X 座標を取得します。
LONG GetX(cqILayer layer);
このレイヤが配置されている Y 座標を取得します。
LONG GetY(cqILayer layer);
このレイヤのサイズを設定します。 現在のレイヤの内容が伸縮されるかどうかは、レイヤの実装に依存します。 通常は伸縮されるそのままです。
VOID SetSize(cqILayer layer, LONG w, LONG h);
このレイヤの幅を取得します。
LONG GetWidth(cqILayer layer);
このレイヤの高さを取得します。
LONG GetHeight(cqILayer layer);
レイヤの可視性を設定します。
VOID SetVisible(cqILayer layer, BOOL visible);
レイヤの可視性を取得します。
BOOL GetVisible(cqILayer layer);
レイヤの不透明度を設定します。
VOID SetOpaque(cqILayer layer, BYTE value);
レイヤの不透明度を取得します。
BYTE GetOpaque(cqILayer layer);
レイヤの内容を指定したデバイスに出力します。
BOOL DrawLayer(cqILayer layer, HDC hdc , LONG dx, LONG dy, DWORD dw, DWORD dh, LONG sx, LONG sy, DWORD sw, DWORD sh);
このレイヤが管理している内部の論理映像デバイスにアクセスできる HDC オブジェクトを取得します。 不要になった場合は DeleteDC() メソッドで解放しなければなりません。
HDC GetDC(cqILayer layer);
GetDC() メソッドから取得した HDC が不要になったことを通知します。
VOID DeleteDC(cqILayer layer , HDC hdc);
マスク用ビットマップへの HDC オブジェクトを取得します。 このメソッドが返した HDC オブジェクトが不要になった場合は DeleteMaskDC() メソッドで解放しなければなりません。
HDC GetMaskDC(cqILayer layer);
GetMaskDC() メソッドが返した HDC オブジェクトが不要になったことを通知します。
VOID DeleteMaskDC(cqILayer , HDC hdc);
マスクを有効にするかどうかを設定します。
VOID SetMaskEnable(cqILayer layer , BOOL enabled);
マスクを有効にするかどうかを取得します。
BOOL GetMaskEnable(cqILayer layer);
レイヤオブジェクト固有の独自メソッドを起動することを要求します。 これによって、cqILayer が定めているメソッド以外の独自の機能を実装することができます。
DWORD Method(cqILayer layer, PCTSTR methodName, DWORD p1, DWORD p2);