Introduction
This article describes an MFC control that makes it possible to display any picture in a standard image format (like BMP, GIF, JPEG, etc...) on a dialog.
Background
It took me some time to search for a picture control for MFC, but unfortunately, I found none that actually worked for me. So, I decided to make myself a flexible and lightweight picture control to display all types of images.
Using the code
This control internally uses the GDI+ library. So, please make sure to include GdiPlus.lib to your include libraries.
To use this control, create a static text control with the dialog designer of Visual C++. After that, assign a control member variable of type CPictureCtrl
to it.
Now, you can load a picture on your control. Do that by calling one of the various CPictureCtrl::LoadFrom...
functions. Use the one that suits your needs. The control should automatically update to the new image.
To clear the image, call CPictureCtrl::FreeImage
.
Your image will be automatically sized to the size of your control, regardless of the aspect ratio.
class CPictureCtrl :
public CStatic
{
public:
CPictureCtrl(void);
~CPictureCtrl(void);
public:
BOOL LoadFromFile(CString &szFilePath);
BOOL LoadFromStream(IStream* piStream);
BOOL LoadFromStream(BYTE* pData, size_t nSize);
BOOL Load(CString &szFilePath);
BOOL Load(IStream* piStream);
BOOL Load(BYTE* pData, size_t nSize);
void FreeData();
protected:
virtual void PreSubclassWindow();
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual BOOL OnEraseBkgnd(CDC* pDC);
private:
IStream* m_pStream;
BOOL m_bIsPicLoaded;
ULONG_PTR m_gdiplusToken;
};
Points of interest
The control is based on subclassing a CStatic
control. Therefore, you will have all the functionality of this control, but it will not display any text. The usage of the GDI+ library makes it possible to work with many modern types of image files.
History