1、工程为MFC的基于对话框的工程;基于CObject构造了一个CDib(设备无关位图)类,定义的全局变量有:
   HWND m_hWndCap; //视频显示窗口
   ......
   long frmnum=0; //记录帧数
   int wide=0;
   int height=0;
   CDib bgimg;
2、已在回调函数中FrameCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr)中得到了
位图的数据:bgimg.m_pData;
信息头:bgimg.m_pBitmapInfo;
长:wide=bgimg.m_pBitmapInfo->bmiHeader.biWidth;
高:height=bgimg.m_pBitmapInfo->bmiHeader.biHeight;
3、在void CMotionDlg::OnPaint()中显示位图,但结果位图显示不出来,为什么?是下面代码不应放在OnPaint中么?怎么办?请指点一下,谢谢! void CMotionDlg::OnPaint()
{
if (IsIconic())
{
   CPaintDC dc(this); // device context for painting
   SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
   // Center icon in client rectangle
   int cxIcon = GetSystemMetrics(SM_CXICON);
   int cyIcon = GetSystemMetrics(SM_CYICON);
   CRect rect;
   GetClientRect(&rect);
   int x = (rect.Width() - cxIcon + 1) / 2;
   int y = (rect.Height() - cyIcon + 1) / 2;
   // Draw the icon
   dc.DrawIcon(x, y, m_hIcon);
}
else
{CDialog::OnPaint();
    //显示背景图
    if(frmnum>=1) 
    {
     //AfxMessageBox("右上为背景图!\n");
     //BITMAP bm;
     CBitmap bitmap;
     HBITMAP hbitmap;
    CDC *pDC=GetDC();
     CDC memDC;
     memDC.CreateCompatibleDC(pDC);//得到与对话框设备环境相兼容的内存DC
     //从内存流创建DIB
     hbitmap = CreateDIBitmap(pDC->m_hDC, (BITMAPINFOHEADER *)(&bgimg+sizeof(BITMAPFILEHEADER)),CBM_INIT, &bgimg+bgimg.bitmapFileHeader.bfOffBits,(BITMAPINFO *)bgimg.m_pBitmapInfo, DIB_RGB_COLORS);
    
     if(hbitmap)    //创建成功
     {
      //加载DIB到DDB
      bitmap.Attach(hbitmap);
     }
     else   //创建失败,返回
     {
      MessageBox("创建图像文件失败","提示信息",MB_OK | MB_ICONINFORMATION);
      //释放内存中的设备环境
      ReleaseDC(pDC);
      ReleaseDC(&memDC);
      return;
     }
     //bitmap.GetBitmap(&bm);
     memDC.SelectObject(&bitmap);
     pDC->BitBlt(450,10,wide,height,&memDC,0,0,SRCCOPY); 
     ReleaseDC(pDC);
     ReleaseDC(&memDC);
    }//frmnum>=1   }// else
}

解决方案 »

  1.   

    在OnPaint() 中的bitmap.Attach(hbitmap); 和 pDC->BitBlt(450,10,wide,height,&memDC,0,0,SRCCOPY);  
    处设置了断点,调试发现:看不见位图显示,而且
    在AFXSTATE.CPP的AfxWndProcBase(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
    {
    AFX_MANAGE_STATE(_afxBaseModuleState.GetData());
    return AfxWndProc(hWnd, nMsg, wParam, lParam);
    }的
    return AfxWndProc(hWnd, nMsg, wParam, lParam);中停在77D1B517   call   77D194A4这里不动,
    若切换到运行的主界面对话框,弹出("创建图像文件失败","接着执行一次onpain函数,又停在77D1B517   call   77D194A4
    ,如此循环~
    //77D194A4   mov         eax,dword ptr [esp+4];
      

  2.   

    高手进来帮我看看吧,急啊,是消息循环阻塞了么?把位图正确显示后,打算用定时器强制刷新,每隔0.1秒调用onPaint()函数的else {CDialog::OnPaint(); ......}来解决,所以请高手抽空指点我早日解决位图正确显示问题。
      

  3.   

    从你的代码来看,CDib类仅仅起到了保存数据的作用,而且你取数据的方式基本上是把CDib当作一个数组来用,我不敢肯定你这样取到的数据是否正确。至少应该从CDib类的成员直接取数据而不是通过指针+偏移的方式,当然除非你对这个类的结构非常清楚,但是这样还不如直接用一个指针保存你的位图数据更准确。其实网上有很多CDib类,可以参考一下,作为一个位图类,应该能够在类内部构造好位图,最好还提供绘制到DC的函数,而不是在外部来用类的数据,这样失去了类的优势。
      

  4.   

    不愧是高手!CDib类是起到了保存数据的作用~还用一些成员函数没有贴出来,我试试在类内部构造好位图~
      

  5.   

    改用DrawDibDraw能看到图了,但是出现下图的情况,这是怎么回事?是从回调函数中获得的图像数据不正确么?还是DrawDibDraw的参数没有设对?
      

  6.   

    DrawDibDraw(m_hdd,pDC4->GetSafeHdc(),500,20,-1,-1,&(bgimg.m_pBitmapInfo->bmiHeader),bgimg.m_pData,0,0,wide,height,0);有点怀疑bgimg.m_pData弄错了~