win7的透明的透明效果看起來炫吧 ^_-。
其實用簡單的系統API就可以實現了。如下:
SetLayeredWindowAttributes:
BOOL SetLayeredWindowAttributes( HWND hwnd, // 透明窗體的句柄 COLORREF crKey, // 掩碼的顏色 BYTE bAlpha, // 不透明度 DWORD dwFlags // 透明方式 );
dwFlags :
當取值爲LWA_ALPHA時,crKey參數無效,bAlpha參數有效。
當取值爲LWA_COLORKEY時,窗體中的所有顏色爲crKey的地方將變爲透明,bAlpha參數無效。
也可以取兩個值的組合:LWA_ALPHA | LWA_COLORKEY。這樣crKey的地方將變爲全透明,而其它地方根據bAlpha參數確定透明度。
WS_EX_LAYERED
要使使窗體擁有透明效果,首先要有WS_EX_LAYERED擴展屬性。
LONG nRet = ::GetWindowLong(hWnd, GWL_EXSTYLE); nRet = nRet | WS_EX_LAYERED; ::SetWindowLong(hWnd, GWL_EXSTYLE, nRet);
例子:
// ------------------------------------------------------------------------- // 文件名 : WinMain.cpp// 創建者 : 方煜寬// 郵箱 : [email protected]// 功能描述 : 透明窗體//// -------------------------------------------------------------------------#include<windows.h>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);const int X0 = 120;const int Y0 = 50;const int WIDTH = 800;const int HEIGHT = 600;int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hWnd; MSG msg; TCHAR lpszClassName[] = TEXT("窗口"); WNDCLASS wc; 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 = (HBRUSH)::GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = lpszClassName; RegisterClass(&wc); hWnd = CreateWindow(lpszClassName, TEXT("Windows"), WS_OVERLAPPEDWINDOW, X0, Y0, WIDTH, HEIGHT, NULL, NULL, hInstance, NULL); ::ShowWindow(hWnd, SW_SHOWNORMAL); ::UpdateWindow(hWnd); // 實現透明必須設置WS_EX_LAYERED標誌 LONG nRet = ::GetWindowLong(hWnd, GWL_EXSTYLE); nRet = nRet | WS_EX_LAYERED; ::SetWindowLong(hWnd, GWL_EXSTYLE, nRet); while(::GetMessage(&msg, NULL, 0, 0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_LBUTTONDOWN: { ::MessageBeep(0); ::SetLayeredWindowAttributes(hWnd, 0, 123, LWA_ALPHA); // 設置半透明 } break; case WM_RBUTTONDOWN: { ::MessageBeep(0); ::SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA); // 設置不透明 } break; case WM_DESTROY: ::PostQuitMessage(0); break; default: return ::DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }