ホーム
| アプリケーション | Tips | ダウンロード | プログラム
| コラム

CBアプリ工房


Tips

半透明なウィンドウ表示(SetLayeredWindowAttributes) 

更新 : 2010/06/17

 



解説:
LoadLibrary 関数と GetProcAddress 関数を実装することで、DLL 内の API 関数を呼び出す方法を前回の Tips で紹介しました。

今回は、同様な手順を踏んで、透き通るフォームを実現してみます。
フォームを半透明にする API 関数 SetLayeredWindowAttributes を使って、レイヤードウィンドウの不透明度と透明のカラーキーを設定します。

SetLayeredWindowAttributes は以下のように定義されています。

BOOL SetLayeredWindowAttributes(
    HWND hwnd,       // レイヤードウィンドウのハンドルを指定
    COLORREF crKey, // レイヤードウィンドウの作成時に使う透明のカラーキーを指定
    BYTE bAlpha,      // 不透明度を示すアルファ値を指定
    DWORD dwFlags   // アクションフラグ
);

関数が成功すると 0 以外の値、失敗すると 0 が返ります。
この関数は User32.dll に含まれています。

使用例:
アプリケーションを起動すると、半透明なフォームが表示されます。

コンポーネントの配置は特にありません。

まず SetLayeredWindowAttributes を呼び出すために、関数の定義をします。
つぎにコンストラクタで、"user32.dll" をロードして GetProcAddress 関数で SetLayeredWindowAttributes を呼び出します。

その後、Window のスタイルに透き通るスタイルを付け加えるため 0x00080000 を OR します。
引数に適当な値を渡して、SetLayeredWindowAttributes 関数を実行します。
これで指定した設定値がウインドウに反映され、半透明なフォームが表示されます。

設定値を変えて、フォームの透明度を確認してみてください。

// 定義
typedef int WINAPI (*SETLAYER)(HWND, COLORREF, BYTE, DWORD);
//-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    // USER32.DLL から関数を取得
    HINSTANCE hInst = LoadLibrary("user32.dll");
    SETLAYER SetLayeredWindowAttributes = (SETLAYER)GetProcAddress(
                                                                               hInst,
                                                                               "SetLayeredWindowAttributes");

    // 透き通るスタイルを付け加える
    long lStyle = GetWindowLong(Handle, GWL_EXSTYLE) | 0x00080000;
    SetWindowLong(Handle, GWL_EXSTYLE, lStyle);

    // アルファ値とフラグを指定
    SetLayeredWindowAttributes(Handle, 0, 200, 2);

    FreeLibrary(hInst);
}
//-------------------------------------------------------------------



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.