Cisqua レイヤについて


cqILayer

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 を作成する関数
関数解説
cqILayer CreateLayer(LONG x ,LONG y ,LONG width ,LONG height);レイヤオブジェクトを作成します。

cqILayer のメソッド
メソッド解説
VOID SetName(cqILayer layer , PCTSTR name);レイヤの名前を設定します。
PCTSTR GetName(cqILayer layer);レイヤの名前を取得します。
PCTSTR GetType(VOID);レイヤ固有の文字列を取得します。
cqILayer SmartCopy(cqILayer layer);レイヤの参照コピーを取得します。
BOOL Release(cqILayer layer);レイヤを解放します。
cqILayerManager GetLayerManager(cqILayer layer);レイヤのサブレイヤを管理するオブジェクトを取得します。
VOID SetParent(cqILayer layer , cqILayer parent);レイヤの現在の親レイヤを設定します。
cqILayer GetParent(cqILayer layer);レイヤの現在の親レイヤを取得します。
VOID SetLocation(cqILayer layer, LONG x, LONG y);レイヤの座標を設定します。
LONG GetX(cqILayer layer);レイヤの X 座標を取得します。
LONG GetY(cqILayer layer);レイヤの Y 座標を取得します。
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 GetDC(cqILayer layer);このレイヤが内部で保有しているデバイスコンテキストを取得します。
VOID DeleteDC(cqILayer layer , HDC hdc);GetDC() が返した HDC オブジェクトが不要になったことを通知します。
HDC GetMaskDC(cqILayer layer);マスク用のデバイスコンテキストのハンドルを取得します。このデバイスは常にメモリデバイスのビットマップです。
VOID DeleteMaskDC(cqILayer layer , HDC hdc);GetMaskDC() が返した HDC オブジェクトが不要になったことを通知します。
VOID SetMaskEnable(cqILayer layer , BOOL enabled);マスクレイヤの有効性を設定します。
BOOL GetMaskEnable(cqILayer layer);マスクレイヤが有効かどうかを取得します。
DWORD Method(cqILayer, PCTSTR, DWORD, DWORD);このレイヤオブジェクト固有のメソッドを呼び出します。


CreateLayer

cqILayer 型のレイヤオブジェクトを生成して返します

cqILayer CreateLayer(LONG x ,LONG y ,LONG width ,LONG height);
x
ピクセル単位の初期 X 座標。
y
ピクセル単位の初期 Y 座標。
width
ピクセル単位の幅。
height
ピクセル単位の高さ。
戻り値
成功すれば cqILayer オブジェクトへのポインタ。失敗すれば NULL。

SetName

レイヤの名前を設定します。 名前は自由に指定することができますが、一意になることが望まれます。

VOID SetName(cqILayer layer , PCTSTR name);
name
レイヤの名前を表すヌルで終わる文字列へのポインタ。

GetName

レイヤの名前を取得します。

PCTSTR GetName(cqILayer layer);
戻り値
レイヤの名前を表すヌルで終わる文字列へのポインタ。

GetType

このレイヤオブジェクトを作成したベンダを識別するための文字列を取得します。 他の開発者と文字列が衝突しないようにするため、以下の命名規則に従うことを推奨します。

開発組織.プロジェクト名.型名.バージョン

個人や小規模集団の場合は、開発組織に代表者や著作権者などでもよいでしょう。

PCTSTR GetType(VOID);
戻り値
レイヤオブジェクトの型を認識するための一意の文字列。

SmartCopy

レイヤの参照コピーを作成します。 このメソッドによってオブジェクト内部のリファレンスカウンタをインクリメントします。

cqILayer SmartCopy(cqILayer layer);
戻り値
layer オブジェクトの複製。通常は同じアドレス。

Release

レイヤの参照コピーを解放します。 このメソッドによってオブジェクト内部のリファレンスカウンタをデクリメントします。 リファレンスカウンタが 0 になった場合、オブジェクトはメモリ空間から破棄されます。

BOOL Release(cqILayer layer);
戻り値
TRUE ならばメモリ空間から破棄された。

GetLayerManager

このレイヤのサブレイヤを管理する cqILayerManager オブジェクトを取得します。 このメソッドは NULL を返す可能性もあります。

cqILayerManager GetLayerManager(cqILayer layer);
戻り値
サブレイヤを管理している cqILayerManager オブジェクト。NULL の場合は、このレイヤはサブレイヤを持つことができない、またはサブレイヤを持つことを拒否している。

SetParent

親レイヤを設定します。 通常、このメソッドは cqILayerManager オブジェクトによって自動的に設定されます。

