CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

我按书的一个打开一个BMP图的例子,出了解决不了的错

楼主lanphaday(恋花蝶)2003-12-02 19:57:00 在 VC/MFC / 图形处理/算法 提问

1,建立一个名为ANMINATE的工程,  
   
  2,在ANMINATEView.h中加入如下全局公共变量:  
  LPBYTE   Fileheader,Bitmapinfoheader,Bitmapinfo,Content;  
  CBitmap*   Showbitmap;  
  int   Width,Height,Bitcount;  
  LPBITMAP   Lbit;  
  int   m_length;  
  HBITMAP   hbitmap;  
  LPBYTE   lpsourcebits;  
  HPALETTE   Hpalette;  
  HANDLE   hlogpal;  
  CPalette*   palette;  
  BOOL   judgepalette;  
   
  3,用CLASSWIZARD加入ONFILEOPEN函数,即[文件/打开]对应的消息函数.  
   
  4,在ANMINATEView.cpp中编写如下函数.  
  void   CANMINATEView::OnFileOpen()    
  {  
  //   TODO:   Add   your   command   handler   code   here  
  palette=new   CPalette;  
  Showbitmap=new   CBitmap;  
  CFileDialog   filedia(true);  
  CFile   file;  
  LPBITMAPINFOHEADER   Lpbh;  
  LPBITMAPINFO   Lpb;  
  DWORD   length;  
  lpsourcebits=NULL;  
  CDC*   cli=GetDC();  
  CDC   MemDC;  
   
  if(filedia.DoModal()==IDOK)  
  {  
  file.Open(filedia.GetPathName(),CFile::modeReadWrite);  
  length=file.GetLength();  
  file.Read(Fileheader,sizeof(BITMAPFILEHEADER));  
  Bitmapinfoheader=(LPBYTE)malloc(sizeof(BITMAPINFOHEADER));  
  file.Read(Bitmapinfoheader,sizeof(BITMAPINFOHEADER));  
  Lpbh=(LPBITMAPINFOHEADER)Bitmapinfoheader;  
  file.SeekToBegin();  
  file.Read(Fileheader,sizeof(BITMAPFILEHEADER));  
  Bitmapinfo=(LPBYTE)malloc(sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD))*Lpbh->biClrUsed);  
  file.Read(Bitmapinfo,sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD))*Lpbh->biClrUsed);  
  m_length=length-sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD))*Lpbh->biClrUsed;  
  Content=(LPBYTE)malloc(m_length);  
  file.Read(Content,m_length);  
  Lpb=(LPBITMAPINFO)Bitmapinfo;  
  Bitcount=Lpbh->biBitCount;  
  switch(Bitcount)  
  {  
  case   1:  
  Hpalette=CreateOwnPalette(2,Lpb);  
  judgepalette=TRUE;  
  break;  
  case   4:  
  Hpalette=CreateOwnPalette(16,Lpb);  
  judgepalette=TRUE;  
  break;  
  case   8:  
  Hpalette=CreateOwnPalette(256,Lpb);  
  judgepalette=TRUE;  
  break;  
  }  
  Width=Lpbh->biWidth;  
  Height=Lpbh->biHeight;  
  file.Close();  
  MemDC.CreateCompatibleDC(cli);  
  hbitmap=CreateDIBSection(MemDC.m_hDC,(BITMAPINFO*)Bitmapinfo,DIB_RGB_COLORS,(void**)&lpsourcebits,NULL,0);  
  memcpy(lpsourcebits,Content,m_length);  
  Showbitmap->Attach(hbitmap);  
  if(judgepalette)  
  {  
  palette->Attach(Hpalette);  
  MemDC.SelectPalette(palette,TRUE);  
  MemDC.RealizePalette();  
  }  
  MemDC.SelectObject(Showbitmap);  
  cli->BitBlt(0,0,Width,Height,&MemDC,0,0,SRCCOPY);  
  }  
  }  
   
  HPALETTE   CANMINATEView::CreateOwnPalette(int   number,LPBITMAPINFO   Bitmap)  
  {  
  LPLOGPALETTE   lppal;  
  int   num;  
  num=number;  
  HPALETTE   hpalette;  
  hlogpal=GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*num);  
  lppal=(LPLOGPALETTE)GlobalLock(hlogpal);  
  lppal->palVersion=0x300;  
  lppal->palNumEntries=num;  
  for(int   i=0;i<num;i++)  
  {  
  lppal->palPalEntry[i].peBlue=Bitmap->bmiColors[i].rgbBlue;  
  lppal->palPalEntry[i].peGreen=Bitmap->bmiColors[i].rgbGreen;  
  lppal->palPalEntry[i].peRed=Bitmap->bmiColors[i].rgbRed;  
  lppal->palPalEntry[i].peFlags=0;  
  }  
  GlobalUnlock(hlogpal);  
  GlobalFree(hlogpal);  
  hpalette=CreatePalette(lppal);  
  return   hpalette;  
  }  
   
  5,编译成功,  
   
  6,链接出错,信息如下:  
  --------------------Configuration:   ANMINATE   -   Win32   Debug--------------------  
  Linking...  
  ANMINATEView.obj   :   error   LNK2005:   "unsigned   char   *   Fileheader"   (?Fileheader@@3PAEA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "unsigned   char   *   Bitmapinfoheader"   (?Bitmapinfoheader@@3PAEA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "unsigned   char   *   Bitmapinfo"   (?Bitmapinfo@@3PAEA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "unsigned   char   *   Content"   (?Content@@3PAEA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "class   CBitmap   *   Showbitmap"   (?Showbitmap@@3PAVCBitmap@@A)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "int   Width"   (?Width@@3HA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "int   Height"   (?Height@@3HA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "int   Bitcount"   (?Bitcount@@3HA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "struct   tagBITMAP   *   Lbit"   (?Lbit@@3PAUtagBITMAP@@A)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "int   m_length"   (?m_length@@3HA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "struct   HBITMAP__   *   hbitmap"   (?hbitmap@@3PAUHBITMAP__@@A)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "unsigned   char   *   lpsourcebits"   (?lpsourcebits@@3PAEA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "struct   HPALETTE__   *   Hpalette"   (?Hpalette@@3PAUHPALETTE__@@A)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "void   *   hlogpal"   (?hlogpal@@3PAXA)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "class   CPalette   *   palette"   (?palette@@3PAVCPalette@@A)   already   defined   in   ANMINATE.obj  
  ANMINATEView.obj   :   error   LNK2005:   "int   judgepalette"   (?judgepalette@@3HA)   already   defined   in   ANMINATE.obj  
  Debug/ANMINATE.exe   :   fatal   error   LNK1169:   one   or   more   multiply   defined   symbols   found  
  Error   executing   link.exe.  
   
  ANMINATE.exe   -   17   error(s),   0   warning(s)  
   
   
  7,请高手解答为什么,谢谢! 问题点数:20、回复次数:6Top

1 楼lanphaday(恋花蝶)回复于 2003-12-02 19:58:23 得分 0

上面的例子是单文档工程.Top

2 楼ydfok(发芽的石头)回复于 2003-12-02 20:52:15 得分 0

这个好象是你的定义重复了呀Top

3 楼videojet(虫虫)回复于 2003-12-02 21:21:29 得分 20

把全局公共变量的定义放在CPP中  
  在头文件中使用extern声明Top

4 楼lanphaday(恋花蝶)回复于 2003-12-03 12:46:20 得分 0

s顶上去,,请高手出手吧。。。。Top

5 楼lanphaday(恋花蝶)回复于 2003-12-03 17:07:03 得分 0

上面的问题videojet(虫虫)   帮我解决了,谢谢.  
   
  但是打开一个BMP图片的时候,出现DEBUG   ASSERTION   FAILED,请问这又如何解决?Top

6 楼lcgame(坂崎良)回复于 2003-12-03 19:07:26 得分 0

生成Release呗,开个玩笑!:)Top

相关问题

  • 买了本vc书。打开里面例子出的问题
  • 在WSAD上建《精通EJB2》书上中的BMP例子有错误 ----2
  • 如何打开*.jar的例子?
  • 帮我看看文件在第二次打开不成功,书上的一个例子
  • 如何打开一个进程的边界呢?书上讲的不是很清楚(看不懂),能给个例子吗(可以加分)????
  • 书本上的例子
  • 我需要JAVA-JDBC打开数据库的例子....................
  • 打开例子程序失败,请教高手
  • 谁有显示bmp文件的例子,帮帮我
  • 怎么打开文本文件?用什么方法?我想看例子~~

关键词

  • 函数
  • objanminateview
  • paea
  • lppal
  • anminateview
  • filedia
  • hlogpal
  • bitmapinfoheader
  • palpalentry
  • hpalette

得分解答快速导航

  • 帖主:lanphaday
  • videojet

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo