#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());
}
}
结果演示图片