CStatic + CImage 实现简单的图片显示控件



#pragma once

// ImageStatic.h

#include <atlimage.h>
#include <afxglobals.h>

class CImageStatic : public CStatic
{
  DECLARE_DYNAMIC(CImageStatic)

public:
  CImageStatic();
  virtual ~CImageStatic();
  
  BOOL SetImage(LPCTSTR szFileName);

protected:
  CImage m_Image;
  DECLARE_MESSAGE_MAP()
  virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};


// ImageStatic.cpp : 实现文件
//

#include "stdafx.h"

#include "stdafx.h"
#include "ImageStatic.h"

// ImageStatic.cpp
IMPLEMENT_DYNAMIC(CImageStatic, CStatic)
CImageStatic::CImageStatic()
{
}

CImageStatic::~CImageStatic()
{
}


BEGIN_MESSAGE_MAP(CImageStatic, CStatic)
END_MESSAGE_MAP()

// CImageStatic 消息处理程序
BOOL CImageStatic::SetImage(LPCTSTR szFileName)
{
  BOOL bRet = FALSE;
  m_Image.Destroy(); //先释放以前资源
  bRet = (m_Image.Load(szFileName) == S_OK); //加载新资源
  if(m_hWnd)
    Invalidate(FALSE);
  return bRet;
}

LRESULT CImageStatic::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
  // TODO: 在此添加专用代码和/或调用基类
  switch(message)
  {
  case(WM_ERASEBKGND):
    return 1;
  case(WM_PAINT):
    {
      PAINTSTRUCT ps;
      CDC *pDstDC = BeginPaint(&ps);
      
      //客户区位置
      CRect rcClient;
      GetClientRect(&rcClient);

      //双缓冲绘图
      {
        CMemDC memDC(*pDstDC, rcClient);
        CDC *pDC = &memDC.GetDC();

        //填充背景色
        pDC->FillSolidRect(&rcClient, RGB(100, 100, 100));
        pDC->SetStretchBltMode(HALFTONE);

        if(!m_Image.IsNull())
        {
          //原图大小
          CRect rcSrc(0, 0, m_Image.GetWidth(), m_Image.GetHeight());
          //锁定原图比例
          double fZoomRate = min((double)rcClient.Width()/(double)rcSrc.Width(),
            (double)rcClient.Height()/(double)rcSrc.Height());
          int cx = (int)(rcSrc.Width()*fZoomRate), cy = (int)(rcSrc.Height()*fZoomRate);
          CRect rcDst(0, 0, cx, cy); //目标大小
          rcDst.OffsetRect((rcClient.Width()-cx)/2, (rcClient.Height()-cy)/2);//居中

          //绘图
          m_Image.Draw(pDC->m_hDC, rcDst, rcSrc);
        }
      }

      EndPaint(&ps);
      return 0;
    }
  }
  return CStatic::WindowProc(message, wParam, lParam);
}


//测试用例 一个标准对话框应用程序, 上面添加一个Picture控件(), 添加一个按钮(IDC_BUTTON1), 点击按钮选择图片文件, 控件上即有显示

// dlg3Dlg.h : 头文件
//

#pragma once

#include "ImageStatic.h"

// Cdlg3Dlg 对话框
class Cdlg3Dlg : public CDialog
{
  protected:
  CImageStatic m_ImagStatic;
  afx_msg void OnBnClickedButton1();

// 构造
public:
  Cdlg3Dlg(CWnd* pParent = NULL);  // 标准构造函数

// 对话框数据
  enum { IDD = IDD_DLG3_DIALOG };
  
  virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV 支持
  
// 实现
protected:
  HICON m_hIcon;

  // 生成的消息映射函数
  virtual BOOL OnInitDialog();
  afx_msg void OnPaint();
  afx_msg HCURSOR OnQueryDragIcon();
  DECLARE_MESSAGE_MAP()
  
};

// dlg3Dlg.cpp : 实现文件
//仅关键代码

void Cdlg3Dlg::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  DDX_Control(pDX, IDC_BMPSTATIC, m_ImagStatic);
}

void Cdlg3Dlg::OnBnClickedButton1()
{
  // TODO: 在此添加控件通知处理程序代码
  
  CFileDialog dlg(TRUE);
  if(dlg.DoModal() == IDOK)
  {
    m_ImagStatic.SetImage(dlg.GetPathName());
  }

}

结果演示图片




评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值