工控编程吧
标题:
窗口透明度任意控制--上位机VC
[打印本页]
作者:
qq263946146
时间:
2016-11-29 19:16
标题:
窗口透明度任意控制--上位机VC
(, 下载次数: 2)
上传
点击文件名下载附件
窗口透明度任意控制--上位机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);
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/e2dbd223d6668ac3ba33fba7239fdfe0/0/0/w_19ruj34ua9.swf-albumId=6853314109-tvId=6853314109-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 2)
上传
点击文件名下载附件
[weixinlianxi]1[/weixinlianxi]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4