VC中GDI+双缓冲实现Picture控件中显示png图片

简介: VC中GDI+双缓冲实现Picture控件中显示png图片

资源下载地址:http://download.csdn.net/detail/zzzili/4177527

#ifndef _CMYSTATIC
#define _CMYSTATIC
#include "StdAfx.h"
#include "gdiplus.h"
#pragma comment(lib,"gdiplus.lib")
using namespace Gdiplus;
/******************************************************************************
 * Class Name : CMyImage
 *
 * Description : 资源图片类,继承自 Image 类
 ******************************************************************************/
class CMyImage:public Image
{
public:
    CMyImage(UINT uID, LPCTSTR pszRsrcType)
 {
  // 初始化 Image 成员变量
  nativeImage = NULL;
  lastResult = InvalidParameter;
  // 查找图片资源
  HINSTANCE hInst =  GetModuleHandle(NULL);
  HRSRC hRsrc = FindResource(hInst, MAKEINTRESOURCE(uID), pszRsrcType);
  if (!hRsrc) {
   return;
  }
  // 加载资源并获取其指针
  HGLOBAL hMemRsrc = LoadResource(hInst, hRsrc);
  BYTE * pMemRsrc = (BYTE *)LockResource(hMemRsrc);
  // 为流分配全局内存空间
  size_t sizeRsrc = SizeofResource(hInst, hRsrc);
  HGLOBAL hMemStrm = GlobalAlloc(GMEM_FIXED, sizeRsrc);
  if (!hMemStrm) {
   return;
  }
  // 拷贝图片资源到全局内存空间中
  BYTE * pMemStrm = (BYTE *)GlobalLock(hMemStrm);
  memcpy(pMemStrm, pMemRsrc, sizeRsrc);
  // 使用图片资源流构造 Image 对象
  IStream * pStrm = NULL;
  CreateStreamOnHGlobal(hMemStrm, TRUE, &pStrm);
  lastResult = DllExports::GdipLoadImageFromStream(pStrm, &nativeImage);
  pStrm->Release();
 }
};
/******************************************************************************
 * Class Name : CMyCStatic
 *
 * Description : Picture Control 类,实现png图片的显示,继承自 CStatic 类
 *
 *使用方法:1.使用前初始化GDI+
            2.在CXXDlg类中关联Pinture控件,用SetPngPicFrom..从文件或资源中获取要
            显示的png图片,然后在CXXDlg中添加消息映射
   BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
   //{{AFX_MSG_MAP(CFlowCtrl)
   ON_WM_PAINT()
   //}}AFX_MSG_MAP
   END_MESSAGE_MAP()
 ******************************************************************************/
class CMyStatic : public CStatic
{
private:
 BOOL m_isSetfile;
 DWORD m_col;
 CDC   *m_pDC;
 RECT m_rect;
 CMyImage *m_image;
public:
 DECLARE_MESSAGE_MAP()
private:
 afx_msg void OnPaint(void)
 {
  if(m_isSetfile)
  {
   m_pDC   =  this->GetDC();
   CDC dcMem;  
   CBitmap   bitmap;  
   bitmap.CreateCompatibleBitmap(m_pDC,m_rect.right-m_rect.left,m_rect.bottom-m_rect.top);  
   dcMem.CreateCompatibleDC(m_pDC);  
   CBitmap   *pOld   =   dcMem.SelectObject(&bitmap);  
   CBrush br;
   br.CreateSolidBrush(m_col);
   Graphics *graphics=NULL;
   graphics=Graphics::FromHDC(dcMem);
   dcMem.FillRect(&m_rect, &br);//纯色覆盖
   graphics->DrawImage(m_image,0,0,m_image->GetWidth(),m_image->GetHeight());
   m_pDC->BitBlt(0,0,300,300,&dcMem,0,0,SRCCOPY);  //双缓冲
   bitmap.DeleteObject();  
   ReleaseDC(&dcMem);
   ReleaseDC(m_pDC);
  }
 };
public:
 void SetPngPicFromFile(CString path)
 {
  m_isSetfile = TRUE;
  m_col = GetSysColor(COLOR_3DFACE);//获取对话框背景颜色
  this->GetClientRect(&m_rect); 
  m_image =(CMyImage*)new Image(path.GetBuffer(0));
  SetWindowPos(&wndTop,0,0, m_image->GetWidth(),m_image->GetHeight(),SWP_SHOWWINDOW);
  OnPaint();
 }
 CMyStatic()
 {
  m_isSetfile = FALSE;
 }
 void SetPngPicFromResource(int id,CString type)
 {
  m_isSetfile = TRUE;
  m_col = GetSysColor(COLOR_3DFACE);
  this->GetClientRect(&m_rect); 
  m_image = new CMyImage(id,type.GetBuffer(0));
  SetWindowPos(&wndTop,0,0, m_image->GetWidth(),m_image->GetHeight(),SWP_SHOWWINDOW);
  OnPaint();
 }
 ~CMyStatic()
 {
 }
};
相关文章
|
1月前
|
C++
SDL基础使用03(渲染显示bmp图片)
如何使用SDL库在C++中创建窗口、加载BMP图片、创建纹理,并通过渲染器进行显示的完整过程。
29 2
|
C++ 计算机视觉 Python
vs qt opencv c++图片相片查看编辑工具Image Viewer Image Editer
vs qt opencv c++图片相片查看编辑工具Image Viewer Image Editer
215 0
SwiftUI—使用Image图像视图显示项目中的图片
SwiftUI—使用Image图像视图显示项目中的图片
642 0
SwiftUI—使用Image图像视图显示项目中的图片
|
网络协议 网络安全 C++
Qt | 显示网络图片 QNetworkAccessManager
有事我们需要加载网络图片而非本地图片,文章介绍了qt控件显示网络图片的方法。
860 0
Winform中Picture控件图片的拖拽显示
原文:Winform中Picture控件图片的拖拽显示 注解:最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture                   //函数从动态链接库中倒入(模拟鼠标事件) [System.
1160 0
VC2005中将Picture控件显示图片保存为BMP,JPG等格式
1.在stdafx.h头文件中加入   #include 2.保存图片   方法一:     HBITMAP hBitmap = NULL; //创建位图段 BITMAPINFO bmi; LPBYTE pBits; ZeroMemory(&bmi,sizeof(bmi)); //m...
997 0
|
缓存 网络协议
Qt之显示网络图片
简述 Qt中包含了网络模块-network,我们可以很容易的进行各种网络编程和数据传输,关于network的类很多,其中包含:支持DNS、HTTP、TCP/UDP等众多高级类,可以参考助手。 下面我们先看一个简单地示例:Qt显示一个网络图片。 简述 效果 源码 处理方式 效果 源码 创建按钮及显示图像的标签,连接信号槽。 m_pB
1296 0