我按书的一个打开一个BMP图的例子,出了解决不了的错
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




