|
|
||||
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); } //------------------------------------------------------------------- |