OnPaint() 
{
   CPaintDC dc(this); 
   CRect rcClient ;
   GetClientRect(&rcClient);
 
   CDC mdc;
   mdc.CreateCompatibleDC(&dc);
   CBitmap bitmap;
   if (pDicomImg!=NULL) 
  { 
     if(data!=NULL)
    {
     delete data;
     }
    pDicomImg->createWindowsDIB(data, 0, 0, 24, 1, 1);//data是像素数据
    if (dc!= 0) 
    { 
          BITMAPINFO bi; 
          bi.bmiHeader.biSize = sizeof(bi); 
          bi.bmiHeader.biWidth = pDicomImg->getWidth();
          bi.bmiHeader.biHeight = pDicomImg->getHeight(); 
          bi.bmiHeader.biPlanes = 1; 
          bi.bmiHeader.biBitCount = 24; 
          bi.bmiHeader.biCompression = BI_RGB; 
          bi.bmiHeader.biSizeImage = 0; 
          HBITMAP hbmp = CreateDIBitmap(dc.m_hDC, &bi.bmiHeader, CBM_INIT, data, &bi, DIB_RGB_COLORS); 
          bitmap.Attach(hbmp);
 bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());//抛异常
          mdc.SelectObject(bitmap);;   
 dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &mdc, 0, 0,SRCCOPY);
     }
  }
}
给位高手有没有办法,让data通过Cbitmap显示出来?

解决方案 »

  1.   

    HBITMAP hbmp = CreateDIBitmap(dc.m_hDC, &bi.bmiHeader, CBM_INIT, data, &bi, DIB_RGB_COLORS);  
      bitmap.Attach(hbmp);
      mdc.SelectObject(&bitmap);   
    dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &mdc, 0, 0,SRCCOPY);
      

  2.   

    去了抛异常那句,确实可以显示了,但是bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height())这里有我需要的东西啊, 有rcClient我就可以显示图像的大小。要保留rcClient的话,我应该如何?
      

  3.   

    去了抛异常那句,确实可以显示了,但是bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height())这里有我需要的东西啊, 有rcClient我就可以控制图像的大小。要保留rcClient的话,我应该如何?
      

  4.   

    你是需要放缩吧?那就用StretchBlt,不要用BitBlt,这样你就不需要担心你的问题了
      

  5.   

    StretchBlt我试过,反应速度很慢,所以我也必须得用这个,
    快乐鹦鹉,帮我看看这个问题啊。
    CPaintDC dc(this); // device context for painting

    CRect rcClient ;
    GetClientRect(&rcClient);
        
    CDC mdc;
    mdc.CreateCompatibleDC(&dc);
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
    mdc.SelectObject(&bitmap);
       ////内存绘制,这个代码要怎么写?
    {
             内存绘制
    {
     dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &mdc, 0, 0,SRCCOPY);
    }
      

  6.   

    你要放大位图,不用StretchBlt还能怎么办,难道位图还能自动变大不成。
      

  7.   

    您说的对,但是stretchblt速度慢,这个问题应该如何解决呢?
      

  8.   

    你的图很大吗?慢到什么程度?另外慢是因为StretchBlt呢,还是前面的CreateDIBitmap呢?
      

  9.   

    你的图很大吗?慢到什么程度?另外慢是因为StretchBlt呢,还是前面的CreateDIBitmap呢?
      

  10.   

    我的图有18Mb,就是反应慢一点,鼠标移动后,图才发生变化,如果是用bitblt,就不会慢。
      

  11.   

    我的图有18Mb,就是反应慢一点,鼠标移动后,图才发生变化,如果是用bitblt,就不会慢。
      

  12.   

    反应慢与CreateDIBitmap没有关系的,就是stretchblt本身慢
      

  13.   

    你这个图每次都变吗?如果没有变,那么在第一次用stretchblt后,把dc中的位图取出保存,下一次用BitBlt就行了
      

  14.   

        CPaintDC dc(this);
        CDC    m1;
        if ( pDicomImg!=NULL) 

             if(data!=NULL)
       {
         delete data;
       }
      pDicomImg->createWindowsDIB(data, 0, 0, 24, 1, 1);
            
             if (dc!= 0) 

               BITMAPINFO bi; 
               bi.bmiHeader.biSize = sizeof(bi); 
               bi.bmiHeader.biWidth = pDicomImg->getWidth(); 
               bi.bmiHeader.biHeight = pDicomImg->getHeight(); 
               bi.bmiHeader.biPlanes = 1; 
               bi.bmiHeader.biBitCount = 24; 
               bi.bmiHeader.biCompression = BI_RGB; 
               bi.bmiHeader.biSizeImage = 0; 
               HBITMAP hbmp = CreateDIBitmap(dc.m_hDC, &bi.bmiHeader, CBM_INIT, data, &bi, DIB_RGB_COLORS); 
               if (hbmp != NULL) 
              { 
                 HDC memDC = CreateCompatibleDC(dc.m_hDC); 
                 SelectObject(memDC, hbmp); 
         m1.Attach(memDC);
                 dc.SetStretchBltMode(HALFTONE);
        dc.StretchBlt(m_rcImgPaint.left,m_rcImgPaint.top,iPWidth,iPHeight,&m1,0,0,bi.bmiHeader.biWidth,bi.bmiHeader.biHeight,SRCCOPY);
                 
         DeleteDC(memDC);
                 DeleteObject(hbmp); 
      
         } 
     }
    }
    }这个是我用stretchblt显示图像的代码,请问要如何改进,“把dc中的位图取出保存,下一次用BitBlt”要如何操作?
      

  15.   

    dc.StretchBlt(m_rcImgPaint.left,m_rcImgPaint.top,iPWidth,iPHeight,&m1,0,0,bi.bmiHeader.biWidth,bi.bmiHeader.biHeight,SRCCOPY);
    HBITMAP hBkBmp = SelectObject(dc,hBmp);//hBkBmp 进行保留,它应该就是放缩后的图片,假如窗口的宽高不变的话。如果宽高变化,则需要重新StretchBlt来形成新的HBITMAP修改后就是:
    CPaintDC dc(this);
    if(hBkBmp != NULL)
    {
        CDC mDC;
        mDC.CreateCompatibleDC(&dc);
        mDC.SelectObject(m_BkBmp);
        dc.Bitblt(...);
    }
    else
    {
     //你上面的那一堆
    }
      

  16.   

    HBITMAP hBkBmp = SelectObject(dc,hBmp);其中SelectObject为void类型啊,无法复制,怎么办?