Windows2000の半透明ウインドウ

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");

 これでポインタpfWinSetLayeredWindowAttributes()のアドレスが設定されたので、後は

  pfWin(hwMain,0,128,2);

 のような感じで関数を呼び出す事ができます。ただし、Windows98などこの関数がない環境で呼び出そうとするとエラーになるので、関数のアドレスを取得できたかどうか(ポインタがNULLになっていないか)調べて、取得できていたら実行するようにした方が良いでしょう。

 SetLayeredWindowAttributes()では、3番目の引数に透明度(0〜255)を指定します。4番目の引数にLWA_COLORKEYを指定すると2番目の引数で透過色を指定できるようですが、今回は2(LWA_ALPHA)を指定してみました。

プログラム

 Windows2000で実行すると、半透明化されたウインドウが表示されます。

プログラムソース表示


プログラミング資料庫 > Windowsプログラミング研究室