指导我一下,谢谢,十分谢谢

whxlove110 2008-03-27 02:10:53
这是在文档doc下对文件-》打开的消息响应
void CBmpviewDoc::OnFileOpen()
{
// TODO: Add your command handler code here

{
// TODO: Add your command handler code here
LPCTSTR lpszFilter="BMP Files(*.bmp) ¦*.bmp ¦任何文件 ¦*.* ¦ ¦";
CFileDialog dlg1(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,lpszFilter,NULL);
CString filename;
CFile file;
BITMAPFILEHEADER bf;

//打开文件对话框
if(dlg1.DoModal()==IDOK)
{
filename=dlg1.GetPathName();
if(file.Open(filename,CFile::modeRead ¦CFile::shareDenyNone,NULL)==0)
{
//读取文件失败
AfxMessageBox("无法打开文件!",MB_OK,0);
return;
}
//读取文件头
file.Read(&bf,sizeof(bf));
//判断是否是BMP文件
if(bf.bfType!=0x4d42)//'BM'
{
AfxMessageBox("非BMP文件!",MB_OK,0);
return;
}
//判断文件是否损坏
if(file.GetLength()!=bf.bfSize)
{
AfxMessageBox("文件已损坏,请检查!",MB_OK,0);
return;
}

//读文件信息头
file.Read(&bi,sizeof(bi));

//计算调色板数目
numQuad=0;
if(bi.biBitCount <24)
{
numQuad=1 < <bi.biBitCount;
}

//为图像信息pbi申请空间
pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
memcpy(pbi,&bi,sizeof(bi));
quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));

//读取调色板
if(numQuad!=0)
{
file.Read(quad,sizeof(RGBQUAD)*numQuad);
}

//为图像数据申请空间
bi.biSizeImage=bf.bfSize-bf.bfOffBits;
lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
//读取图像数据
file.Read(lpBuf,bi.biSizeImage);

//图像读取完毕,关闭文件,设置标志
file.Close();
flag=1;
zoomfactor=1;
lpshowbuf=NULL;

UpdateAllViews(NULL,0,NULL);
}
}
}
之后我想在view视图中想显示出来,添加了一个wm-paint的消息响应函数;void CBMPViewerView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
//得到文档指针
CBMPViewerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

//是否已打开某个BMP文件
if(pDoc->flag==1)
{
//指定是显示的颜色
SetDIBitsToDevice(dc.m_hDC,0,0,pDoc->pbi->bmiHeader.biWidth,
pDoc->pbi->bmiHeader.biHeight,0,0,0,
pDoc->pbi->bmiHeader.biHeight,pDoc->lpshowbuf,
pDoc->pbi,DIB_RGB_COLORS);
}
但是最后图形没有显示出来,~不知道为什么,请教一下。
这是在文档doc定义用来存储数据的变量public:
BITMAPINFOHEADER bi; //信息头
RGBQUAD* quad; //调色板
BYTE* lpBuf; //图像数据
BITMAPINFO* pbi;
int flag; //标志表示是否打开了bmp文件
int numQuad; //调色板数目
BYTE* lpshowbuf; //用于显示的图像数据
int zoomfactor; //缩放比率
...全文
108 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
babyvox1999 2008-03-27
  • 打赏
  • 举报
回复
问啥?
吴丁 2008-03-27
  • 打赏
  • 举报
回复
太长,太乱,估计没有人看得完吧。眼花,眼累,到此为止。
whxlove110 2008-03-27
  • 打赏
  • 举报
回复
tell me why
whxlove110 2008-03-27
  • 打赏
  • 举报
回复
发重复了!!!
whxlove110 2008-03-27
  • 打赏
  • 举报
回复
这是在文档doc下对文件-》打开的消息响应
void CBmpviewDoc::OnFileOpen()
{
// TODO: Add your command handler code here

{
// TODO: Add your command handler code here
LPCTSTR lpszFilter="BMP Files(*.bmp) ¦*.bmp ¦任何文件 ¦*.* ¦ ¦";
CFileDialog dlg1(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,lpszFilter,NULL);
CString filename;
CFile file;
BITMAPFILEHEADER bf;

//打开文件对话框
if(dlg1.DoModal()==IDOK)
{
filename=dlg1.GetPathName();
if(file.Open(filename,CFile::modeRead ¦CFile::shareDenyNone,NULL)==0)
{
//读取文件失败
AfxMessageBox("无法打开文件!",MB_OK,0);
return;
}
//读取文件头
file.Read(&bf,sizeof(bf));
//判断是否是BMP文件
if(bf.bfType!=0x4d42)//'BM'
{
AfxMessageBox("非BMP文件!",MB_OK,0);
return;
}
//判断文件是否损坏
if(file.GetLength()!=bf.bfSize)
{
AfxMessageBox("文件已损坏,请检查!",MB_OK,0);
return;
}

//读文件信息头
file.Read(&bi,sizeof(bi));

//计算调色板数目
numQuad=0;
if(bi.biBitCount <24)
{
numQuad=1 < <bi.biBitCount;
}

//为图像信息pbi申请空间
pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
memcpy(pbi,&bi,sizeof(bi));
quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));

//读取调色板
if(numQuad!=0)
{
file.Read(quad,sizeof(RGBQUAD)*numQuad);
}

//为图像数据申请空间
bi.biSizeImage=bf.bfSize-bf.bfOffBits;
lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
//读取图像数据
file.Read(lpBuf,bi.biSizeImage);

//图像读取完毕,关闭文件,设置标志
file.Close();
flag=1;
zoomfactor=1;
lpshowbuf=NULL;

UpdateAllViews(NULL,0,NULL);
}
}
}
之后我想在view视图中想显示出来,添加了一个wm-paint的消息响应函数;void CBMPViewerView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
//得到文档指针
CBMPViewerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

//是否已打开某个BMP文件
if(pDoc->flag==1)
{
//指定是显示的颜色
SetDIBitsToDevice(dc.m_hDC,0,0,pDoc->pbi->bmiHeader.biWidth,
pDoc->pbi->bmiHeader.biHeight,0,0,0,
pDoc->pbi->bmiHeader.biHeight,pDoc->lpshowbuf,
pDoc->pbi,DIB_RGB_COLORS);
}
但是最后图形没有显示出来,~不知道为什么,请教一下。
这是在文档doc定义用来存储数据的变量public:
BITMAPINFOHEADER bi; //信息头
RGBQUAD* quad; //调色板
BYTE* lpBuf; //图像数据
BITMAPINFO* pbi;
int flag; //标志表示是否打开了bmp文件
int numQuad; //调色板数目
BYTE* lpshowbuf; //用于显示的图像数据
int zoomfactor; //缩放比率

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