Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 243
  • Last Modified:

Display a bitmap in a dialog

Okay, this has to be an easy easy easy problem.  How do I load a bitmap from a file and display it in a dialog based application?  There is no need for scaling, rotating, or any of that.  All I want is to load a bitmap given a filename and display it in a dialog.

Thank you.
0
a121496
Asked:
a121496
  • 4
  • 2
1 Solution
 
Answers2000Commented:
1. On dialog resource create a static control, make sure it has SS_BITMAP style.  Change the resource id from IDC_STATIC to something else,  e.g. IDC_STATIC_PICT

2.Bind a CStatic member variable to the static control (member variables tab in class wiz), say m_staticPict.

3. Use LoadImage API call to load the file, this gives you back a HBITMAP.  As the return type is an HANDLE, you need to cast it

HBITMAP hBitmap = (HBITMAP)::LoadImage( ...etc...)

4. Use SetBitmap member of m_staticPict to set the bitmap

e.g.
m_staticPict.SetBitmap( hBitmap ) ;


That's it.
0
 
a121496Author Commented:
I am going to have to reject your answer since I wanted one that loads a BMP from a FILE not from the resource.  Points are at 50 now.
0
 
Answers2000Commented:
Step 3 in my original answer can load from a FILE or a resource (NT4 or 95 or 98)

To make it load file a file, make the last parameter of LoadImage (fuLoad) include the LR_LOADFROMFILE flag, and lpszName point (LPCSTR) to a NUL terminated containing the file name.
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
martin_yehCommented:
Here is a example for RGB color. If you load indexed color image, the GetPaletteSize will be different. You can compute the size yourself.
first read the bitmap file into a buffer. let's say pBuffer is a pointer pointing to the head of this buffer

void Display(pBuffer)
{
 LPBITMAPINFO  pBitmapInfo = pBuffer + sizeof(BITMAPFILEHEADER);
 LPBITMAPINFOHEADER pBitmapInfoHeader = pBitmapInfo.bmiHeader;
 PCHAR pData = pBitmapInfo + GetPaletteSize(pBitmapInfo);
SetDibitsToDevice(p1,p2,p3,p4,p5,p6,p7,p8,p1,pData,pBitmapInfoHeader,.....);
}

DWORD GetPaletteSize(LPBITMAPINFO)
{
LPBITMAPINFOHEADER pHeader = pBitmapInfo.bmiHeader;
if (pHeader.biClrUsed ==0)
return 256*sizeof(RGBQUAD);
else
return pHeader.biClrUsed*sizeof(RGBQUAD);
}
0
 
a121496Author Commented:
It is clear that Answers knows what he is talking about.  I have this code:

void CTestDlg::OnButtonLoad ()
{ HBITMAP hBitmap = (HBITMAP) ::LoadImage (0, m_Filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  if (hBitmap == NULL)
  { MessageBox ("ERROR!"); }

  m_BMP.SetBitmap (hBitmap);
}

It does not give me an "ERROR!"  But nothing is displayed on the screen at the location of the static resource either.  What am I doing wrong?
0
 
a121496Author Commented:
Perhaps I should replace the first parameter of the LoadImage function with something other than 0?  What though?
0
 
a121496Author Commented:
I was making stupid mistakes (several).  Suffice it to say you answered my question well.  Thanks.
0

Featured Post

How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now