–>本文先给出了基于VS2010的MFC对话框编程之图片浏览器所能实现的功能以及采用的技术,然后展示效果图,做出总结,最后附上源代码。
–>效果图 1:在最大化状态下的效果图
–>效果图 2:正常状态下的效果图,这时图片铺满窗口
–>效果图 3:对于长宽比不是4:3的图片,将自适应显示
–>效果图 4:可随意对图片进行拖拽和放缩,且窗口不会产生闪烁
本文源代码下载地址:http://download.csdn.net/detail/destiny0321/9490494
–>所实现的功能:
1.采用双缓冲技术解决屏幕闪烁问题;
2.浏览过程中实现图片的拖拽;
3.浏览过程中实现图片的放缩;
4.对当前文件下所支持图片格式(BMP、JPG、PNG)进行显示;
5.实现“上一张图片”和“下一张图片”功能;
6.随时进行窗口的最小化、正常、最大化显示的切换;
–>所用到的工具:CImage类
–>图片的放缩和拖拽主要用到了投影矩形的技术,即:投影矩形所在位置和大小就是图像在屏幕上位置和大小,随着投影矩形的移动和放缩,图像也在屏幕上移动和放缩,当然这里的屏幕指的是与窗口等尺寸的内存屏幕(解决闪烁问题)。我们只需要对投影矩形操作,就能实现一些列诸如放缩、拖拽等的功能。
–>不足之处:
1.由于能力有限,目前不能实现“双击图像文件,打开该图像”的功能,只好点击鼠标右键打开图像;
2.放缩功能有待改进;
3.更多功能将在今后逐渐添加进来!
–>现附上源代码:
以下是需要改动的地方,其他文件无需改动
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
#pragma once
#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的
// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持
#include <math.h>
#include <afxtempl.h> //对 CStringList 的支持
//窗口状态条尺寸
#define RECT_WINDOWBAR (CRect(0,0,70,16)) //窗口状态条尺寸
#define RECT_MINIMIZE (CRect(0,0,20,16)) //最小化图标尺寸
#define RECT_MAXIMIZE (CRect(20,0,40,16)) //最大化图标尺寸
#define RECT_CLOSE (CRect(40,0,70,16)) //关闭窗口图标尺寸
//左右箭头图标尺寸
#define RECT_ARROW_LEFT (CRect(0,0,47,47)) //左箭头图标尺寸
#define RECT_ARROW_RIGHT (CRect(0,0,47,47)) //右箭头图标尺寸
//客户区背景颜色
#define BKCOLOR (RGB(40,40,40))
//正常窗口的宽和高
#define NORMAL_WINDOW_WIDTH 800
#define NORMAL_WINDOW_HEIGHT 600
//窗口状态
enum{ WINDOW_STATE_MINIMIZED, //最小化
WINDOW_STATE_NORMAL, //正常
WINDOW_STATE_MAXIMIZED //最大化
};
//虚拟按钮类型
enum{ BUTTON_TYPE_WINDOWBAR, //窗口状态条
BUTTON_TYPE_CLOSE, //关闭
BUTTON_TYPE_MAXIMAIZE, //最大化
BUTTON_TYPE_MINIMIZE, //最小化
BUTTON_TYPE_NEXT, //下一张图片
BUTTON_TYPE_PREVIOUS //上一张图片
};
//图像尺寸类型
enum
{
IMG_SIZE_NORMAL, //图像宽高均在绘图范围内
IMG_SIZE_WIDTH_BEYOND, //仅图像宽度超出绘图范围
IMG_SIZE_HEIGHT_BEYOND, //仅图像高度超出绘图范围
IMG_SIZE_BOTH_BEYOND //图像宽高均超出绘图范围
};
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
// PicSeeDlg.h : 头文件
//
#pragma once
// CPicSeeDlg 对话框
class CPicSeeDlg : public CDialogEx
{
// 构造
public:
CPicSeeDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_PICSEE_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnOpen();
DECLARE_MESSAGE_MAP()
private:
CImage m_Image; //当前图像
CImage m_ImgWindowBar; //窗口状态条图像
CImage m_ImgLeftArrow; //左箭头图像
CImage m_ImgRightArrow; //右箭头图像
CRect m_RectMem; //内存绘图区矩形区域
CRect m_RectScn; //屏幕绘图区区域
CRect m_RectImg; //图像矩形区域
CRect m_RectProj; //投影到内存屏幕的矩形区域
CRect m_RectWindowBar; //当前窗口状态条所在矩形区域
CRect m_RectClose; //当前关闭按钮所在矩形区域
CRect m_RectMaximize; //当前最大化按钮所在矩形区域
CRect m_RectMinimize; //当前最小化按钮所在矩形区域
CRect m_RectLeftArrow; //当前左箭头图标所在区域
CRect m_RectRightArrow; //当前右箭头图标所在区域
BOOL m_bLButttonDown; //鼠标左键状态
BOOL m_bPtInLeft; //鼠标指针是否在左侧
BOOL m_bPtInRight; //鼠标指针是否在右侧
int m_WindowState; //窗口状态
int m_ImgPos; //当前图像所在文件夹中的图像中的位置
int m_ImgSizeType; //图像尺寸类型
CStringList m_ImgPathList; //当前目录下的所支持的图像全路径链表