[ATL/WTL]_[中级]_[原生的复选框(checkbox button)和单选按钮(radio button)实现透明背景效果解决方案]
2014-09-21 14:10
911 查看
场景:
1. mfc,wtl的原生控件都是通过父窗口拦截 WM_CTLCOLORSTATIC 事件来修改子控件的颜色和背景色,CStatic可以通过返回HOLLOW_BRUSH来绘制透明背景:
但是如果使用manifest文件使用最新 外观样式的话,返回HOLLOW_BRUSH对checkbox和radio button没有任何效果,原背景还是存在。虽然通过自绘一个checkbox和radio button 并不是什么难事,但是使用原生的button话在新系统(WIN8)下会得到一致的体验-- 使用最新的windows原生的样式或外观. 其实我的原则就是原生能做到的,就不需要重复造轮子.
” 邓学斌 “ 大牛也做过这方面的解释: http://blog.csdn.net/cometnet/article/details/38080449
最开始学习控件背景透明 参考的是 “吹泡泡的小猫” 的文章 创建有个性的对话框之ATL/WTL篇
但是这个demo也是出现我刚说的问题,就是radio button, checkbox 没效果.
解决方案:
1. 使用这个函数返回一个BITMAP BRUSH来绘制背景,注意并不是透明BRUSH.
但这样会产生一个问题,每个控件都需要一个特定区域的背景图片作为背景,如果界面上控件多的话为每个控件绘制背景这是一个浩大的工作量。所以这里我写了一个helper类帮我们做这些事情.
dh_window_bg_brush_helper.h
dh_window_bg_brush_helper.cpp
调用方式:
1.在父控件Dialog里定义一个成员函数:
3.同样的在onCtlColor处理函数里根据hWnd获取对应的BRUSH来绘制背景.
效果图, 这里是在“吹泡泡的小猫” 的原程序上改的效果:
程序下载地址:
http://download.csdn.net/detail/infoworld/7952165
1. mfc,wtl的原生控件都是通过父窗口拦截 WM_CTLCOLORSTATIC 事件来修改子控件的颜色和背景色,CStatic可以通过返回HOLLOW_BRUSH来绘制透明背景:
m_HollowBrush = AtlGetStockBrush(HOLLOW_BRUSH);
但是如果使用manifest文件使用最新 外观样式的话,返回HOLLOW_BRUSH对checkbox和radio button没有任何效果,原背景还是存在。虽然通过自绘一个checkbox和radio button 并不是什么难事,但是使用原生的button话在新系统(WIN8)下会得到一致的体验-- 使用最新的windows原生的样式或外观. 其实我的原则就是原生能做到的,就不需要重复造轮子.
” 邓学斌 “ 大牛也做过这方面的解释: http://blog.csdn.net/cometnet/article/details/38080449
最开始学习控件背景透明 参考的是 “吹泡泡的小猫” 的文章 创建有个性的对话框之ATL/WTL篇
但是这个demo也是出现我刚说的问题,就是radio button, checkbox 没效果.
解决方案:
1. 使用这个函数返回一个BITMAP BRUSH来绘制背景,注意并不是透明BRUSH.
CreatePatternBrush
但这样会产生一个问题,每个控件都需要一个特定区域的背景图片作为背景,如果界面上控件多的话为每个控件绘制背景这是一个浩大的工作量。所以这里我写了一个helper类帮我们做这些事情.
dh_window_bg_brush_helper.h
#ifndef __DH_WINDOW_BG_BRUSH_HELPER #define __DH_WINDOW_BG_BRUSH_HELPER #include <Windows.h> #include <map> class DhWindowBgBrushHelper { public: DhWindowBgBrushHelper(); ~DhWindowBgBrushHelper(); void AddSubWindow(HWND hwnd,HBITMAP parent_background); HBRUSH GetHBRUSH(HWND hwnd); private: std::map<HWND,HBRUSH> hbrush; }; #endif
dh_window_bg_brush_helper.cpp
#include "stdafx.h" #include "dh_window_bg_brush_helper.h" DhWindowBgBrushHelper::DhWindowBgBrushHelper() { } DhWindowBgBrushHelper::~DhWindowBgBrushHelper() { std::map<HWND,HBRUSH>::iterator ite = hbrush.begin(); for(; ite != hbrush.end(); ++ite) { ATLASSERT(ite->second != NULL); ::DeleteObject(ite->second); } hbrush.clear(); } void DhWindowBgBrushHelper::AddSubWindow(HWND hwnd,HBITMAP parent_background) { CWindow child(hwnd); CWindow parent = child.GetParent(); RECT rect; RECT parent_window_rect; RECT parent_client_rect; parent.GetWindowRect(&parent_window_rect); parent.GetClientRect(&parent_client_rect); child.GetWindowRect(&rect); parent.ScreenToClient(&rect); long width = rect.right - rect.left; long height = rect.bottom - rect.top; CDC sdc; CDC ddc; sdc.CreateCompatibleDC(NULL); ddc.CreateCompatibleDC(NULL); CBitmap destBmp; destBmp.CreateCompatibleBitmap(CClientDC(NULL),width,height); sdc.SelectBitmap(parent_background); ddc.SelectBitmap(destBmp); ddc.BitBlt(0, 0, width, height, sdc, rect.left, rect.top, SRCCOPY ); CBrush bs ; bs.CreatePatternBrush(destBmp); hbrush[hwnd] = bs; bs.Detach(); } HBRUSH DhWindowBgBrushHelper::GetHBRUSH(HWND hwnd) { ATLASSERT(hwnd); if(hbrush.find(hwnd) != hbrush.end()) { return hbrush[hwnd]; } return NULL; }
调用方式:
1.在父控件Dialog里定义一个成员函数:
DhWindowBgBrushHelper brush_helper_;2. 在 初始化 OnInitDialog 里调用helper.
brush_helper_.AddSubWindow(GetDlgItem(1014),m_Bitmap); brush_helper_.AddSubWindow(GetDlgItem(1015),m_Bitmap);
3.同样的在onCtlColor处理函数里根据hWnd获取对应的BRUSH来绘制背景.
LRESULT CBmpDlg::OnCtlColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { HDC hDC = (HDC)wParam; HWND hWnd = (HWND)lParam; int style = GetStyle(); if(uMsg == WM_CTLCOLORSTATIC) { SetTextColor(hDC,t_crTextColor); SetBkMode(hDC,TRANSPARENT); bHandled = TRUE; HBRUSH brush = brush_helper_.GetHBRUSH(hWnd); if(brush) { return (LRESULT)brush; } return (LRESULT)m_HollowBrush; } SetTextColor(hDC,t_crTextColor); SetBkMode(hDC,TRANSPARENT); return 0; }
效果图, 这里是在“吹泡泡的小猫” 的原程序上改的效果:
程序下载地址:
http://download.csdn.net/detail/infoworld/7952165
相关文章推荐
- [ATL/WTL]_[中级]_[原生的复选框(checkbox button)和单选按钮(radio button)实现透明背景效果解决方案]
- 一步一步地实现菜单栏(JMenuBar)工具栏(JPopupMenu)组合框(JComboBox)复选框(JCheckBox)单选按钮(JRadioButton)文本域的综合应用(二)
- 一步一步地实现菜单栏(JMenuBar)工具栏(JPopupMenu)组合框(JComboBox)复选框(JCheckBox)单选按钮(JRadioButton)文本域的综合应用(三)
- 一步一步地实现菜单栏(JMenuBar)工具栏(JPopupMenu)组合框(JComboBox)复选框(JCheckBox)单选按钮(JRadioButton)文本域的综合应用(一)
- 8、单选按钮(JRadioButton)和复选框(JCheckBox)
- checkbox实现单选按钮效果
- 单选按钮RadioGroup、复选框CheckBox的OnCheckedChangeListener事件的实现方法
- android checkBox背景样式及用颜色值实现按钮点击效果
- JSP单选按钮验证、下拉框验证、复选框验证实现代码
- javascript实现复选框实现单选按钮功能
- Extjs 利用panel html属性加入DIV实现如TextArea的效果,并且能正确使用html标签,实现如向textarea文本域嵌入按钮button或其他控件,,而且兼容firefox
- Silverlight中利用ListBox特性实现单选按钮组RadioButtonList和复选按钮组CheckBoxList的功能
- Android中ImageButton自定义按钮的按下效果的代码实现方法
- 把checkbox复选框转换成单选按钮radio
- C# WinForm下DataGridView单选按钮列和支持三种选择状态的复选框列的实现
- js把 CheckBox 复选框 做成 radio 单选 的效果
- CSS实现PNG图片背景透明效果
- flash CS3 在Datagrid(表格组件)中加入Button(按钮)、checkbox(复选框)、combobox下拉框、combotree(树状下拉框)等组件
- 把checkbox复选框转换成单选按钮radio
- 一个继承于CButton的按钮控件类,实现Button背景色与文字的共存与改变,可以自行设计背景色