窗口透明和边框隐藏设置

上次做激光笔项目的时候想到了窗口变透明,就相当于屏幕的最上层是一个透明窗口,并且没有边框。然后今天看醒哥的屏保数字雨的时候突然间记起来上次的实现,于是又写了下。

关于窗口的透明处理首先设置下窗口属性

 SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_LAYERED);

然后用下面这个函数
BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window 透明窗体的句柄
COLORREF crKey, // specifies the color key 颜色值
BYTE bAlpha, // value for the blend function 透明度,取值范围是[0,255]
DWORD dwFlags // action 透明方式,可以取两个值:
        // 当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效; 
 // 当取值为LWA_COLORKEY时,bAlpha参数有效,而窗体中的所有颜色为crKey的地方将变为透明。
        LWA_ALPHA = 0x2
        LWA_COLORKEY=0x1
);

其中dwFlags有LWA_ALPHA(值为2)和LWA_COLORKEY(值为1)两种设置,如果LWA_ALPHA被设置的话,通过bAlpha参数指定窗体的透明度;如果LWA_COLORKEY标志被设置的话,则指定关键色为crKey,该颜色所覆盖的区域将从窗体去除,去除后的区域将不再进行点击检测,其他颜色则正常显示。如果阿尔法混合值设置为0,其窗口区域同样不进行点击检测。

至于窗口的无边框可以在创建窗口时设置参数即可。

	cx = GetSystemMetrics(SM_CXSCREEN);
	cy = GetSystemMetrics(SM_CYSCREEN);
     hwnd = CreateWindow (szAppName,                  // window class name
                          TEXT ("The Hello Program"), // window caption
                          WS_DLGFRAME | WS_THICKFRAME | WS_POPUP,        // window style
                          0,              // initial x position
                          0,              // initial y position
                          cx,              // initial x size
                          cy,              // initial y size
                          NULL,                       // parent window handle
                          NULL,                       // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                     // creation parameters

 

标签:SDK