在对话框里面,我希望点击按钮显示图片,结果让我很失望。
BOOL CPictestDlg::openBitmap(LPCTSTR pszPathName)
{
hFile = CreateFile(pszPathName,GENERIC_WRITE|GENERIC_READ,0,NULL
,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox("图像文件打不开!");
return FALSE;
}

DWORD dwBitsSize=GetFileSize(hFile,NULL); hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);

if(hFileMap == NULL)
{
CloseHandle(hFile);
return FALSE;
}

bitmapptr =(unsigned char*)MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);

if(bitmapptr == NULL)
{
CloseHandle(hFileMap);
CloseHandle(hFile);
return FALSE;
} //在析构函数里释放指针
return TRUE;
}
void CPictestDlg::OnOK() 
{
if (openBitmap("e:\\test.bmp"))
{
CClientDC dc(this);
CRect clientdc;
GetClientRect(&clientdc);

int m_filelen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

BITMAPFILEHEADER *bmfHeader;//定义位图文件头结构;
BITMAPINFOHEADER *bmhdr;//指向位图信息头结构的指针
bmfHeader=(BITMAPFILEHEADER*)bitmapptr;
bmhdr=(BITMAPINFOHEADER*)bitmapptr[sizeof(BITMAPFILEHEADER)];
int s=int(bmhdr->biSizeImage-m_filelen);
BYTE *b;
b = (BYTE*)malloc(s);

memcpy(b,&bitmapptr[m_filelen],s);
BITMAPINFO b_map;
b_map.bmiHeader = *bmhdr;

StretchDIBits(dc.m_hDC,0,0,bmhdr->biWidth,bmhdr->biHeight,0,0,bmhdr->biWidth,
bmhdr->biHeight,b,&b_map,DIB_RGB_COLORS,SRCCOPY); //释放指针空间
free(b);

}
}

解决方案 »

  1.   

    void CPictestDlg::OnOK() 
    {
    if (openBitmap("e:\\test.bmp"))
    {
    CClientDC dc(this);
    CRect clientdc;
    GetClientRect(&clientdc);

    BITMAPFILEHEADER *bmfHeader;
    BITMAPINFOHEADER *bmhdr;
    bmfHeader = (BITMAPFILEHEADER*) bitmapptr;
    bmhdr = (BITMAPINFOHEADER*) (bitmapptr + sizeof(BITMAPFILEHEADER));
    int m_filelen = bmfHeader.bfOffBits;
    int s = (int) (bmhdr->biSizeImage - m_filelen);
    BYTE *b;
    b = (BYTE*) malloc(s);

    memcpy(b, (void *)(bitmapptr + m_filelen), s);

    StretchDIBits( dc.m_hDC, 0, 0, bmhdr->biWidth, bmhdr->biHeight, 
       0, 0, bmhdr->biWidth, bmhdr->biHeight, 
       b, 
       (BITMAPINFO*) bmhdr,
       DIB_RGB_COLORS,
       SRCCOPY
       );

    free(b);
    }
    }=============================================================
    char a[5] = {0,1,2,3,4};
    char n = a[1]; // n=1, []是取值,不是指针移位。
    char *p = (char *) a[0]; // char *p = (char *) 0; 空指针