WM_ERASEBKGND消息及位图背景与透明的实现
2014-11-09 00:58
906 查看
2009-06-05 10:27:17| 分类:
VC/MFC/C++ | 标签:
|举报
|字号大中小 订阅
点击打开链接
一、添加WM_ERASEBKGND消息
1、对话框类的OnEraseBkgnd
a、首先,为了下面使用擦除背景的方便,先增加OnEraseBkgnd函数(WM_ERASEBKGND ),但好多新手都不知道对话框在那里找增加这个函数,来跟我来
快捷键Ctrl+W打开ClassWizard对话框(菜单->view->ClassWizard):选择Class Info,找到左下角的Message filter,下拉列表至最底部,选中Window,OK保存
b、我们再Ctrl+W 打开ClassWizard对话框,MessageMaps->Class Name:选择当前工程对话框->Object IDs:选择当前对话框->Messages:下拉找吧,WM_ERASEBKGND有了吧,双击或者Add Function,添加到下面的Member functions后,再双击就可以编辑此函数代码了
2、CMainFrame等非对话框的OnEraseBkgnd直接在Workspace中ClassView页的类名上右键菜单中的"Add Windows Message Hander... ”,在弹出的对话框左边列表中找到WM_ERASEBKGND消息,双击或点Add按钮就自动添加了。
3、当然除了以上的方法之外,如果对代码结构基本了解的话,还可以自己手动增加:
a、工程的头文件中增加擦出背景函数定义
afx_msg BOOL OnEraseBkgnd(CDC *pDC);
b、增加消息响应
BEGIN_MESSAGE_MAP(C******Dlg, CDialog) // C******Dlg是你自己对话框的工程类
……
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
c、工程源文件cpp中增加此函数的操作部分
BOOL
CYourDlg::OnEraseBkgnd(CDC *pDC)
{
//在这里你想增加那些对图片背景处理的东西就随便填吧
return TRUE;
}
二、载入位图背景及控件的透明化
1、使用OnEraseBkgnd函数实现对话框位图背景
BOOL CYourDlg::OnEraseBkgnd(CDC *pDC) //增加擦出背景函数
{
CRect rect;
GetClientRect(&rect);
CBitmap m_pBmp;
BITMAP bm;
CDC dcMem;
m_pBmp.LoadBitmap(IDB_BITMAP1);
m_pBmp.GetBitmap(&bm);//得到位图尺寸
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&m_pBmp);
pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
return TRUE;
}
到这里就可以实现位图了,但STATIC控件背景不透明,显得很难看。
2、来我们让STATIC控件透明吧
HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
}
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
到这里其实就可以了,BMP的图片背景实现了,文本框的透明也实现了。
3、补充说明:如果程序运行过程中,需要设置文本框的字体的话,会出现显示"字体重叠不刷新"的问题
4、这就要对该控件或者对话框处理了,要刷出新字体来。
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
pWnd->SetWindowText("guohaiyang.blog.163.com");//需要修改的控件标题
//这里可以刷整个对话框,但如果较频繁的话,很明显能看出来,就选择刷显示字体的那块区域就可以了
pWnd ->GetParent()->InvalidateRect(CRect(0,0,100,50),TRUE);
好了,没有问题了,剩下随便你玩吧,这个解决方法不像网上说的,非要借用人家的自己写的函数,现在完全用VC提供的就可以了,免得加这个那个的头文件
补充下,自己实验发现
pWnd ->GetParent()->InvalidateRect(CRect(0,0,100,50),TRUE);
并不能完全解决刷新问题
最终使用
this->RedrawWindow();
来实现
虽然会出现控件的明显闪屏现象,但不影响使用
如果有更好的方法请赐教~
[参考] http://guohaiyang.blog.163.com/blog/static/3213403720081027104147/ [参考] http://hi.baidu.com/wangpai7776/blog/item/179a9d314c28d2af5fdf0e6b.html
VC/MFC/C++ | 标签:
|举报
|字号大中小 订阅
点击打开链接
一、添加WM_ERASEBKGND消息
1、对话框类的OnEraseBkgnd
a、首先,为了下面使用擦除背景的方便,先增加OnEraseBkgnd函数(WM_ERASEBKGND ),但好多新手都不知道对话框在那里找增加这个函数,来跟我来
快捷键Ctrl+W打开ClassWizard对话框(菜单->view->ClassWizard):选择Class Info,找到左下角的Message filter,下拉列表至最底部,选中Window,OK保存
b、我们再Ctrl+W 打开ClassWizard对话框,MessageMaps->Class Name:选择当前工程对话框->Object IDs:选择当前对话框->Messages:下拉找吧,WM_ERASEBKGND有了吧,双击或者Add Function,添加到下面的Member functions后,再双击就可以编辑此函数代码了
2、CMainFrame等非对话框的OnEraseBkgnd直接在Workspace中ClassView页的类名上右键菜单中的"Add Windows Message Hander... ”,在弹出的对话框左边列表中找到WM_ERASEBKGND消息,双击或点Add按钮就自动添加了。
3、当然除了以上的方法之外,如果对代码结构基本了解的话,还可以自己手动增加:
a、工程的头文件中增加擦出背景函数定义
afx_msg BOOL OnEraseBkgnd(CDC *pDC);
b、增加消息响应
BEGIN_MESSAGE_MAP(C******Dlg, CDialog) // C******Dlg是你自己对话框的工程类
……
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
c、工程源文件cpp中增加此函数的操作部分
BOOL
CYourDlg::OnEraseBkgnd(CDC *pDC)
{
//在这里你想增加那些对图片背景处理的东西就随便填吧
return TRUE;
}
二、载入位图背景及控件的透明化
1、使用OnEraseBkgnd函数实现对话框位图背景
BOOL CYourDlg::OnEraseBkgnd(CDC *pDC) //增加擦出背景函数
{
CRect rect;
GetClientRect(&rect);
CBitmap m_pBmp;
BITMAP bm;
CDC dcMem;
m_pBmp.LoadBitmap(IDB_BITMAP1);
m_pBmp.GetBitmap(&bm);//得到位图尺寸
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&m_pBmp);
pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
return TRUE;
}
到这里就可以实现位图了,但STATIC控件背景不透明,显得很难看。
2、来我们让STATIC控件透明吧
HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
}
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
到这里其实就可以了,BMP的图片背景实现了,文本框的透明也实现了。
3、补充说明:如果程序运行过程中,需要设置文本框的字体的话,会出现显示"字体重叠不刷新"的问题
4、这就要对该控件或者对话框处理了,要刷出新字体来。
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
pWnd->SetWindowText("guohaiyang.blog.163.com");//需要修改的控件标题
//这里可以刷整个对话框,但如果较频繁的话,很明显能看出来,就选择刷显示字体的那块区域就可以了
pWnd ->GetParent()->InvalidateRect(CRect(0,0,100,50),TRUE);
好了,没有问题了,剩下随便你玩吧,这个解决方法不像网上说的,非要借用人家的自己写的函数,现在完全用VC提供的就可以了,免得加这个那个的头文件
补充下,自己实验发现
pWnd ->GetParent()->InvalidateRect(CRect(0,0,100,50),TRUE);
并不能完全解决刷新问题
最终使用
this->RedrawWindow();
来实现
虽然会出现控件的明显闪屏现象,但不影响使用
如果有更好的方法请赐教~
[参考] http://guohaiyang.blog.163.com/blog/static/3213403720081027104147/ [参考] http://hi.baidu.com/wangpai7776/blog/item/179a9d314c28d2af5fdf0e6b.html
相关文章推荐
- VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数)及对话框使用位图背景并透明
- VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数)及对话框使用位图背景并透明
- VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数)及对话框使用位图背景并透明
- VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数)及对话框使用位图背景并透明
- 窗体背景的绘制(Windows窗体每次都会重绘其窗体背景,所以我们可以通过拦截窗体重绘背景的消息(WM_ERASEBKGND),并自定义方法来实现重绘窗体背景)
- 对话框找不到WM_ERASEBKGND消息的解决方法与对话框背景图片的载入方法
- 实现对话框在位图作为背景时的控件透明
- 使用BitBlt实现位图背景透明
- 实现对话框在位图作为背景时的控件透明
- VC++实现位图显示透明效果
- Flex2:无边框透明背景MenuBar实现
- PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
- [转帖]在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 半透明及透明位图的实现技术
- VC中实现带有背景位图的树型控件
- vb 6 listview的背景透明的实现
- 怎么样实现透明背景的flash动画?
- PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
- 在dreamweaver里实现PNG背景透明
- 画一个透明背景的位图