Click here to Skip to main content
15,662,426 members
Articles / Desktop Programming / MFC
Article
Posted 5 Apr 2008

Stats

313.7K views
30.9K downloads
86 bookmarked

An MFC picture control to dynamically show pictures in a dialog

Rate me:
Please Sign up or sign in to vote.
4.67/5 (44 votes)
24 Apr 2008CPOL1 min read
An MFC picture control to dynamically show pictures in a dialog.

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:

    //Constructor
    CPictureCtrl(void);

    //Destructor
    ~CPictureCtrl(void);

public:

    //Loads an image from a file
    BOOL LoadFromFile(CString &szFilePath);

    //Loads an image from an IStream interface
    BOOL LoadFromStream(IStream* piStream);

    //Loads an image from a byte stream;
    BOOL LoadFromStream(BYTE* pData, size_t nSize);

    //Loads an image from a Resource
//     BOOL LoadFromResource(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType);

    //Overload - Single load function
    BOOL Load(CString &szFilePath);
    BOOL Load(IStream* piStream);
    BOOL Load(BYTE* pData, size_t nSize);
//     BOOL Load(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType);

    //Frees the image data
    void FreeData();

protected:
    virtual void PreSubclassWindow();

    //Draws the Control
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    virtual BOOL OnEraseBkgnd(CDC* pDC);

private:

    //Internal image stream buffer
    IStream* m_pStream;

    //Control flag if a pic is loaded
    BOOL m_bIsPicLoaded;

    //GDI Plus Token
    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

  • 1.0 - Initial release.
  • 1.1 - A bug when drawing the control without a loaded image was corrected.
  • 1.2 - A bug when drawing the control was corrected.
  • Loading an image from a resource is disabled due to problems recognizing it correctly as an image.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Tester / Quality Assurance
Germany Germany
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
AnswerRe: Can we load images from server Pin
TEiseler5-Jun-08 8:58
TEiseler5-Jun-08 8:58 
GeneralRe: Can we load images from server Pin
Wotnix7-Jun-19 12:22
Wotnix7-Jun-19 12:22 
QuestionLoading picture in ActiveX using static control Pin
jagannathan thiruvengadathan26-May-08 23:25
jagannathan thiruvengadathan26-May-08 23:25 
Generalusing picture control in MFC activeX Pin
jagannathan thiruvengadathan26-May-08 23:23
jagannathan thiruvengadathan26-May-08 23:23 
GeneralRe: using picture control in MFC activeX Pin
TEiseler27-May-08 9:35
TEiseler27-May-08 9:35 
GeneralNever Call DrawItem Pin
canabal2-May-08 11:41
canabal2-May-08 11:41 
GeneralRe: Never Call DrawItem Pin
TEiseler27-May-08 9:33
TEiseler27-May-08 9:33 
GeneralAspect ratio Pin
Davide Zaccanti25-Apr-08 20:33
Davide Zaccanti25-Apr-08 20:33 
If you want to craete a reusable control you have (at least) to support automatic redim based on aspect ratio of loaded image...

Davide
GeneralRe: Aspect ratio Pin
TEiseler27-May-08 9:38
TEiseler27-May-08 9:38 
GeneralAnother comment Pin
NGS 54967225-Apr-08 4:44
NGS 54967225-Apr-08 4:44 
GeneralRe: Another comment Pin
TEiseler25-Apr-08 7:25
TEiseler25-Apr-08 7:25 
GeneralSome comments Pin
Sam Levy6-Apr-08 14:34
Sam Levy6-Apr-08 14:34 
GeneralRe: Some comments Pin
TEiseler9-Apr-08 9:32
TEiseler9-Apr-08 9:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.