请问下面的源程序文件为什么会报错?
其实具体的代码也没有什么错误,都是从书上抄下来的。就是不知道为什么会有错?就一个错误:文件意外结束。请各位指点!
//dib.cpp
#include "stdafx.h"
#include "MyCap.h"
#include "Dib.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// CDib
CDib::CDib()
{
}
CDib::~CDib()
{
}
// CDib 成员函数
int CDib::LoadBmp(LPCSTR filename)
{
CFile file(filename,CFile::modeRead|CFile::shareDenyNone);
WORD bfType;
DWORD bfSize;
file.Read(&bfType,sizeof(WORD));
file.Read(&bfSize,sizeof(DWORD));
if(bfSize<=0)
{
file.Close();
return -1;
}
//是否BMP
if(bfType!=((WORD)'M'<<8)+'B'))
{
file.Close();
return -1;
}
DWORD bfOffBits;
//找到位图数据起始偏移并读入
file.Seek(2* sizeof(WORD),CFile::current);
file.Read(&bfOffBits,sizeof(DWORD));
LPVOID DibBuf;
DibBuf=(LPVOID)new char[bfSize];
if(DibBuf==NULL)
{
file.Close();
return -1;
}
//读入位图数据
file.Read(DibBuf,bfSize);
file.Close();
LPBITMAPINFO pBMI;
int size=bfOffBits-14;
pBMI=(LPBITMAPINFO)new char[sizeof(BITMAPINFOHEADER)+256* sizeof(RGBQUAD)];
//生成信息头
memcpy(pBMI,DibBuf,size);
LPVOID lpBits=(LPVOID)((LPSTR)DibBuf+size);
//创建位图
CreateDibIndirect(pBMI,lpBits);
delete pBMI;
delete DibBuf;
return 1;
}
BOOL CDib::CreateDibIndirect(LPBITMAPINFO pBMI,const void* lpBits)
{
if(m_hObject!=NULL)
{
DeleteObject();
}
CDC *pDC=new CDC;
pDC->CreateCompatibleDC(NULL);
LPVOID pBits;
HBITMAP hDIB=::CreateDIBSection(pDC->GetSafeHdc(),pBMI,DIB_RGB_COLORS,&pBits,NULL,0);
delete pDC;
ASSERT(hDIB);
ASSERT(pBits);
Attach(hDIB);
SetDIBBits(GetWidthBytes() * GetHeight(),lpBits);
return TRUE;
}
int CDib::SaveBmp(LPCSTR filename)
{
BITMAPFILEHEADER hdr;
CFile file(filename,CFile::modeWrite|CFile::modeCreate);
//文件头
hdr.bfType=((WORD)'M'<<8)+'B';
LPBITMAPINFO pbi=GetBitmapInfo();
PBITMAPINFOHEADER pbih=(PBITMAPINFOHEADER) pbi;
hdr.bfSize=(DOWRD) (sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed * sizeof(RGBQUAD)+pbih->biSizeImage);
hdr.bfReserved1=0;
hdr.bfReserved2=0;
hdr.bfOffBits=(DWORD) sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed * sizeof(RGBQUAD);
//写入文件头
file.Write((LPVOID) &hdr,sizeof(BITMAPFILEHEADER));
//写入信息头
file.Write((LPVOID) pbih,sizeof(BITMAPINFOHEADER)+pbih->biClrUsed *sizeof(RGBQUAD));
//写入数据
int nTotal=pbih->biSizeImage;
LPVOID lpBits=GetBits();
file.Write(lpBits,nTotal);
//关闭文件
file.Close();
delete pbi;
return 1;
}
void CDib::Show(CWnd *pWnd)
{
HDC hdc=::GetDC(pWnd->m_hWnd);
HBITMAP bmp=HBITMAP(m_hObject);
HDC hdcmem=::CreateCompatibleDC(hdc);
::SelectObject(hdcmem,bmp);
::BitBlt(hdc,0,0,GetWidth(),GetHeight(),hdcmem,0,0,SRCCOPY);
::DeleteObject(bmp);
}
BOOL CDib::CaptureDib(CWnd *pWnd,const CRect& capRect)//捕捉窗口图像
{
BOOL ret=false;
if(pWnd==NULL)
return false;
CDC * pPlayDc=pWnd->GetDC();
if(pPlayDc==NULL)
return false;
CRect Rect;
if(capRect.IsRectEmpty())
pWnd->GetClientRect(Rect);
else
Rect=capRect;
//得到图像颜色数
UINT nBitCount=pPlayDc->GetDeviceCaps(BITSPIXEL);
//创建位图
if(CreateDib(Rect.Width(),Rect.Height(),nBitCount))
{
//得到位图显示设备上下文
CDC * pCopyDc=GetDC();
if(pCopyDc==NULL)
{
pWnd->ReleaseDC(pPlayDc);
return false;
}
pWnd->ShowWindow(SW_SHOW);
if(pCopyDc->BitBlt(0,0,Rect.Width(),Rect.Height(),pPlayDc,0,0,SRCCOPY))
ret=true;
ReleaseDC(pCopyDc);
}
pWnd->ReleaseDC(pPlayDc);
return ret;
}
问题点数:50、回复次数:1Top
1 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-05-05 13:34:14 得分 50
调用的位置是否正确包含头文件Top




