Hi all,
Presently i am creating a doc/view application in which i read a bmp file's structures like BITMAPFILEHEADER , BITMAPINFOHEADER , COLOR PALETTE and bmBits after that in the view with the help of 'StretchDIBits' i am displaying the bits of the bitmap image . My problem is that only half of the image is displayed can any one help me to solve this problem. Below is the given code.
OnOpenDocument
Code:
BOOL CBmpInfoDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
FILE *fp;
fp = _wfopen(lpszPathName , (const wchar_t*) "r");
if(fp == NULL)
{
return FALSE;
}
m_pbmiColors = new RGBQUAD[256];
ZeroMemory(&m_bmfhFileHeader, sizeof(m_bmfhFileHeader));
/*fread(&m_bmfhFileHeader , sizeof(BITMAPFILEHEADER) , 1 ,fp);
fread(&m_bmiInfoHead , sizeof(BITMAPINFOHEADER) , 1 , fp);*/
fread(&m_bmfhFileHeader.bfType , sizeof(m_bmfhFileHeader.bfType) ,
1 ,fp);
fread(&m_bmfhFileHeader.bfSize , sizeof(m_bmfhFileHeader.bfSize) ,
1 , fp);
fread(&m_bmfhFileHeader.bfReserved1 , sizeof(m_bmfhFileHeader.bfReserved1) ,
1 , fp);
fread(&m_bmfhFileHeader.bfReserved2 , sizeof(m_bmfhFileHeader.bfReserved2) ,
1 , fp);
fread(&m_bmfhFileHeader.bfOffBits , sizeof(m_bmfhFileHeader.bfOffBits) ,
1 , fp);
fread(&m_bmiInfoHead.bmiHeader.biSize , sizeof(m_bmiInfoHead.bmiHeader.biSize) , 1 , fp);
m_dwSize = m_bmiInfoHead.bmiHeader.biSize;
fread(&m_bmiInfoHead.bmiHeader.biWidth , sizeof(m_bmiInfoHead.bmiHeader.biWidth) , 1 , fp);
m_nWidth = m_bmiInfoHead.bmiHeader.biWidth;
fread(&m_bmiInfoHead.bmiHeader.biHeight , sizeof(m_bmiInfoHead.bmiHeader.biHeight) , 1 , fp);
m_nHeight = m_bmiInfoHead.bmiHeader.biHeight;
fread(&m_bmiInfoHead.bmiHeader.biPlanes , sizeof(m_bmiInfoHead.bmiHeader.biPlanes) , 1 , fp);
m_wPlanes = m_bmiInfoHead.bmiHeader.biPlanes;
fread(&m_bmiInfoHead.bmiHeader.biBitCount , sizeof(m_bmiInfoHead.bmiHeader.biBitCount) , 1 , fp);
m_nBpp = m_bmiInfoHead.bmiHeader.biBitCount;
fread(&m_bmiInfoHead.bmiHeader.biCompression , sizeof(m_bmiInfoHead.bmiHeader.biCompression) , 1 , fp);
m_dwCompression = m_bmiInfoHead.bmiHeader.biCompression;
fread(&m_bmiInfoHead.bmiHeader.biSizeImage , sizeof(m_bmiInfoHead.bmiHeader.biSizeImage) , 1 , fp);
fread(&m_bmiInfoHead.bmiHeader.biXPelsPerMeter , sizeof(m_bmiInfoHead.bmiHeader.biXPelsPerMeter) , 1 , fp);
m_lHorzResolution = m_bmiInfoHead.bmiHeader.biXPelsPerMeter;
fread(&m_bmiInfoHead.bmiHeader.biYPelsPerMeter , sizeof(m_bmiInfoHead.bmiHeader.biYPelsPerMeter) , 1 , fp);
m_lVertResolution = m_bmiInfoHead.bmiHeader.biYPelsPerMeter;
fread(&m_bmiInfoHead.bmiHeader.biYPelsPerMeter , sizeof(m_bmiInfoHead.bmiHeader.biYPelsPerMeter) , 1 , fp);
fread(&m_bmiInfoHead.bmiHeader.biClrUsed , sizeof(m_bmiInfoHead.bmiHeader.biClrUsed) , 1 , fp);
fread(&m_bmiInfoHead.bmiHeader.biClrImportant , sizeof(m_bmiInfoHead.bmiHeader.biClrImportant) , 1 , fp);
int nNoOfPalette = pow(double(2) , double(m_bmiInfoHead.bmiHeader.biBitCount));
if(m_bmiInfoHead.bmiHeader.biBitCount <= 8)
{
for(int nId = 0 ; nId < nNoOfPalette ; nId++)
{
fread(&m_pbmiColors[nId].rgbBlue , sizeof(m_pbmiColors) , 1 , fp);
fread(&m_pbmiColors[nId].rgbGreen , sizeof(m_pbmiColors) , 1 , fp);
fread(&m_pbmiColors[nId].rgbRed , sizeof(m_pbmiColors) , 1 , fp);
fread(&m_pbmiColors[nId].rgbReserved , sizeof(m_pbmiColors) , 1 , fp);
}
}
int nSize = WIDTHBYTES((m_bmiInfoHead.bmiHeader.biWidth)* ((DWORD)m_bmiInfoHead.bmiHeader.biBitCount)) *
m_bmiInfoHead.bmiHeader.biHeight;
m_bmBits = new BYTE[nSize];
fread(m_bmBits , sizeof(m_bmBits) , nSize , fp);
m_bFlag = TRUE;
return TRUE;
}
Draw Method
Code:
void CBmpInfoView::OnDraw(CDC* pDC)
{
CDC* memDC;
BITMAPINFO m_bmiInfoHead;
BITMAPINFO *m_pbmiInfo;
BITMAPFILEHEADER* m_BitmapFileHeader;
pDoc = GetDocument();
if(pDoc->GetFlagState() == FALSE)
{
return;
}
SelectClipRgn(pDC->GetSafeHdc(), NULL);
m_bmiInfoHead = pDoc->GetBitInfoHead();
m_BitmapFileHeader = &pDoc->GetBitMapFileHeader();
m_pbmiInfo = (BITMAPINFO*)(m_BitmapFileHeader + 1);
BYTE *bits = (BYTE*)m_BitmapFileHeader + m_BitmapFileHeader->bfOffBits;
bits = (BYTE*)pDoc->GetbmBits();
m_pbmiInfo = &m_bmiInfoHead;
StretchDIBits(pDC->GetSafeHdc() , 0 , 0 , m_bmiInfoHead.bmiHeader.biWidth , m_bmiInfoHead.bmiHeader.biHeight ,
0 , 0 , m_bmiInfoHead.bmiHeader.biWidth , m_bmiInfoHead.bmiHeader.biHeight , bits ,
m_pbmiInfo , DIB_PAL_COLORS, SRCCOPY);
}