アトリエ ぺっぺ

トップページ > プログラムTips > 半透明ウィンドウ

◆ 半透明ウィンドウ
Windows2000から、APIによって下記のような半透明のウィンドウを簡単に作成することができるようになりました。
ディスプレイモードがHiColor以上であることが条件です。

 
半透明ウィンドウを作成するには、ウィンドウの拡張スタイルにWS_EX_LAYERED(値は0x80000)を追加します。
(VC6.0にはWS_EX_LAYEREDという定数は定義されていないので、自分でWS_EX_LAYEREDを定義するか、直接値(0x80000)を拡張スタイルに設定します。
以下のような関数を作成すると良いでしょう。)
// ヘッダファイルにスタイル定数を定義
#define WS_EX_LAYERED    0x80000

// 半透明ウィンドウスタイルを追加する関数
void SetAlphaAttr(HWND hWnd)
{
    // 拡張ウィンドウスタイルを取得
    LONG lStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
    // WS_EX_LAYEREDを追加し、拡張ウィンドウスタイルを設定
    ::SetWindowLong(hWnd, GWL_EXSTYLE, (lStyle | WS_EX_LAYERED));
}
上記の関数に半透明属性をつけたいウィンドウのハンドルを渡せば、半透明属性を追加することができます。
 
次に、実際に半透明の度合いを設定します。
半透明の度合いを設定するAPI SetLayeredWindowAttributes()は、user32.dll内に存在します。
従って、DLLから関数を読み込む必要があります。
以下のような関数を作成すると良いでしょう。
// ヘッダーに定数を定義
#define LWA_COLORKEY    1
#define LWA_ALPHA       2

// 透過率設定用関数  int n:透過率(0〜255)  上記のSetAlphaAttrを呼んでいるウィンドウであることが条件
int SetAlpha(int n, HWND hWnd)
{
    // 関数の型を宣言します。
    typedef DWORD (WINAPI *PSETLAYEREDWINDOWATTRIBUTES)(HWND, COLORREF, BYTE, DWORD);
    PSETLAYEREDWINDOWATTRIBUTES pSetLayeredWindowAttributes;

    // user32.dllをロードします。    
    HMODULE hDLL = ::LoadLibrary("user32");
    // 関数の実体を読み込みます。
    pSetLayeredWindowAttributes = (PSETLAYEREDWINDOWATTRIBUTES)::GetProcAddress(hDLL,"SetLayeredWindowAttributes");
    // 読み込みに成功したら、関数を実行します。
    if(pSetLayeredWindowAttributes){
        pSetLayeredWindowAttributes(hWnd, 0, n, LWA_ALPHA);
    }
    ::FreeLibrary(hDLL);
    return 0;
}
この二つの関数を、ダイアログならOnInitDiarog()関数で呼ぶと良いでしょう。
また、半透明の度合いは、いつでもSetAlpha()関数を呼ぶ度に変更できます。
BOOL CTskBrDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    //    :
    //    省略
    //    :

    // 半透明ウィンドウスタイルを追加
    SetAlphaAttr(m_hWnd);
    // 半透明設定
    SetAlpha(100, m_hWnd);

    return TRUE;
}
SetLayeredWindowAttributes関数の各引数の意味は下記のようになっています。
BOOL SetLayeredWindowAttributes(
    HWND hwnd,       // 目的のウィンドウのハンドル
    COLORREF crKey,  // 透過させる色
    BYTE bAlpha,     // 半透明の度合い
    DWORD dwFlags    // アクションフラグ
);
半透明の度合いを設定するにはアクションフラグにLWA_ALPHA(値は2)を設定します。
やはりVC6.0ではこの定数は定義されていないので、ヘッダーに自分で定義します。
 
ちなみに、アクションフラグをLWA_COLORKEYに設定すると、半透明ではなく、決められた色のみ透過するウィンドウを作成することができます。
その場合、SetLayeredWindowAttributesの第二引数に透過させる色を設定します。
アクションフラグをLWA_COLORKEY、透過色をダイアログの背景色に設定した場合、このような表示になります。

 

(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp