view.h
   int  m_nflagStop;
   CBitmap m_bmOffScreen;//这两个定义我已经查过了,原程序中的定义是这样的
   LPBYTE m_lpBits;       //这两个定义我已经查过了,原程序中的定义是这样的view.cpp
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldMem = dcMem.SelectObject(&m_bmOffScreen);       
//m_bmOffScreen的数据类型应该怎样定义?
CRect rect(0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN));
dcMem.FillSolidRect(rect, ::GetSysColor(COLOR_WINDOW));
int nCx, nCy;
nCx = dcMem.GetDeviceCaps(HORZRES) / 2;
nCy = dcMem.GetDeviceCaps(VERTRES) / 2;
dcMem.SetViewportOrg(nCx, nCy);
MyDrawFunction(&dcMem);//这是个我自己编写的描画函数 if (1 == m_nflagStop) 
{
KillTimer(1);
}
dcMem.SetMapMode(MM_TEXT);
dcMem.SetViewportOrg(0, 0);
CRect rcClient;
GetClientRect(rcClient);
pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, SRCCOPY);
dcMem.SelectObject(pOldMem);
}
int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = dc.GetDeviceCaps(HORZRES);
bmi.bmiHeader.biHeight = dc.GetDeviceCaps(VERTRES);
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
HBITMAP hOffScreen = ::CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (LPVOID*)m_lpBits, NULL, 0);
m_bmOffScreen.Attach(hOffScreen);
            //  m_lpBits的数据类型应该怎样定义?
return 0;
}
/*我将OnCreate()中的这段码移到OnSize()中后发现即使通过了编译,程序也无法正常运行。*/
void CSMNView::OnSize(UINT nType, int cx, int cy) 
{
   CView::OnSize(nType, cx, cy);
   if (::IsWindow(m_hWnd)){          //即使取消这段码
     m_bmOffScreen.DeleteObject();   // 也还是一样 
     delete m_lpBits;                //
  }        
CClientDC       dc(this);    
BITMAPINFO       bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = cx;
bmi.bmiHeader.biHeight = cy;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
HBITMAP hOffScreen = ::CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (LPVOID*)m_lpBits, NULL, 0);
m_bmOffScreen.Attach(hOffScreen);}

解决方案 »

  1.   

    if (::IsWindow(m_hWnd)){          //即使取消这段码
         m_bmOffScreen.DeleteObject();   // 也还是一样 
         delete m_lpBits;                //
            
    CClientDC       dc(this);    
    BITMAPINFO       bmi;
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = cx;
    bmi.bmiHeader.biHeight = cy;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 24;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biSizeImage = 0;
    bmi.bmiHeader.biXPelsPerMeter = 0;
    bmi.bmiHeader.biYPelsPerMeter = 0;
    bmi.bmiHeader.biClrUsed = 0;
    bmi.bmiHeader.biClrImportant = 0;
    HBITMAP hOffScreen = ::CreateDIBSection(dc, &bmi, DIB_RGB_COLORS,(LPVOID*)m_lpBits, NULL, 0);
    m_bmOffScreen.Attach(hOffScreen);
      }
      

  2.   

    怎么无法运行,什么错误?问题可能出在你的OnDraw()里没有释放GDI资源。
      

  3.   

    LPBYTE m_lpBits;       //这两个定义我已经查过了,原程序中的定义是这样的
    if (::IsWindow(m_hWnd)){          //即使取消这段码
         m_bmOffScreen.DeleteObject();   // 也还是一样 
         delete m_lpBits;                //这样做是否有问题?
      

  4.   

    HBITMAP hOffScreen = ::CreateDIBSection(dc, &bmi, DIB_RGB_COLORS,(LPVOID*)&m_lpBits, NULL, 0);//对了,这里应该传递m_lpBits的地址指针     //delete m_lpBits;                //这样做是否有问题?把这句注释掉试试。
      

  5.   

    这两个版本是指原来的版本:
    OnCreate(){
             CClientDC       dc(this);    
    BITMAPINFO       bmi;
    bmi.bmiHeader.biSize
        ....................
    }
    和现在的版本
    OnSize()
    {
    .............
    }