Windows2000では、ウインドウスタイルにWS_EX_LAYEREDを指定する事でウインドウをレイヤー化できます。レイヤー化したウインドウは、SetLayeredWindowAttributes()で透明度を指定して半透明化できるようです。今回は、Windows2000 RC2でこのウインドウの半透明化を試してみました。 ウインドウの設定まずウインドウスタイルの設定ですが、私の使っているVC++5ではWS_EX_LAYERED定数が定義されていないので、defineで値(0x80000)を定義しました。そして、WNDCLASSEX型のウインドウクラスをCWindowのクラス名で登録したら、拡張スタイルにWS_EX_LAYEREDを設定してウインドウを作ります。 hwMain=CreateWindowEx (WS_EX_LAYERED,"CWindow",NULL,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,320,320,NULL,NULL,hInstance,NULL); ウインドウができたら、後はSetLayeredWindowAttributes()で透明度を指定するだけ....なのですが、VC++5には、この関数の宣言もないので自分でuser32.dll内にあるSetLayeredWindowAttributes()の関数アドレスを取得しないといけません。まず、関数の型でポインタを宣言しLoadLibrary()でuser32.dllをマップします。そして、マップしたDLLからSetLayeredWindowAttributes()のアドレスを取得してポインタに設定しましょう。 ・ポインタ宣言 typedef DWORD (WINAPI *FWINLAYER)(HWND hwnd,DWORD crKey,BYTE bAlpha,DWORD dwFlags); ・DLLから関数アドレス取得 hDll=LoadLibrary("user32.dll"); pfWin=(FWINLAYER)GetProcAddress(hDll,"SetLayeredWindowAttributes"); これでポインタpfWinにSetLayeredWindowAttributes()のアドレスが設定されたので、後は pfWin(hwMain,0,128,2); のような感じで関数を呼び出す事ができます。ただし、Windows98などこの関数がない環境で呼び出そうとするとエラーになるので、関数のアドレスを取得できたかどうか(ポインタがNULLになっていないか)調べて、取得できていたら実行するようにした方が良いでしょう。 SetLayeredWindowAttributes()では、3番目の引数に透明度(0〜255)を指定します。4番目の引数にLWA_COLORKEYを指定すると2番目の引数で透過色を指定できるようですが、今回は2(LWA_ALPHA)を指定してみました。 プログラムWindows2000で実行すると、半透明化されたウインドウが表示されます。 |