窗体半透明效果实现
窗体半透明这一功能实际是为了满足“一心二用”的目的而特别添加的。笔者通常在播放媒体文件时阅读电子图书,将播放软件设置为最前后总是占据不小的屏幕面积并遮挡了不少文字,使阅读变的非常不便。因此才有了将播放软件界面设置为半透明这一想法。
传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,比较麻烦。在Windows 2000以上版本的操作系统中提供有一个新的API函数SetLayeredWindowAttributes(),它能很方便的将窗体设置为半透明效果,其函数声明如下:
BOOL SetLayeredWindowAttributes( HWND hwnd, // handle to the layered window COLORREF crKey, // specifies the color key BYTE bAlpha, // value for the blend function DWORD dwFlags // action ); |
其中dwFlags有LWA_ALPHA和LWA_COLORKEY两种设置,如果LWA_ALPHA被设置的话,通过bAlpha决定透明度;如果LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示。为了能够使用该函数,还必须在之前添加预定义语句:
| #define WS_EX_LAYERED 0x00080000 |
在用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); …… // 半透明 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); |
为了方便控制窗体的透明程度,可添加滑动条控件对其进行控制。经过这样的处理,就可以在播放媒体时不受打扰地继续阅读被其遮挡的文字了。
小结
本文通过对Windows Media Player控件的使用实现了Windows Media Player 9.0媒体播放软件所具备的一般功能,并以热键隐藏、呼出窗体和窗体半透明设置为例介绍了个性化编程(www.cppentry.com)的一般方法。读者可以根据需要以类似的方式通过对其他软件提供的控件如Realplayer等的使用编写支持其他格式媒体的个性化媒体播放程序。本文所述程序在Windows 2000 Professional 下由Microsoft Visaul C++(www.cppentry.com) 6.0编译调试通过,程序运行环境需要预先安装Windows Media Player 9.0。
|