一个 MFC 图片控件,用于在对话框中动态显示图片
一个 MFC 图片控件,用于在对话框中动态显示图片。
引言
本文描述了一个 MFC 控件,它可以在标准的对话框中显示任何图片,图片格式包括 BMP、GIF、JPEG 等。
背景
我花了一些时间寻找 MFC 的图片控件,但不幸的是,我没有找到任何对我真正有效的控件。因此,我决定自己创建一个灵活且轻量级的图片控件来显示所有类型的图像。
使用代码
该控件内部使用 GDI+ 库。因此,请确保将 GdiPlus.lib 包含到你的包含库中。
要使用此控件,请使用 Visual C++ 的对话框设计器创建一个静态文本控件。然后,为其分配一个类型为 CPictureCtrl
的控件成员变量。
现在,你可以加载图片到你的控件中。通过调用各种 CPictureCtrl::LoadFrom...
函数之一来完成。使用适合你需求的函数。控件应自动更新为新图像。
要清除图像,请调用 CPictureCtrl::FreeImage
。
你的图像将自动调整为控件的大小,无论宽高比如何。
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; };
关注点
该控件基于子类化 CStatic
控件。因此,你将拥有该控件的所有功能,但它将不会显示任何文本。使用 GDI+ 库可以处理许多现代类型的图像文件。
历史
- 1.0 - 初始版本。
- 1.1 - 修复了一个在没有加载图像的情况下绘制控件时的错误。
- 1.2 - 修复了一个绘制控件时的错误。
由于无法正确识别资源中的图像,因此禁用从资源加载图像的功能。