背景颜色渐变(每天坚持一下)

只是实现水平或垂直方向的背景色渐变,只需重载OnEraseBkgnd函数

在有视图的时候很好找 但是对话框时候就不好找了

 

可以按照如下步骤:

1.快捷键Ctrl+W打开ClassWizard对话框(菜单->view->ClassWizard):选择Class Info,找到左下角的Message filter,下拉列表至最底部,选中Window,OK保存

 

2.(菜单->view->ClassWizard):MessageMaps->Class Name:选择当前工程对话框->Object IDs:选择当前对话框->Messages:下拉找吧,WM_ERASEBKGND有了吧,双击或者Add Function,添加到下面的Member functions后,再双击就可以编辑此函数代码了

 

其实习惯手动添加也挺好的

afx_msg BOOL OnEraseBkgnd(CDC* pDC); //添加在.h中 ON_WM_ERASEBKGND() //添加消息 //响应消息 BOOL CShadeBkDlg::OnEraseBkgnd(CDC* pDC) { return CDialog::OnEraseBkgnd(pDC);//本例子 此处我们要注释掉添加我们自己的响应 }

 

下面我们就是处理渐变了

 

CRect rect; GetClientRect(&rect); int r1=127,g1=127,b1=56; //Any start color int r2=5,g2=55,b2=165; //Any stop color for(int i=0;i<rect.Width();i++) //如果是垂直方向则rect.Height(),下同 { int r,g,b; r = r1 + (i * (r2-r1) / rect.Width()); g = g1 + (i * (g2-g1) / rect.Width()); b = b1 + (i * (b2-b1) / rect.Width()); pDC->FillSolidRect(i,0,1,rect.Height(),RGB(r,g,b)); } return true; }

 

 

如果要实现倾斜的渐变

添加一个函数void MakeBitmap();

定义如下

//在OnInitDialog中调用 void CShadeBkDlg::MakeBitmap() { CPaintDC dc(this); CRect rect; GetClientRect(&rect); int r1=245,g1=190,b1=240; int r2=130,g2=0,b2=0; int x1=0,y1=0; int x2=0,y2=0; CDC dc2; dc2.CreateCompatibleDC(&dc); if(m_bitmap.m_hObject) m_bitmap.DeleteObject(); m_bitmap.CreateCompatibleBitmap(&dc,rect.Width(), rect.Height()); CBitmap *oldbmap=dc2.SelectObject(&m_bitmap); while(x1 < rect.Width() && y1 < rect.Height()) { if(y1 < rect.Height()-1) y1++; else x1++; if(x2 < rect.Width()-1) x2++; else y2++; int r,g,b; int i = x1+y1; r = r1 + (i * (r2-r1) / (rect.Width()+rect.Height())); g = g1 + (i * (g2-g1) / (rect.Width()+rect.Height())); b = b1 + (i * (b2-b1) / (rect.Width()+rect.Height())); CPen p(PS_SOLID,1,RGB(r,g,b)); CPen *oldpen = dc2.SelectObject(&p); dc2.MoveTo(x1,y1); dc2.LineTo(x2,y2); dc2.SelectObject(oldpen); } dc2.SelectObject(oldbmap); }

修改前面的重载函数OnEraseBkgnd()

CRect rect; GetClientRect(&rect); CDC dc2; dc2.CreateCompatibleDC(pDC); CBitmap *oldbmap=dc2.SelectObject(&m_bitmap); /*We copy the bitmap into the DC*/ pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc2,0,0,SRCCOPY); dc2.SelectObject(oldbmap); return true;

 

本文借鉴 code project 至此完成

 

你可能感兴趣的:(function,filter,Class)