怎么让自定义控件透明
1个回答
2017-06-04 · 知道合伙人软件行家
关注
展开全部
//这是自定义控件里添加的自定义函数
/********************************************
函数说明: 绘制透明窗体
*********************************************
返回类型: 返回值为BOOL类型
*********************************************
参数个数,参数类型及说明: 参数一为HWND类型的,表示窗口句柄,参数二是BYTE类型的,表示透明度
*********************************************/
BOOL CPanel::DrawTransprentDlg(HWND hWnd,BYTE transprt)
{
m_brush.CreateSolidBrush(RGB(255,0,255));//背景设置为粉红色
//SetWindowsLong将窗体设置为层级窗体
DWORD dwExStyle = GetWindowLong(hWnd,GWL_EXSTYLE);//获取窗体信息
SetWindowLong(hWnd,GWL_EXSTYLE,dwExStyle|0x80000);//去掉当前窗口一个属性,原属性和
//设置透明色:
//用SetLayeredWindowAttributes设置透明色为0,它比UpdateLayeredWindow的使用要简单些
HMODULE hInst= LoadLibrary(_T("User32.DLL"));//加载动态链接库
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);//定义函数指针类型
MYFUNC SetLayeredWindowAttributes = NULL;//定义一个该函数指针类型的变量
//得到动态连接库的SetLayeredWindowAttributes函数,用SetLayeredWindowAttributes指向它
SetLayeredWindowAttributes = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
SetLayeredWindowAttributes(hWnd,150,0,1);//调用SetLayeredWindowAttributes函数
//SetLayeredWindowAttributes(hWnd,0,transprt,ULW_ALPHA);
FreeLibrary(hInst);//释放DLL
return true;
}
//这是在初始化的时候创建以及让自定义控件透明,但是没有反应,大家来看看怎么回事
// TODO: 在此添加额外的初始化代码
//m_PanelDemo
m_PanelDemo.ShowWindow(SW_HIDE);
CRect rec;
GetClientRect(&rec);
CPanel* panel = new CPanel();
panel->Create(L"CPanel",L"CustomDlg",CS_HREDRAW | CS_VREDRAW | CS_OWNDC,rec,this,IDC_CUSTOM_NEW);
panel->ShowWindow(SW_SHOW);
panel->DrawTransprentDlg(panel->GetSafeHwnd(),0);
//设置button在最顶层
GetDlgItem(IDC_BUTTON2)->SetWindowPos(&wndTop,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
//GetDlgItem(IDC_CUSTOM1)->SetWindowPos(&wndBottom,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
/********************************************
函数说明: 绘制透明窗体
*********************************************
返回类型: 返回值为BOOL类型
*********************************************
参数个数,参数类型及说明: 参数一为HWND类型的,表示窗口句柄,参数二是BYTE类型的,表示透明度
*********************************************/
BOOL CPanel::DrawTransprentDlg(HWND hWnd,BYTE transprt)
{
m_brush.CreateSolidBrush(RGB(255,0,255));//背景设置为粉红色
//SetWindowsLong将窗体设置为层级窗体
DWORD dwExStyle = GetWindowLong(hWnd,GWL_EXSTYLE);//获取窗体信息
SetWindowLong(hWnd,GWL_EXSTYLE,dwExStyle|0x80000);//去掉当前窗口一个属性,原属性和
//设置透明色:
//用SetLayeredWindowAttributes设置透明色为0,它比UpdateLayeredWindow的使用要简单些
HMODULE hInst= LoadLibrary(_T("User32.DLL"));//加载动态链接库
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);//定义函数指针类型
MYFUNC SetLayeredWindowAttributes = NULL;//定义一个该函数指针类型的变量
//得到动态连接库的SetLayeredWindowAttributes函数,用SetLayeredWindowAttributes指向它
SetLayeredWindowAttributes = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
SetLayeredWindowAttributes(hWnd,150,0,1);//调用SetLayeredWindowAttributes函数
//SetLayeredWindowAttributes(hWnd,0,transprt,ULW_ALPHA);
FreeLibrary(hInst);//释放DLL
return true;
}
//这是在初始化的时候创建以及让自定义控件透明,但是没有反应,大家来看看怎么回事
// TODO: 在此添加额外的初始化代码
//m_PanelDemo
m_PanelDemo.ShowWindow(SW_HIDE);
CRect rec;
GetClientRect(&rec);
CPanel* panel = new CPanel();
panel->Create(L"CPanel",L"CustomDlg",CS_HREDRAW | CS_VREDRAW | CS_OWNDC,rec,this,IDC_CUSTOM_NEW);
panel->ShowWindow(SW_SHOW);
panel->DrawTransprentDlg(panel->GetSafeHwnd(),0);
//设置button在最顶层
GetDlgItem(IDC_BUTTON2)->SetWindowPos(&wndTop,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
//GetDlgItem(IDC_CUSTOM1)->SetWindowPos(&wndBottom,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询