位图 问题
主要代码如下 :
第一步 循环从avi文件截取位图 并把位图信息都把放到一个list容器中
while (1)
{
//读取第i帧 并保存到pDate中
hr = AVIStreamRead(pavi, i, 1, pData, cX * cy * 3, &i, NULL);
if (hr == 0)
{
CBitmap *bitTemp = new CBitmap;
bitTemp->CreateCompatibleBitmap(pDC, cX, cy);
bitTemp->SetBitmapBits(cX * cy * 3, pData);
listhbitmap.push_back((HBITMAP)bitTemp->GetSafeHandle());
}
else//读取到最后一帧或出错就退出
{
return ;
}
}
第二步:主要是把得到的avi位图选到一个内存设备
CDC *pdc = GetDC();
//创建一个和屏幕兼容的内存dc
CDC dcMem;
dcMem.CreateCompatibleDC(pdc);
/..................../
可是执行下面的代码却得到的位图信息显示的都是乱乱的, 有什么办法解决吗 难道真的要转成32位位图才可以选到内存设备环境吗? 求高人解答。。。。
::SelectObject(dcMem.GetSafeHdc(), (HBITMAP)*it);
pdc->StretchBlt(0,0,1024,1024, &dcMem,0,0,1024, 1024, SRCCOPY);
[解决办法]
不是啊
- C/C++ code
BOOL CMyView::ShowBitmap(CString str){ CBitmap *bitmap; BITMAP pBmpInfo; HBITMAP bmp =(HBITMAP)::LoadImage(AfxGetInstanceHandle(),str,IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); if(bmp==NULL) { MessageBox("LoadImage Error !"); return FALSE; } bitmap=CBitmap::FromHandle(bmp); bitmap->GetBitmap(&pBmpInfo); CDC mem; CDC *pDC=GetDC(); if(!mem.CreateCompatibleDC(pDC)) { MessageBox("CreateCompatibleDC Error !"); return FALSE; } if(! mem.SelectObject(bitmap)) { MessageBox("SelectObject Error !"); return FALSE; } CRect rect; GetClientRect(&rect);// int err = pDC->BitBlt(0,0,pBmpInfo.bmWidth,pBmpInfo.bmHeight,&mem,0,0,SRCCOPY);// int err = pDC->StretchBlt(0,0,pBmpInfo.bmWidth,pBmpInfo.bmHeight,&mem,0,0,rect.Width(),rect.Height(),SRCCOPY); int err = pDC->StretchBlt(0,0,pBmpInfo.bmWidth,pBmpInfo.bmHeight,&mem,0,0,pBmpInfo.bmWidth,pBmpInfo.bmHeight,SRCCOPY); if(err==0) { MessageBox("BitBlt Error !"); return FALSE; } pDC->DeleteDC(); mem.DeleteDC(); return TRUE;}