不知不觉中,我的音乐播放器快要做完了,只剩下一些基本的收尾工作,但是今天我们来实现一个特殊的功能,设置窗口的透明度
在程序中首先定义一些变量
/************************************************************************************************
定义修改窗口的透明度所需的变量
*************************************************************************************************/
#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;
程序的运行效果