どうも克兎でっす~。
久しぶりにこのシリーズを書きます。
1年生がdglibをどの程度使えるのか知らなかったので、
しばらく休載していました。
その上、dglibがdglib2になっているという変わりよう…
どちらで、やればいいのかとか、悩んでましたが、
色々考えた結果、dgib2でやることにします。
前回書いた内容は、dglibのままですが、コンパイルは通るはずなのでそのままにします。
[0回]
今回は、
レイヤードウィンドウについて説明します。
レイヤードウィンドウとは
下位Zオーダーにあるウィンドウと
色情報を混ぜてやることのできるウィンドウです。
簡単に言うと、
透明化ができるウィンドウってことです。
Zオーダーというのは、ウィンドウの並んでいる順序のことです。
レイヤードウィンドウにするには、
ウィンドウスタイルEXにレイヤードウィンドウ属性を設定する必要があります。
方法はこちらです。
main関数内に書いてください。
main.cpp
#define WINNAME "Katuusagi_Program"
:
:
HWND hWnd; //ウィンドウハンドル
int Alpha; //アルファ値
COLORREF Color; //透明色
//ウィンドウの大きさとか初期設定
dg_setscreen( 100 , 100 , 400 , 200 , 0 , WINNAME );
//ウィンドウ名からウィンドウハンドルを取得
hWnd = FindWindow( NULL , WINNAME );
//レイヤードウィンドウ属性の付加
SetWindowLong( hWnd , GWL_EXSTYLE , WS_EX_LAYERED );
|
FindWindowについては
Part1で記述しました。
ここで手に入れたウィンドウハンドルで、
SetWindowLong関数を実行します。
LONG SetWindowLong(
HWND hWnd, // ウィンドウのハンドル
int nIndex, // 設定する値のオフセット
LONG dwNewLong // 新しい値
);
この関数は
第1引数にウィンドウのハンドルを指定し、
第2引数に、変更したい「ウィンドウの情報を指定するフラグ」を設定できます。
今回、設定するのは
GWL_EXSTYLEです。
これは、ウィンドウスタイルEXを書き換えるフラグです。
第3引数には第2引数で指定した情報を上書きする値を設定します。
つまり、今回は、ウィンドウスタイルEXがどのような値になるかを設定できるわけです。
そしてその設定する値が
WS_EX_LAYERED属性です。
これだけでこのウィンドウはレイヤードウィンドウになりました。
さて、次に、ウィンドウの透明化情報を設定していきましょう。
レイヤードウィンドウの透明情報の設定には、
SetLayeredWindowAttributes関数を使います。
BOOL SetLayeredWindowAttributes(
HWND hwnd, // レイヤードウィンドウのハンドル
COLORREF crKey, // カラーキーを指定する構造体へのポインタ
BYTE bAlpha, // ブレンド機能の値
DWORD dwFlags // アクションフラグ
);
第1引数には、ハンドル
第2引数、第3引数はひとまず飛ばして、
第4引数は、透明化の方法を指定できます。
LWA_COLORKEYを設定すると、第2引数で指定した色を、透明化することができます。
dglib2と同じように
RGBマクロを使用できます。
LWA_ALPHAを設定すると、第3引数で設定した値で、ウィンドウを半透明にすることができます。
設定する値は
0~255で、0なら完全透明、255なら完全不透明です。
|演算子を使って両方設定することもできます。
LWA_COLORKEYが指定した色にだけ効果を与えるのと違って、
LWA_ALPHAはウィンドウ全体に効果を与えます。
使用例は、少し長くなるので、
サンプルソースを配布します。
こういったものを使えば、デスクトップ上を舞台にしたゲームも作れそうですね。
ウィンドウの形を自分でデザインする
なんてこともできそうです。
いろんな使い道があるので試してみてください。
そ~れ~で~は~(*´∀`)ノ
PR
COMMENT
No Title
もしかしてバージョンアップしたの?
確か1年次の時に使ってたライブラリですよね、何かバグ修正、関数とか追加されたのかな?
補足:
なるほど・・・便利になりましたね。
No Title
もともとは、カラーパレットから色番号を自分で調べて設定してましたが、
COLORREFに統一されました。
あと、C++でも使用可能になりました。
ほかにも何かあるのかもしれないけど、基本的な使い方は変わってません。