关键代码:
UINT playAllFrame(LPVOID lpParameter){//showOneFrame(0,TRUE);CMFCDialogDlg *mydlg =(CMFCDialogDlg *) lpParameter;//获取原始数据文件 CString selectPath;mydlg->GetDlgItemTextW(IDC_MFCEDITBROWSE,selectPath);string StrSelectPath(CW2A(selectPath.GetString()));const char * fileName = StrSelectPath.data();FILE *fin ; byte *pBmpData = (BYTE*)new char[bitmapWidth*bitmapHeight];//位图数据 BITMAPINFO * pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256];for(int i = 0;i<256;i++){pBmpInfo->bmiColors[i].rgbRed = i;pBmpInfo->bmiColors[i].rgbGreen = i;pBmpInfo->bmiColors[i].rgbBlue = i;pBmpInfo->bmiColors[i].rgbReserved = 0;}//BITMAPINFO * pBmpInfo = new BITMAPINFO; pBmpInfo->bmiHeader.biBitCount = 8;pBmpInfo->bmiHeader.biClrImportant = 0;pBmpInfo->bmiHeader.biClrUsed = 0;pBmpInfo->bmiHeader.biCompression = 0;pBmpInfo->bmiHeader.biHeight = bitmapHeight;//这里是512pBmpInfo->bmiHeader.biPlanes = 0x01;pBmpInfo->bmiHeader.biSize = 40;pBmpInfo->bmiHeader.biSizeImage =262144;pBmpInfo->bmiHeader.biWidth = bitmapWidth;//这里是512pBmpInfo->bmiHeader.biXPelsPerMeter = 3780;pBmpInfo->bmiHeader.biYPelsPerMeter = 3780;errno_t er =fopen_s(&fin,fileName,"rb");if(er!=0){mydlg->MessageBox(L"文件打开失败!");//break; }fseek(fin,0,SEEK_END);LONG fileSize = ftell(fin);fseek(fin,0,0);//计算总帧数int totalFrame = fileSize/(bitmapWidth*bitmapHeight);//设置下拉条范围mydlg->m_slider.SetRange(1,totalFrame);//总帧数mydlg->m_lbl_total=totalFrame;CWnd *pWnd=mydlg->GetDlgItem(IDC_STATIC_PIC_2); //获得pictrue控件窗口的句柄 CRect rect;pWnd->GetClientRect(&rect); //获得pictrue控件所在的矩形区域CDC *pDC=pWnd->GetDC(); //获得pictrue控件的DCpDC->SetStretchBltMode(COLORONCOLOR);while (TRUE){if(flag){long cur = ftell(fin)/(bitmapWidth*bitmapHeight);if(cur!=currentFrame&&(totalFrame>currentFrame||totalFrame>currentFrame)){fseek(fin,currentFrame*bitmapWidth*bitmapHeight,0);}if(!feof(fin)){fread(pBmpData,sizeof(BYTE),bitmapWidth*bitmapHeight,fin);StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,bitmapWidth,bitmapHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);//Sleep(1);//当前帧显示值mydlg->m_lbl = currentFrame;//设置拉条位置mydlg->m_slider.SetPos(currentFrame);currentFrame = currentFrame +1;}else{flag = !flag;fseek(fin,0,0);currentFrame = 0;CButton *pBtn = (CButton *)mydlg->GetDlgItem(IDC_BUTTON2);pBtn->SetWindowTextW(_T("播放"));}}else{Sleep(200);}}fclose(fin);delete pBmpInfo;delete pBmpData;ExitThread(0);return 0; }
运行效果: