可以利用Windows系统提供的SetLayeredWindowAttributes函数设置透明度和不透明的颜色关键值。
BOOL SetLayeredWindowAttributes(
HWND hwnd, //分层窗口句柄
COLORREF crKey, //颜色关键值
BYTE bAlpha, //描述不透明的程度,0表示全透明,255表示完全不透明
DWORD dwFlags //明确采取的动作
);
dwflags的值:
LWA_COLORKEY 使用crKey为透明值
LWA_ALPHA 使用bAlpha为窗口的不透明值
该函数只支持WS_POPUP风格窗体,不支持WS_CHILD风格窗体
参考:
SetWindowLong(m_draw.m_hWnd,GWL_EXSTYLE,GetWindowLong(m_draw.m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
::SetLayeredWindowAttributes(m_draw.m_hWnd, 0, 128, LWA_ALPHA);
具体实现:
新建一个对话框程序,在上面添加一个滑动条和一个文本框,利用类向导为滑动条添加一个关联变量m_slide,并为其添加一个相应函数OnReleasedcaptureSlider1。
代码如下:
在OnInitDialog()函数中添加如下代码:
//设置窗体大小位置不可变
::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
m_slide.SetRange(10,255); //设置滑动条的范围
m_slide.SetPos(128); //设置初始滑动位置
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst=LoadLibrary("User32.DLL");//显示加载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,128,2);
FreeLibrary(hInst);
}
在OnReleasedcaptureSlider1函数中添加如下代码:
void CTranswinDlg::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
BYTE eff=(BYTE)m_slide.GetPos();//得到滑动条位置
HINSTANCE hInst=LoadLibrary("User32.DLL");//显示加载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,eff,2);
FreeLibrary(hInst);
}
CString str;
str.Format("%d",100*eff/255);
GetDlgItem(IDC_EDIT1)->SetWindowText(str);
*pResult = 0;
}