our control notification handler code here
unsigned char* ImageBuffer=new unsigned char[ sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256 ];
unsigned char* ImageInfo = NULL;
BITMAPFILEHEADER m_bitmapfileheader;
BITMAPINFOHEADER* infoheader;
RGBQUAD* palette;
BITMAPINFO* bmi;;
FILE* ImageFile;
unsigned int BytesSize=0;
if (NULL==(ImageFile=fopen("D:\\10.bmp","rb")))//从D盘中读取一幅位图
{
printf("can not open the image file!");
return ;
}
else
{
fread(&m_bitmapfileheader,sizeof(BITMAPFILEHEADER),1,ImageFile);//读取文件头
//读取信息头与调色板数据块
fread(ImageBuffer , m_bitmapfileheader.bfOffBits - sizeof(BITMAPFILEHEADER) , 1 , ImageFile);
bmi = (BITMAPINFO*)ImageBuffer;
infoheader = &(bmi->bmiHeader);
palette = bmi->bmiColors;
//位图信息头和实际数据的总字节数
BytesSize = m_bitmapfileheader.bfOffBits - sizeof(BITMAPFILEHEADER) + (infoheader->biWidth * infoheader->biHeight * (infoheader->biBitCount/8)); ImageInfo = new unsigned char[BytesSize];
fseek(ImageFile , sizeof(BITMAPFILEHEADER) , SEEK_SET);//跳过文件头
fread(ImageInfo , BytesSize , 1 , ImageFile);
CWnd* mywnd = GetDlgItem(IDC_BITMAPAREA);
CClientDC dc(mywnd);
RECT rc;
CBrush mybrush;
CBrush* oldbrush;
mywnd->GetClientRect(&rc);
mybrush.CreateDIBPatternBrush(ImageInfo , DIB_RGB_COLORS);
oldbrush = dc.SelectObject(&mybrush);
dc.FillRect(&rc,&mybrush);
dc.SelectObject(oldbrush);
mybrush.DeleteObject();
}
delete[] ImageBuffer;
delete[] ImageInfo;
}
|