VOID SetParent(cqILayer layer , cqILayer parent);
parent
親レイヤ。

GetParent

親レイヤを取得します。

cqILayer GetParent(cqILayer layer);
戻り値
親レイヤ。親が存在しない場合は NULL。

SetLocation

このレイヤの座標を設定します。

VOID SetLocation(cqILayer layer, LONG x, LONG y);
x
X 座標
y
Y 座標。

GetX

このレイヤが配置されている X 座標を取得します。

LONG GetX(cqILayer layer);
戻り値
X 座標

GetY

このレイヤが配置されている Y 座標を取得します。

LONG GetY(cqILayer layer);
戻り値
Y 座標。

SetSize

このレイヤのサイズを設定します。 現在のレイヤの内容が伸縮されるかどうかは、レイヤの実装に依存します。 通常は伸縮されるそのままです。

VOID SetSize(cqILayer layer, LONG w, LONG h);
w
ピクセル単位の幅。
h
ピクセル単位の高さ。

GetWidth

このレイヤの幅を取得します。

LONG GetWidth(cqILayer layer);
戻り値
ピクセル単位の幅。

GetHeight

このレイヤの高さを取得します。

LONG GetHeight(cqILayer layer);
戻り値
ピクセル単位の高さ。

SetVisible

レイヤの可視性を設定します。

VOID SetVisible(cqILayer layer, BOOL visible);
visible
TRUE ならレイヤを表示する。

GetVisible

レイヤの可視性を取得します。

BOOL GetVisible(cqILayer layer);
戻り値
TRUE ならレイヤを表示する。

SetOpaque

レイヤの不透明度を設定します。

VOID SetOpaque(cqILayer layer, BYTE value);
value
255 ならば不透明、0 ならば透明の 0 〜 255 までの値。

GetOpaque

レイヤの不透明度を取得します。

BYTE GetOpaque(cqILayer layer);
戻り値
0 〜 255 までの不透明度。

DrawLayer

レイヤの内容を指定したデバイスに出力します。

BOOL DrawLayer(cqILayer layer, HDC hdc , LONG dx, LONG dy, DWORD dw, DWORD dh, LONG sx, LONG sy, DWORD sw, DWORD sh);
hdc
出力先のデバイスコンテキストのハンドル。
dx
出力先の X 座標。
dy
出力先の Y 座標。
dw
出力先の幅。
dh
出力先の高さ。
sx
転送元レイヤの X 座標。
sy
転送元レイヤの Y 座標。
sw
転送元レイヤの幅。
sh
転送元レイヤの高さ。

GetDC

このレイヤが管理している内部の論理映像デバイスにアクセスできる HDC オブジェクトを取得します。 不要になった場合は DeleteDC() メソッドで解放しなければなりません。

HDC GetDC(cqILayer layer);
戻り値
HDC オブジェクト。

DeleteDC

GetDC() メソッドから取得した HDC が不要になったことを通知します。

VOID DeleteDC(cqILayer layer , HDC hdc);
hdc
不要になった GetDC() メソッドが返した HDC オブジェクト。

GetMaskDC

マスク用ビットマップへの HDC オブジェクトを取得します。 このメソッドが返した HDC オブジェクトが不要になった場合は DeleteMaskDC() メソッドで解放しなければなりません。

HDC GetMaskDC(cqILayer layer);
戻り値
マスク用ビットマップの HDC オブジェクト。

DeleteMaskDC

GetMaskDC() メソッドが返した HDC オブジェクトが不要になったことを通知します。

VOID DeleteMaskDC(cqILayer , HDC hdc);
hdc
不要になった GetMaskDC() メソッドが返した HDC オブジェクト。

SetMaskEnable

マスクを有効にするかどうかを設定します。

VOID SetMaskEnable(cqILayer layer , BOOL enabled);
enabled
TRUE ならばマスクを有効にする。

GetMaskEnable

マスクを有効にするかどうかを取得します。

BOOL GetMaskEnable(cqILayer layer);
戻り値
TRUE ならばマスクが有効。

Method

レイヤオブジェクト固有の独自メソッドを起動することを要求します。 これによって、cqILayer が定めているメソッド以外の独自の機能を実装することができます。

DWORD Method(cqILayer layer, PCTSTR methodName, DWORD p1, DWORD p2);
methodName
独自の機能を要求するメッセージを表すヌルで終わる文字列へのポインタ。
p1
メソッド固有の引数。
p2
メソッド固有の引数。
戻り値
メソッド固有の戻り値。