创建分层窗口,实现图像渐变

http://tech.ddvip.com   2006年07月23日    社区交流

本文详细介绍创建分层窗口,实现图像渐变

  本文示例源代码或素材下载

  有没有方法创建一个半透明的窗口,并将该窗口上发生的所有鼠标事件都传递到桌面或另一个应用窗口处理?

  当然可以,并且相当容易。你只要创建一个“分层窗口”即可。我写了一个小程序叫 lwtest 来示范如何做。你可以下载源代码。为了创建分层窗口,你需要扩展式样 WS_EX_LAYERED,此外,为了能在透明窗口上进行鼠标点击,你还需要 WS_EX_TRANSPARENT 扩展式样。在窗口创建之后,你可以同时设置两个式样,MFC 代码如下:

int CMainFrame::OnCreate(...)
{
  ...
  ModifyStyleEx(0, WS_EX_LAYERED|WS_EX_TRANSPARENT);
}

  ModifyStyle 和 ModifyStyleEx 是专用的 MFC CWnd 方法,其作用顾名思义。如果你用 C 语言编写,那么得调用 GetWindowLong(GWL_EXSTYLE) 来获取扩展式样,然后必须调用 SetWindowLong(GWL_EXSTYLE)来设置式样。其效果与 ModifyStyle(Ex)一样。当然,你也可以在创建窗口的时候使用此式样。

  一旦创建了分层窗0口,你便可以调用 SetLayeredWindowAttributes 来设置透明度。可用的分层窗口属性之一是 LWA_ALPHA,它就是用来调整透明度的,取值范围从 0(完全透明)到 255(不透明)。要得到半透明的效果,可以这样调用 SetLayeredWindowAttributes:

// in CMainFrame::OnCreate
SetLayeredWindowAttributes(0, 255 * 0.50, LWA_ALPHA);

  这里我用乘法来表示一般公式;你可以仅用 128,因为那是 255 的一半(四舍五入)。你还可以用专门的颜色作为透明色。此时,你得用 LWA_COLORKEY 作为属性,在第一个参数中指定 COLORREF。Windows 会让所有像素颜色都呈透明。注意前面的代码段假设你是从 CWnd 派生对象中调用。如果用 C 语言,你得使用 ::SetLayeredWindowAttributes,它带有一个额外的参数 HWND。

作者:Paul DiLascia    责编:豆豆技术应用

正在加载评论...