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
}
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
}
处设置了断点,调试发现:看不见位图显示,而且
在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];