MFC实现背景透明,控件不透明的对话框,且点击图片有事件响应
2018-03-23 16:07
691 查看
最终成果:背景半透明、但是控件不透明的对话框。
对话框上用图片代表功能,当点击图片时,响应点击事件,弹出相对应的对话框。
对话框固定大小,不可放大缩小,以免影响图片的显示数量。
对话框有一个向左/向右的按钮,点击能够隐藏/显示整体对话框
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|WS_EX_LAYERED);
SetLayeredWindowAttributes(0,150,LWA_ALPHA); 得到的效果是 对话框和控件一起半透明。原因:
设置LWA_ALPHA参数时,对话框只取决于设置的透明度,是整体窗体包括窗体上的控件,相同的透明度 方法二:在OnInitDialog()函数中,添加代码: COLORREF maskColor = RGB(255,255,255); //掩码颜色
SetWindowLong(this->GetSafeHwnd(),
GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)| 0x80000); //设定窗体使用扩展模式
SetLayeredWindowAttributes(maskColor,128,LWA_COLORKEY) 同时,添加OnCtlColor响应函数:HBRUSH CTransparentDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if(nCtlColor == CTLCOLOR_DLG) //此处设置为窗体透明,CTLCOLOR_DLG表示对话框
{
CBrush *brush;
brush = new CBrush(RGB(255,255,255));
return (HBRUSH)(brush->m_hObject);
}
if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC) //静态文本背景透明
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0,0,0));
return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
// TODO: Return a different brush if the default is not desired
return hbr;
} 最终的效果为 窗体全透明,控件不透明。原因:
在OnCtlColor函数中,brush = new CBrush(RGB(255,255,255))将窗体背景色全部刷成RGB(255,255,255)白色。
而OnInitDialog()函数中COLORREF maskColor = RGB(255,255,255); 且SetLayeredWindowAttributes参数设置为LWA_COLORKEY,代表将对话框中颜色为RGB(255,255,255)的部分,替换为全透明色。于是就出现了窗体全透明而控件不透明的情况。
以上2种方法都没有解决我需要的“窗体半透明,控件不透明”的问题,等找到解决方案后再补充
PS:20180327 补充,最终方法是让美工做了一张半透明的图片,加载资源到工程,作为整个对话框的主背景,23333333333......
对话框添加图片控件,控件属性—Type改为Bitmap,于是Image就可以下拉选择刚才导入的图片了
修改图片控件的ID(图片在MFC中被包装成static类,vs对static类的控件都不提供Wizard),设置Notify属性为TRUE,于是就可以为图片添加点击事件了。
对话框上用图片代表功能,当点击图片时,响应点击事件,弹出相对应的对话框。
对话框固定大小,不可放大缩小,以免影响图片的显示数量。
对话框有一个向左/向右的按钮,点击能够隐藏/显示整体对话框
步骤一:背景透明、控件不透明
方法一:创建一个对话框CTransparentDlg,在OnInitDialog()函数中,添加代码:SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|WS_EX_LAYERED);
SetLayeredWindowAttributes(0,150,LWA_ALPHA); 得到的效果是 对话框和控件一起半透明。原因:
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参数确定透明度。
#define LWA_COLORKEY 0x00000001 #define LWA_ALPHA 0x00000002
设置LWA_ALPHA参数时,对话框只取决于设置的透明度,是整体窗体包括窗体上的控件,相同的透明度 方法二:在OnInitDialog()函数中,添加代码: COLORREF maskColor = RGB(255,255,255); //掩码颜色
SetWindowLong(this->GetSafeHwnd(),
GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)| 0x80000); //设定窗体使用扩展模式
SetLayeredWindowAttributes(maskColor,128,LWA_COLORKEY) 同时,添加OnCtlColor响应函数:HBRUSH CTransparentDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if(nCtlColor == CTLCOLOR_DLG) //此处设置为窗体透明,CTLCOLOR_DLG表示对话框
{
CBrush *brush;
brush = new CBrush(RGB(255,255,255));
return (HBRUSH)(brush->m_hObject);
}
if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC) //静态文本背景透明
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0,0,0));
return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
// TODO: Return a different brush if the default is not desired
return hbr;
} 最终的效果为 窗体全透明,控件不透明。原因:
在OnCtlColor函数中,brush = new CBrush(RGB(255,255,255))将窗体背景色全部刷成RGB(255,255,255)白色。
而OnInitDialog()函数中COLORREF maskColor = RGB(255,255,255); 且SetLayeredWindowAttributes参数设置为LWA_COLORKEY,代表将对话框中颜色为RGB(255,255,255)的部分,替换为全透明色。于是就出现了窗体全透明而控件不透明的情况。
以上2种方法都没有解决我需要的“窗体半透明,控件不透明”的问题,等找到解决方案后再补充
PS:20180327 补充,最终方法是让美工做了一张半透明的图片,加载资源到工程,作为整个对话框的主背景,23333333333......
步骤二:添加图片和图片响应事件
resource资源视图下,导入bmp格式的图片。对话框添加图片控件,控件属性—Type改为Bitmap,于是Image就可以下拉选择刚才导入的图片了
修改图片控件的ID(图片在MFC中被包装成static类,vs对static类的控件都不提供Wizard),设置Notify属性为TRUE,于是就可以为图片添加点击事件了。
步骤三:隐藏/显示对话框
未完待续...相关文章推荐
- mfc基本对话框中的控件透明到背景图片
- MFC 软件登陆界面的实现(可以用来做启动画面,添加bmp图片,然后给图片加点击响应事件。)
- MFC对话框控件和背景图片自适应窗口最大化和拉伸缩放的实现
- MFC对话框控件和背景图片自适应窗口最大化和拉伸缩放的实现
- Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件
- Android通过请求网络数据实现ListView,ListView的优化、图片的缓存、子控件的点击事件。
- IE DIV背景透明,点击事件不响应解决方案
- MFC程序实现给对话框添加背景图片
- 实现点击图片不同区域响应不同的事件
- 在MFC对话框中,如何让控件Static和Radio和CheckBox背景透明?
- MFC一一添加背景图片并让控件实现透明的
- MFC 对话框载入背景图片-控件加载图片
- 在MFC对话框中,如何让控件Static和Radio和CheckBox背景透明?
- MFC 图片控件图片加载以及鼠标移动事件和鼠标点击事件
- 实现对话框在位图作为背景时的控件透明
- mfc实现以图片作为对话框的背景
- jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
- MFC中实现Static控件背景透明
- MFC中动态创建控件以及事件响应实现方法
- MFC程序实现给对话框加入�背景图片