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 // 创建者 : 方煜宽 // 邮箱 : fangyukuan@gmail.com // 功能描述 : 透明窗体 // // ------------------------------------------------------------------------- #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; }
效果:
参考资料:http://baike.baidu.com/view/1329156.htm
本文地址:http://www.cnblogs.com/fangyukuan/archive/2012/04/18/2454660.html