参考文章:http://www.vckbase.com/document/viewdoc/?id=333
一些常量:
WS_EX_LAYERED = 0x80000;
LWA_ALPHA = 0x2;
LWA_COLORKEY=0x1
其中dwFlags有LWA_ALPHA和LWA_COLORKEY
LWA_ALPHA被设置的话,通过bAlpha决定透明度.
LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示.
注:要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧sdk也没有的).
1、首先设置透明窗口属性(在OnInitDialog函数中):
//加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);//设置背景透明属性
2、添加实现透明度函数:
参数 transparency):透明度值
void CTestDlg::SetLayeredWindow(int transparency)
{
HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0,(BYTE)transparency,2);
//如果设置为1,那么将设置RGB(0,0,0)颜色的透明度:220
//if(fun)fun(this->GetSafeHwnd(),RGB(0,0,0),220,1);
FreeLibrary(hInst);
}
}
3、添加Slider控件及绑定变量m_Slider
在OnInitDialog,设置范围:15-255(因为透明度的值范围为:0-255,而0的话,到时对话框将会失去焦点而消失)
同时设置透明度初始值,代码如下:
m_Slider.SetRange(15,255);//设置滑动范围
m_Slider.SetPos(255);//设置滑动初始位置
SetLayeredWindow(255);//初始为正常窗口(透明度值:255)
4、添加slider控件的消息响应函数:
首先了解下如下两个消息区别:
NM_CUSTOMDRAW,是子控件通知其父控件它已经完成重画功能,对Slider来说也就是我们每次鼠标按
住滑块移动一下就能使滑块向拥有该滑块的Slider产生一个NM_CUSTOMDRAW消息,以便用户实时获得
移动滑块时的是实时值。
NM_RELEASEDCAPTURE,是子控件被鼠标按住拖动到适当位置以后鼠标释放时子控件向父控件产发送的
消息,对于Slider来说就是每次滑块被鼠标拖曳完鼠标释放的时候滑块给Slider发送的消息。
所以我们选择NM_CUSTOMDRAW,消息响应函数OnCustomdrawSlider1代码如下:
void CTestDlg::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CSliderCtrl *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
int iPos = pSlidCtrl->GetPos();//取得当前位置值
SetLayeredWindow(iPos);
CString strPos;
strPos.Format(_T("%d"),iPos);
//这个CStatic控件是设置显示滑块值的,可自行添加
GetDlgItem(IDC_STATIC_INFO)->SetWindowText(strPos);
*pResult = 0;
}
或者可在对话框的ON_WM_HSCROLL消息响应函数OnHScroll中添加为:
//水平滚动条
void CTestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_THUMBTRACK: //拖动滚动滑块时
if(pScrollBar->m_hWnd==m_Slider.m_hWnd) //根据pScrollBar确定是那个滚动条
{
int iPos = m_Slider.GetPos();//取得当前位置值
SetLayeredWindow(iPos);
CString strPos;
strPos.Format(_T("%d"),iPos);
GetDlgItem(IDC_STATIC_INFO)->SetWindowText(strPos);
}
break;
default:
break;
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}