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