SDI程序背景任意更换(转载)

     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);

最后改的过程中别忘了在相关类的头文件中添加相应的头文件,否则编译的时候会出一大堆的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值