您的位置:首页 > 其它

实现透明窗体

2012-11-22 16:31 399 查看
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

本文地址:/article/5259784.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: