以前、Windows で半透明ウィンドウができないか 色々試してみた事がありましたが、 Win 2k ならば API 一個で簡単に半透明化できます。 詳しいことは MSDN online Libraryを見ていただくとして、具体的には SetLayeredWindowAttributes()という Win2k で新設された API を 使用します。
// Win2k で半透明ウィンドウ // (c) tokai@fides.dti.ne.jp , 2000/5/20 // // 16bit カラー以上で使用すること // BOOL PrepareLayeredWindow(HWND); // で準備 // BOOL MySetLayeredWindowAttributes(HWND,COLORREF,BYTE,DWORD); // で半透明化 // VOID UnprepareLayeredWindow(); // で後始末 #include <windows.h> #define WS_EX_LAYERED 0x80000 #define LWA_COLORKEY 1 #define LWA_ALPHA 2 typedef BOOL (WINAPI *SLWINATT)(HWND,COLORREF,BYTE,DWORD); // グローパル HMODULE hModU32 = NULL; // user32.dll のハンドル SLWINATT pSetLayWinAtt; // 半透明ウィンドウ準備 BOOL PrepareLayeredWindow(HWND hWnd) { if(!hModU32){ if(hModU32 = LoadLibrary("user32.dll")) { pSetLayWinAtt = (SLWINATT)GetProcAddress(hModU32,"SetLayeredWindowAttributes"); if(pSetLayWinAtt) { // スタイルに WS_EX_LAYERED をセット SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE)|WS_EX_LAYERED); return TRUE; } else{ FreeLibrary(hModU32); hModU32 = NULL; } } } return FALSE; } // 後始末 VOID UnprepareLayeredWindow() { if(hModU32) FreeLibrary(hModU32); } // 半透明化 BOOL MySetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags){ if(hModU32) return pSetLayWinAtt(hwnd,crKey,bAlpha,dwFlags); else return FALSE; } //---------------------------------------------- // プロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hDC; PAINTSTRUCT ps; RECT rt; static BYTE bAlpha = 160; switch (msg) { case WM_CREATE: // 初期化 PrepareLayeredWindow(hWnd); MySetLayeredWindowAttributes(hWnd,0,bAlpha,LWA_ALPHA); SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); break; case WM_LBUTTONDOWN: bAlpha = (bAlpha+8) | 16; MySetLayeredWindowAttributes(hWnd,0,bAlpha,LWA_ALPHA); break; case WM_PAINT: hDC = BeginPaint(hWnd,&ps); GetClientRect(hWnd,&rt); SetTextColor(hDC,RGB(255,255,0)); SetBkMode(hDC,TRANSPARENT); DrawText(hDC,"半透明",-1,&rt,DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hWnd,&ps); break; case WM_CLOSE: UnprepareLayeredWindow(); DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wp, lp); } return 0; } // メイン char szClassName[] = "TOMEIWIN2k"; int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { HWND hWnd; MSG lpMsg; WNDCLASS wndClass; // ウィンドウ登録 if (!hPreInst) { memset(&wndClass,0,sizeof(WNDCLASS)); wndClass.lpfnWndProc = WndProc; wndClass.hInstance = hInst; wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wndClass.lpszClassName = szClassName; if (!RegisterClass(&wndClass)) return FALSE; } // ウィンドウ作成 hWnd = CreateWindow( szClassName,"半透明2k", WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU, CW_USEDEFAULT,CW_USEDEFAULT, 200,200,NULL,NULL,hInst,NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // メッセージループ while (GetMessage(&lpMsg, NULL, 0, 0)) { TranslateMessage(&lpMsg); DispatchMessage(&lpMsg); } return lpMsg.wParam; } // EOF