1.先说说如何更换SDI打开时的默认背景
因为SDI任何东东都是通过VIEW类来显示的,所以更改背景显然要在view类里做一些改动
在VIEW类中把这个函数重载--OnEraseBkgnd(CDC* pDC)在背景有改动时要执行这个函数,响应WM_ERASEBKGND消息,这个函数默认在cpp中是没有显示出来的,所以你要自己添加。
自己添加重载的代码(各语句含义我不解释了,要那样的话我今晚不用睡觉了)
CBitmap bitmap;
bitmap.LoadBitmap(m_PictureID);//m_pictureid是BMP图像的ID,即你要显示的背景
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
//pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return true;
//return CView::OnEraseBkgnd(pDC);//这个不注释有时候会产生有问题
好了,你现在就可以用你自己的图片替换默认背景了
2.让用户自己随意选择背景(当然是我们事先准备好的),先往工程中添加要用的图片资源,自己定好各图片的ID,后面要用的
我是在主菜单里添加了几个菜单的响应函数以切换背景,当然你自己可以选择其它的方式激发。
a)改app
在APP类的头文件里添加一个你自己的VIEW类指针变量m_pActiveView,因为APP头文件里不包含VIEW类的头文件,所以它是不识别这个变量的,因此还要在APP头文件的开头声明一下class C***View;这个变量是指向当前处于活动状态的视图,在SDI中只一个视图,所以m_pActiveView就指向它。在其它类中如果想使用这个变量,先获取全局APP(afxgetapp()),然后就可以使用了。还有一个注意的地方是m_pActiveView放在APP的构造函数中初始化为空,别放在InitInstance()中。
b)改view
在OnInitialUpdate()中要给m_pActiveView赋值:((C***App*)AfxGetApp())->m_pActiveView = this;
添加一个PUBLIC函数ChangeBk(int pictID),这个在菜单响应函数中要调用到的
void C***View::ChangeBk(int pictID)//pictID就是图像的ID
{
m_PictureID = pictID;
CDC* hdc = GetDC();
OnEraseBkgnd(hdc);
}
最后在菜单的响应函数中调用ChangeBk(int pictID),把你想显示的图片的ID作为参数传进去就可以了。
不会不知道怎么调用吧,先获取全局APP赋给pApp,然后pApp->m_pActiveView->ChangeBk(IDB_BITMAP_BG);
最后改的过程中别忘了在相关类的头文件中添加相应的头文件,否则编译的时候会出一大堆的问题。
SDI程序背景任意更换(转载)
最新推荐文章于 2022-02-23 15:02:25 发布