半透明ウインドウを作成する


半透明ウインドウを作成するには SetLayeredWindowAttributes 関数を使用します。
関数が使用できるかどうかはOSに依存します。
また、ディスプレイモードがHiColor以上でないと使用できません。


Sample code
#include <windows.h>
#include <tchar.h>

#define WS_EX_LAYERED 0x80000
#define LWA_COLORKEY 1
#define LWA_ALPHA 2

typedef BOOL (WINAPI *PSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);

LPCTSTR lpszAppName = TEXT("MyApp");

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow)
{
    MSG        msg = {0};
    HWND       hWnd;
    WNDCLASSEX wc = {0};
    PSetLayeredWindowAttributes pSetLayeredWindowAttr = NULL;
    
    //メインウィンドウクラス登録
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = lpszAppName;
    wc.hIconSm       = NULL;
    if(RegisterClassEx(&wc) == 0) {
        return 0;
    }
    
    HINSTANCE hLib = LoadLibrary(TEXT("user32.dll"));
    if(hLib != NULL) {
        pSetLayeredWindowAttr = reinterpret_cast<PSetLayeredWindowAttributes>(GetProcAddress(hLib, "SetLayeredWindowAttributes"));
    }
    
    if(pSetLayeredWindowAttr != NULL) {
        hWnd = CreateWindowEx(WS_EX_LAYERED, lpszAppName, lpszAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    }
    else {
        hWnd = CreateWindow(lpszAppName, lpszAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    }
    if(hWnd == NULL) {
        if(hLib != NULL) {
            FreeLibrary(hLib);
        }
        return FALSE;
    }
    
    //半透明化
    if(pSetLayeredWindowAttr != NULL) {
        (*pSetLayeredWindowAttr)(hWnd, 0, 128, LWA_ALPHA);
    }
    
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    
    while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    if(hLib != NULL) {
        FreeLibrary(hLib);
    }
    return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc( hWnd, message, wParam, lParam );
    }
    return 0;
}

一覧メニューへ