void printpic::OnPaint() 
{
CClientDC dc(this); // device context for painting BITMAPFILEHEADER bmfHeader;//定义位图文件头结构;
BITMAPINFOHEADER bmhdinfo;//指向位图信息头结构的指针
BITMAPINFO bitmapinfo;
FILE * readstream;
if((readstream=fopen(lpszPathName,"rb"))==NULL){
return;
}
if (fread(&bmfHeader,sizeof(BITMAPFILEHEADER),1,readstream)!=1) {
return;
}
if (fread(&bmhdinfo,sizeof(BITMAPINFOHEADER),1,readstream)!=1) {
return;
}
bitmapinfo.bmiHeader=bmhdinfo;
int ii=StretchDIBits(dc.GetSafeHdc(),0,0,bmhdinfo.biWidth,bmhdinfo.biHeight,0,0,
bmhdinfo.biWidth,bmhdinfo.biHeight,(char *)readstream,&bitmapinfo,DIB_RGB_COLORS,SRCCOPY);搞了很久了,不知道为什么总是零,在对话框上什么也显示不出来?
多谢了!!~

解决方案 »

  1.   

    StretchDIBits的倒数第四个参数是位图的像素存放的起点吧,你确定图片的数据是放在BITMAPINFOHEADER之后吗?我只知道bmfHeader.bfOffBits是位图的像素的偏移量(从文件头开始)
      

  2.   

    可以确定图片的数据是放在BITMAPINFOHEADER之后
      

  3.   

    p = (char *)malloc(bmhdinfo.biSizeImage);
    fread(p,16,1,readstream);
    int ii=StretchDIBits(dc.GetSafeHdc(),0,0,bmhdinfo.biWidth,bmhdinfo.biHeight,0,0,
    bmhdinfo.biWidth,bmhdinfo.biHeight, p,&bitmapinfo,DIB_RGB_COLORS,SRCCOPY);
    free(p);
      

  4.   

    你试一下把(char *)readstream的数据读到一个buffer中,再用StretchDIBits函数行不?
      

  5.   

    StretchDIBits(dc.GetSafeHdc(),0,0,bmhdinfo.biWidth,bmhdinfo.biHeight,0,0,
    bmhdinfo.biWidth,bmhdinfo.biHeight,(char *)readstream,&bitmapinfo,DIB_RGB_COLORS,SRCCOPY);倒数第四个参数是图像的数据,你传过去的是FILE类型的指针!!!FILE是一个struct,不是文件的内容,要用fread才能读到内容!!!!!!
      

  6.   

    这样还是不行: char * p=new char[bmhdinfo.biSizeImage]; if(fread(p,1,bmhdinfo.biSizeImage,readstream)!=bmhdinfo.biSizeImage)
    {
    return;
    }
    //SetStretchBltMode(dc.GetSafeHdc(),COLORONCOLOR);
    int ii=StretchDIBits(dc.GetSafeHdc(),0,0,bmhdinfo.biWidth,bmhdinfo.biHeight,0,0,
    bmhdinfo.biWidth,bmhdinfo.biHeight,p,&bitmapinfo,DIB_RGB_COLORS,SRCCOPY); delete []p;
      

  7.   

    对于高色彩的位图,biClrUsed和biClrImportant这两个成员通常设置为0,所以不用太在意它们。对于BI_RGB这种未压缩格式的位图,成员biSizeImage也将被设置为0。你确定biSizeImage不为0?