我在MFC对话框初始化函数中添加了如下代码,但是运行时提示某某内存处不能为“read”
//初始化对话框背景
CPaintDC pClientDC(this);
CDC *MenuDC;
CBitmap myBitmap;
myBitmap.LoadBitmap(IDB_DLGBACKGRND_BITMAP); //加载背景位图
BITMAP bitmap;
myBitmap.GetBitmap(&bitmap); //获取源位图的相关信息 MenuDC->CreateCompatibleDC(&pClientDC); //创建与客户区DC兼容的内存DC,用来准备将要绘制的图片,记住画完图后要记得释放
CBitmap* OldBitmap = MenuDC->SelectObject(&myBitmap); //选入位图到内存DC,返回一个CBitmap类型的指针
CRect rc;
GetClientRect(&rc); //获取目的客户区矩形区域,这里是对话框
MenuDC->StretchBlt(0,0,rc.Width(),rc.Height(),MenuDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); //将内存中的位图会知道客户区内
MenuDC->SelectObject(OldBitmap);
希望各位帮我看看是怎么回事啊,谢谢了!
//初始化对话框背景
CPaintDC pClientDC(this);
CDC *MenuDC;
CBitmap myBitmap;
myBitmap.LoadBitmap(IDB_DLGBACKGRND_BITMAP); //加载背景位图
BITMAP bitmap;
myBitmap.GetBitmap(&bitmap); //获取源位图的相关信息 MenuDC->CreateCompatibleDC(&pClientDC); //创建与客户区DC兼容的内存DC,用来准备将要绘制的图片,记住画完图后要记得释放
CBitmap* OldBitmap = MenuDC->SelectObject(&myBitmap); //选入位图到内存DC,返回一个CBitmap类型的指针
CRect rc;
GetClientRect(&rc); //获取目的客户区矩形区域,这里是对话框
MenuDC->StretchBlt(0,0,rc.Width(),rc.Height(),MenuDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); //将内存中的位图会知道客户区内
MenuDC->SelectObject(OldBitmap);
希望各位帮我看看是怎么回事啊,谢谢了!
解决方案 »
- 将字符串"1"用Xml格式保存//用MFC那个类怎么写?
- CAsyncSocket在不停发送数据的时候,得不到FD_ONCLOSE ?
- 请教:如何使系统自动产生一个按键(比如F1键)事件?
- 哪里有installshield devolop 7.01的注册码?
- 新手关于listctrl控件的问题。
- 谁能帮我实现一个简单的com阻件?实现代码为把一个数加1,100分!!!
- 请问下面的警告是什么意思?
- 在程序中如何格式化软盘?
- 谁能解决我的问题,我拜他为师:用CRecordSet操纵ACCESS数据库,如何只返回其中的一个统计结果,比如sum(),count(*)等,不用存储过程
- DataGrid下标越界why
- vc++2005中怎么使用Picture Control控件或其他代码显示jpg图片?
- VC6 免注册调用进程外COM ??
而且如果是在OnInitDialog,则不应该获取CDC,因为在那个函数里,一些窗口还没有建立起来。
我调到MenuDC->CreateCompatibleDC(&pClientDC); 这个位置出问题了,然后我把这句话CDC *MenuDC;
改成了CDC MenuDC;其它关于MenuDC的操作改成了“.”把CPaintDC pClientDC(this);这句话删了,最后把代码放到了BOOL CLixamPlayerDlg::OnEraseBkgnd(CDC* pDC) 这个背景擦除函数中,最后程序为:
BOOL CLixamPlayerDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
//绘制对话框背景 CRect rc;
GetClientRect(&rc); //获取目的客户区矩形区域,这里是对话框
CDC MemDC;
CBitmap myBitmap;
myBitmap.LoadBitmap(IDB_DLGBACKGRND_BITMAP); //加载背景位图
BITMAP bitmap;
myBitmap.GetBitmap(&bitmap); //获取源位图的相关信息
MemDC.CreateCompatibleDC(pDC); //创建与客户区DC兼容的内存DC,用来准备将要绘制的图片,记住画完图后要记得释放
CBitmap* OldBitmap = MemDC.SelectObject(&myBitmap); //选入位图到内存DC,返回一个CBitmap类型的指针
pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
pDC->StretchBlt(0,0,rc.Width(),rc.Height(),&MemDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); //将内存中的位图会知道客户区内
MemDC.SelectObject(OldBitmap);
retrun TRUE;
}这样改后背景位图被插入了,正常,但是目前我又遇到了一个小问题,就是我将资源里的位图换一幅图后,编译连接没问题,但是执行又出错,请问这是怎么回事啊?
----
你的指针没有分配内存就使用了
CPaintDC pClientDC(this);
CDC MenuDC;
CBitmap myBitmap;
myBitmap.LoadBitmap(IDB_DLGBACKGRND_BITMAP); //加载背景位图
BITMAP bitmap;
myBitmap.GetBitmap(&bitmap); //获取源位图的相关信息 MenuDC.CreateCompatibleDC(&pClientDC); //创建与客户区DC兼容的内存DC,用来准备将要绘制的图片,记住画完图后要记得释放
CBitmap* OldBitmap = MenuDC.SelectObject(&myBitmap); //选入位图到内存DC,返回一个CBitmap类型的指针
CRect rc;
GetClientRect(&rc); //获取目的客户区矩形区域,这里是对话框
pClientDC.StretchBlt(0,0,rc.Width(),rc.Height(),&MenuDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); //将内存中的位图会知道客户区内
MenuDC.SelectObject(OldBitmap);
myBitmap.DeleteObject();
MenuDC.DeleteDC();