LPBYTE Fileheader;
LPBYTE Bitmapinfoheader;
LPBYTE Bitmapinfo;
LPBYTE Content;
CBitmap* Showbitmap;
int Width;
int Height;
int Bitcount;
LPBITMAP Lbit;
int m_length;
LPBYTE lpsourcebit;
HBITMAP hbitmap;
HPALETTE Hpalette;
HANDLE hlogpal;
CPalette* palette;
BOOL judgepalette;
HPALETTE CMy666View::CreateOwnPalette(int ,LPBITMAPINFO );
void CMy666View::OnFileOpen()
{
palette=new CPalette;
Showbitmap=new CBitmap;
CFileDialog filedia(true);
CFile file;
LPBITMAPINFOHEADER Lpbh;
LPBITMAPINFO Lpb;
DWORD length;
lpsourcebit=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**)&lpsourcebit,NULL,0);
memcpy(lpsourcebit,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 CMy666View::CreateOwnPalette(int number,LPBITMAPINFO Bitmap)
{
LPLOGPALETTE lppal;
int num;
num=number;
HPALETTE hpalette;
hlogpal=GlobalAlloc(GHND,sizeof(LPLOGPALETTE)+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;
}
LPBYTE Bitmapinfoheader;
LPBYTE Bitmapinfo;
LPBYTE Content;
CBitmap* Showbitmap;
int Width;
int Height;
int Bitcount;
LPBITMAP Lbit;
int m_length;
LPBYTE lpsourcebit;
HBITMAP hbitmap;
HPALETTE Hpalette;
HANDLE hlogpal;
CPalette* palette;
BOOL judgepalette;
HPALETTE CMy666View::CreateOwnPalette(int ,LPBITMAPINFO );
void CMy666View::OnFileOpen()
{
palette=new CPalette;
Showbitmap=new CBitmap;
CFileDialog filedia(true);
CFile file;
LPBITMAPINFOHEADER Lpbh;
LPBITMAPINFO Lpb;
DWORD length;
lpsourcebit=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**)&lpsourcebit,NULL,0);
memcpy(lpsourcebit,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 CMy666View::CreateOwnPalette(int number,LPBITMAPINFO Bitmap)
{
LPLOGPALETTE lppal;
int num;
num=number;
HPALETTE hpalette;
hlogpal=GlobalAlloc(GHND,sizeof(LPLOGPALETTE)+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;
}
解决方案 »
- 请教关于GDI+背景图片覆盖按钮和窗口抖动的问题
- directshow摄像头捕捉静态图RenderStream(&PIN_CATEGORY_STILL缓慢
- 求 仿3DMAX界面 的思路 , 讲的细的另开贴送分,谢谢
- 为什么继承自定义类:class CXX:CX一定要在.h文件中加#include "X.h",可以不加吗?
- 小问题!!!在线等答 !!!!
- 超级问题!!
- 用什么工具可以查看DLL的导出的函数名?
- 复制文件的简单问题,轻松可得50分:
- 你看该怎么办?
- 严重内存分配问题,各位请帮帮忙
- VC.NET 2002/2003的工程如何转化为VC6的工程呢?
- 求教使用ATL编写组件时的编译错误!
if (filedia.DoModal()==IDOK)
{
file.Open(filedia.GetPathName(),CFile::modeReadWrite);
length=file.GetLength();
file.Read(Fileheader,sizeof(BITMAPFILEHEADER));
Bitmapinfoheader=(LPBYTE)malloc(sizeof(BITMAPINFOHEADER));
......
}
的:
length=file.GetLength();
和:
file.Read(Fileheader,sizeof(BITMAPFILEHEADER));
之间加上一个:
Fileheader=new unsigned char[sizeof(BITMAPFILEHEADER)];
就可以了 ,即:
if (filedia.DoModal()==IDOK)
{
file.Open(filedia.GetPathName(),CFile::modeReadWrite);
length=file.GetLength();
Fileheader=new unsigned char[sizeof(BITMAPFILEHEADER)];
file.Read(Fileheader,sizeof(BITMAPFILEHEADER));
Bitmapinfoheader=(LPBYTE)malloc(sizeof(BITMAPINFOHEADER));
......
}一定通过。