41上位机VC MFC实现任意透明度的窗口
41上位机VC MFC实现任意透明度的窗口
功能展示
有时我们自己编写的上位机程序在弹出提示信息窗口后,想实现像QQ一样,逐渐透明地退出提示窗口,给自己的程序增添点特效。如何实现这一功能呢?我们当前这一例程就来实现这一功能,效果如图 要点提示 要想实现窗口具有透明的效果,首先这个窗口得具有0X80000的扩展风格,这是第一步。然后调用User32动态库中的SetLayeredWindowAttributes函数设置半透明窗体;在Visual C++中, SetLayeredWindowAttributes()这个函数没有被直接封装,所以我们得自己手动从User32中动态地导入; 第一用SetWindowLong()设置窗口0X80000的扩展风格: SetWindowLong(hwnd, GWL_EXSTYLE,GetWindowLong(m_hWnd, GWL_EXSTYLE) | 0X80000);函数语法为LONG SetWindowLong( HWND hWnd, // handle of window int nIndex, // offset of value to set LONG dwNewLong // new value ); hWnd为窗口句柄; nIndex表示修改窗口哪一个,我们当前实现修改窗口扩展风格,所以设为GWL_EXSTYLE; dwNewLong 表示新窗口特征; BOOL SetLayeredWindowAttributes( COLORREF crKey, // 指定需要透明的背景颜色值,可用RGB()宏 BYTE bAlpha, // 设置透明度,0表示完全透明,255表示不透明 DWORD dwFlags // 透明方式 ); 其中,dwFlags参数可取以下值: LWA_ALPHA时:crKey参数无效,bAlpha参数有效; LWA_COLORKEY:窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。其常量值为1。 LWA_ALPHA | LWA_COLORKEY:crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。 实现功能 1.新建基于对话框的应用程序
2.直接自定义一个函数实现窗口透明效果 - BOOL CGkbc8Dlg::SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags)
- {
- SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | 0X80000);
-
- LAYERFUNC SetLayer;
- HMODULE hmod = LoadLibrary("user32.dll");
- SetLayer=(LAYERFUNC)GetProcAddress(hmod,"SetLayeredWindowAttributes");
- BOOL bReturn = SetLayer(hwnd,crKey,bAlpha,dwFlags);
- FreeLibrary(hmod);
- return bReturn;
- }
复制代码3.添加个变量 UINT m_nAlpha;初始化为m_nAlpha = 255;并设置一个定时器来逐渐透明窗口SetTimer(1,500,NULL); - void CGkbc8Dlg::OnTimer(UINT nIDEvent)
- {
- if(1==nIDEvent)
- {
- SetLayeredWindowAttributes(m_hWnd,RGB(0,0,0),m_nAlpha,2);
- m_nAlpha-=10;
- if(m_nAlpha<100)
- {
- m_nAlpha=255;
- }
- }
- CDialog::OnTimer(nIDEvent);
- }
复制代码
上面函数为定时器的代码
我们来演示下功能实现的整个过程 源码及视频下载 (仅在电脑可见)
|