自己动手开发音乐播放器《九》设定窗口的透明度

不知不觉中,我的音乐播放器快要做完了,只剩下一些基本的收尾工作,但是今天我们来实现一个特殊的功能,设置窗口的透明度

在程序中首先定义一些变量

/************************************************************************************************
          定义修改窗口的透明度所需的变量
*************************************************************************************************/
#define		WS_EX_LAYERED					0x00080000 
#define		LWA_COLORKEY					0x00000001 
#define		LWA_ALPHA						0x00000002 

typedef	BOOL (FAR	WINAPI	*LAYERFUNC)(HWND,COLORREF,BYTE,DWORD); 

int Item = 0;

写一个函数用于设置窗口的透明度

/************************************************************************************************
                 函数名:SetLayeredWindowAttributes
				 函数功能:设置窗口的透明度
************************************************************************************************/
BOOL SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags) 
{ 
	LAYERFUNC SetLayer; 
	BOOL bReturn;
	HMODULE	hmod = LoadLibrary("user32.dll"); 
	SetLayer = (LAYERFUNC)GetProcAddress(hmod,"SetLayeredWindowAttributes"); 
	bReturn = SetLayer(hwnd,crKey,bAlpha,dwFlags); 
	FreeLibrary(hmod); 
	return bReturn; 
}


写一个函数用于改变窗口的透明度

/*******************************************************************************************
                              函数名称: ChangeTransparency 
                              函数功能:	改变窗口的透明度
*********************************************************************************************/
void ChangeTransparency(HWND hwnd, int indexs)
{
	//得到菜单句柄
	HMENU hMenu = GetMenu(hwnd);

	switch (indexs)
	{
		case 0: //窗口的透明度为10%
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);

			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为10%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),25,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为10%
				CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),25,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 1://窗口的透明度为30%
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);

			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为30%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),50,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为10%
				CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),50,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 2: //设定窗口的透明度为50%
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);
			
			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为50%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),125,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为50%
				CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),125,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 3://设定窗口的透明度为70%
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);
			
			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为70%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),175,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为10%
				CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),175,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 4://设定窗口的透明度为90% 
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);
			
			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为90%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),225,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为90%
				CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),225,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 5: //设定窗口为不透明
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
			
			//设置窗口的透明度为不透明
			SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			SetLayeredWindowAttributes(hwnd,RGB(100,100,100),255,LWA_ALPHA);	
		}
		break;
		default:
		break;
	}
}


最后老规矩在void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)中添加下面的代码就OK了

  case ID_MENUTM10://设定窗口透明度为10%
		{
			ChangeTransparency(hwnd, 0);
		}
		break;

		case ID_MENUTM30://设定窗口透明度为30%
		{
			ChangeTransparency(hwnd, 1);
		}
		break;
		
		case ID_MENUTM50://设定窗口透明度为50%
		{
			ChangeTransparency(hwnd, 2);
		}
		break;
		
		case ID_MENUTM70://设定窗口透明度为70%
		{
			ChangeTransparency(hwnd, 3);
		}
		break;
		
		case ID_MENUTM90://设定窗口透明度为90%
		{
			ChangeTransparency(hwnd, 4);
		}
		break;
		
		case ID_MENUUNTM://设定窗口为不透明
		{
			ChangeTransparency(hwnd, 5);
		}
		break;



程序的运行效果



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值