我在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);
希望各位帮我看看是怎么回事啊,谢谢了!
  

解决方案 »

  1.   

    CPaintDC 仅限于OnPain里。至于为什么就不清楚了。
    而且如果是在OnInitDialog,则不应该获取CDC,因为在那个函数里,一些窗口还没有建立起来。
      

  2.   


    我调到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;
    }这样改后背景位图被插入了,正常,但是目前我又遇到了一个小问题,就是我将资源里的位图换一幅图后,编译连接没问题,但是执行又出错,请问这是怎么回事啊?
      

  3.   

    CDC *MenuDC;
    ----
    你的指针没有分配内存就使用了
      

  4.   

    //初始化对话框背景
    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();