窗口透明度任意控制--上位机VC
窗口透明度任意控制--上位机VC
功能展示
窗口透明可以美化程序界面,但VC6.0中微软没有开放出透明度设置函数,我们当前例程通过动态加载User32.DLL库,调用窗口透明度设置函数,实现窗口透明度的任意设置,效果如图。程序运行初始化设置窗口透明度为128,及滑块控件的位置,用户拖动滑块可任意设置窗口的透明度 要点提示 SetLayeredWindowAttributes()可以设置窗口的透明度,在User32.DLL库里实现,但并未在VC6.0中开放使用。例程通过动态调用库HINSTANCE hInst = LoadLibrary(“User32.DLL”); 获取库的实例。 再通过函数GetProcAddress(hInst,“SetLayeredWindowAttributes”);获得窗口透明度设置函数,就可以进一步设置窗口透明度; 下面是SetLayeredWindowAttributes函数的介绍 BOOL SetLayeredWindowAttributes( HWND hwnd, // 指定分层窗口句柄 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参数确定透明度。 要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性,方法可以在CreateWindowEx时指定,也可以SetWindowLong动态设置。如下代码可设置分层窗口:
SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE) |= WS_EX_LAYERED); 实现功能 1.新建基于对话框的应用程序 2.拖拽一滑块控件IDC_SLIDER1,用于控制透明度, 再一进度条控件IDC_PROGRESS1,用于显示透明度,再添加些控件作为点缀;
3.在程序初始化时初始化控件及窗口透明度 - CProgressCtrl* pProgress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
- pProgress->SetRange(0,255);
- pProgress->SetPos(128);
- CSliderCtrl* pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
- pSlider->SetRange(0,255);//设置调节范围为透明度范围
- pSlider->SetPos(128);//设置位置
- //透明窗口需有0x80000风格
- SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
- HINSTANCE hInst = LoadLibrary("User32.DLL");
- if(hInst) //调用User32.DLL库中 SetLayeredWindowAttributes函数,设置窗口透明度
- {
- 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);
- }
复制代码4.添加OnHScroll()水平滚动函数,在内部实现滑块滚动,设置窗口透明度功能 - void CGkbc8Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
- {
- CSliderCtrl* pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
- if(pScrollBar->m_hWnd == pSlider->m_hWnd)
- {
- int nPos = pSlider->GetPos();
- HINSTANCE hInst = LoadLibrary("User32.DLL");
- if(hInst)
- {
- typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
- MYFUNC fun = NULL;
- fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
- if(fun)
- fun(this->GetSafeHwnd(),0,nPos,2);
- FreeLibrary(hInst);
- };
- CProgressCtrl* pProgress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
- pProgress->SetPos(nPos);
- }
- CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
- }
复制代码我们来演示下功能实现的整个过程 如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|