淘宝网站域名,个人微信网站建设,wordpress前台特别慢,开发一款新闻app需要多少钱摘要#xff1a;本文主要介绍了Windows 2000下新增的API函数SetLayeredWindowAttributes#xff08;#xff09;以及通过该函数实现窗体透明特效的一般方法#xff0c;并结合代码给出了具体的编程实现过程。引言 Windows 2000操作系统无论是在品质上还是在用户界面上都… 摘要本文主要介绍了Windows 2000下新增的API函数SetLayeredWindowAttributes以及通过该函数实现窗体透明特效的一般方法并结合代码给出了具体的编程实现过程。引言 Windows 2000操作系统无论是在品质上还是在用户界面上都有了很大的改善与提高用户对系统的操作变的更加简单、方便感觉也更加舒适。如果用户在使用时留意一下不难发现其中界面上的一些新特性。例如Windows 2000提供了对带阴影阿尔法混合光标的支持、提供对菜单、提示框淡入淡出效果的支持以及在外壳拖拽具有阿尔法混合效果图片等透明特效。所有这些特效看似不同但实际都是通过对Windows 2000新提供的一个分层窗口API函数的调用而实现的。 既然是Windows 2000系统提供的API函数那么也就意味着在自己的应用程序中同样能够实现该函数做做支持的各种特效。 在程序设计时有时一些微小的改善就足以增强用户界面的显示效果。例如使用一个具有阿尔法混合效果的光标显然要比一只普通光标的感觉要好的多尤其是在大屏幕显示器或多显示器系统下这种光标也更容易找到。更进一步显示器的屏幕大小是有限的如果想同时查看多个窗口的内容显然是不太方便的尽管采取大屏幕显示器或多显示器系统能在一定程度上缓解但远不如将这些应用程序窗体设置为透明或半透明来的彻底和方便。下图显示的两个应用程序虽然存在覆盖但位于前台的程序窗体显然没有影响后台Word文档内容的显示。鉴于分层窗口函数在程序设计中的实用作用本文将对其作具体的介绍以充分挖掘其潜力并将其应用到程序设计中去。 分层窗口 在介绍分层窗口函数之前首先要介绍一下WS_EX_LAYERED扩展窗口风格。该窗口风格也是Windows 2000新增加的如果使用了该属性窗体将具备复合形状、动画、阿尔法混合等方面的视觉特效。 窗口通过被其他窗口的裁剪而在屏幕上以矩形出现。为了实现一个圆形窗体仅仅简单绘制一个圆形窗体是不够的这样的话系统还会把窗体按原矩形进行点击检测而且位于该窗体下的窗口仍将被该窗体矩形所裁剪。或许可以考虑在园形窗体显示出来前取得位于该窗体矩形下可视区域的快照并在稍后窗体显示完毕后将其绘制到当前窗体。但由于其他窗口能够绘制该窗体覆盖下的区域而前台程序无法获知这种绘制将于何时发生而不会及时获取下面可视区域的新的快照因此这种解决方法并不能在多进程、多任务环境下很正常的工作。对于这种情况在Windows 95/98和Windows NT 4.0下的正确做法是通过SetWindowRgnAPI函数指出需要的窗体形状但是这种处理在频繁更改窗体形状或是在屏幕上拖拽时仍有缺陷存在前台窗体将要求位于其下的窗体重绘整个区域这将生过多的消息和计算量。而且使用SetWindowRgn只能实现窗体的全透明而无法实现半透明效果。或许这也正是分层窗口被提出的原因。 分层窗口真正实现了两个截然不同的概念分层和重定向。为了能够去除任何一个层WS_EX_LAYERED标志位必须要设置这可以在窗体创建时设置也可以在创建后通过以GWL_EXSTYLE标志调用SetWindowLong来进行设置。接下来可以通过UpdateLayeredWindows函数来更新分层窗口。在具体使用时需要在位图中绘制出可视区域并将其与关键色、阿尔法混合参数等一起提供给UpdateLayeredWindows函数。需要注意的是在使用UpdateLayeredWindows函数时应用程序并不需要响应WM_PAINT或其他绘制消息。 除此之外还可以使用传统的Win32绘制机制来实现这需要调用另一个API函数SetLayeredWindowAttributes来完成对关键色或阿尔法混合参数值的设定。一旦该函数被调用系统将开始为分层窗口重定向所有的绘制并自动应用指定的特效。 窗体半透明特效的实现 前面已经对分层窗口做了较为详细的介绍。这里将对SetLayeredWindowAttributes函数及其使用方法做具体的介绍并在此基础上实现窗体半透明特效。首先给出SetLayeredWindowAttributes原形 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_COLORKEY0x1 ); 其中dwFlags有LWA_ALPHA值为2和LWA_COLORKEY值为1两种设置如果LWA_ALPHA被设置的话通过bAlpha参数指定窗体的透明度如果LWA_COLORKEY标志被设置的话则指定关键色为crKey该颜色所覆盖的区域将从窗体去除去除后的区域将不再进行点击检测其他颜色则正常显示。如果阿尔法混合值设置为0其窗口区域同样不进行点击检测。 前面说过SetLayeredWindowAttributes函数是Windows 2000新增的一个API函数它所在的模块为USER32.DLL。在用GetModuleHandle装载USER32.DLL模块并调用GetProcAddress得到函数 SetLayeredWindowAttributes在User32.dll中的指针后就可以通过SetLayeredWindowAttributes函数将窗体设置为半透明了 // 全局变量 typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags); lpfn g_pSetLayeredWindowAttributes; …… // 获取函数 SetLayeredWindowAttributes 在User32.dll中的指针 HMODULE hUser32 GetModuleHandle(_T(USER32.DLL)); g_pSetLayeredWindowAttributes (lpfn)GetProcAddress(hUser32, SetLayeredWindowAttributes); if (g_pSetLayeredWindowAttributes NULL) ::PostQuitMessage(0); 这段代码通常在程序初始化时运行以及时将USER32.DLL模块装载到内存并获取得到SetLayeredWindowAttributes函数指针。在程序退出前需要通过FreeLibrary函数释放先前加载的模块 // 卸载模块 if (m_hUser32 ! NULL) FreeLibrary(m_hUser32); 在将窗体设置为半透明时首先要获取得到该窗体的窗口句柄以指明要操作的是哪一个窗口。如果是对本应用程序中的某个窗口进行设置可以通过传递窗口句柄或是用GetSafeHwnd来动态获取。如果要对本程序外的某个程序窗口进行设置一般的做法是通过对FindWindow函数的调用来获取指定窗口标题的窗口句柄。在得到窗口句柄之后并不能直接调用SetLayeredWindowAttributes进行设置需要在GetWindowLong获取得到当前窗口风格设置后在其基础之上添加WS_EX_LAYERED扩展风格并通过SetWindowLong函数将其设置 // 半透明 HWND hWnd GetSafeHwnd(); LONG lWindowLong GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED; ::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong); g_pSetLayeredWindowAttributes(hWnd, 0, (BYTE)m_sldAlpha.GetPos(), 2); ::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); 为了能够使用该函数还必须在上述语句之前添加预定义语句 #define WS_EX_LAYERED 0x00080000 异形窗体特效的实现 使用SetLayeredWindowAttributes创建异形窗体是非常简单的具体过程与半透明窗体的实现极为类似所不同的只是将标志设置为LWA_COLORKEY并指定需要透明显示的关键色 // 指定关键色 HWND hWnd GetSafeHwnd(); LONG lWindowLong GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED; ::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong); g_pSetLayeredWindowAttributes(hWnd, RGB(255, 255, 255), 0, 1); ::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); 小结 本文通过对Windows 2000新增API函数SetLayeredWindowAttributes的使用非常简单的实现了窗体的半透明设置和异形窗体的创建。除了SetLayeredWindowAttributes函数Windows 2000还提供了其他许多类似的特效函数比如用于窗体动态滑动显示的AnimateWindow。由于这些函数是系统提供的API函数因此不会受编程语言的制约也就是说并不只在VC下可以实现上述特效。在C Builder、Delphi等其他开发环境下也是可以用类似的方法来实现的。本文所述程序代码在Windows 2000 Professional下由Microsoft Visual C 6.0编译通过。