⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageviewerdlg.cpp

📁 在wince下面开发的一个图片浏览器全部用图形界面编写的,带图片放大缩小,图片拖动,图片自动播放等功能,支持jpg,bmp格式. 图片缩放始终保持原始比例,
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ImageViewerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ImageViewer.h"
#include "ImageViewerDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



/////////////////////////////////////////////////////////////////////////////
// CImageViewerDlg dialog
BYTE* bmpBuffer;
BOOL bmpLoaded;
JSAMPARRAY pBuffer;

CImageViewerDlg::CImageViewerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CImageViewerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CImageViewerDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	WCHAR   strRes[MAX_PATH];
 	CString(LoadString(GetResourceLib(),IDS_PICTURE_TITLE ,strRes,MAX_PATH));
	m_TitleText = strRes;
	m_hBitmap=NULL;
 
	m_InitDC = FALSE;
	m_bAutoPlay = false;
	m_bFullScreen = false;
	m_bReDraw = TRUE;
	
	m_DefaultRect = CRect(59,37,262,209);     //203*172
	m_DelayTime = 1000 * 3;

}


CImageViewerDlg::~CImageViewerDlg()
{
	if (!m_SourceFile.IsEmpty())   //防止无效路径覆盖以前
   {
	m_InitInf.FileListSize=g_Playlist.m_FileList.GetSize();
	m_InitInf.CurrentFileNO=g_Playlist.m_CurrentFile;
	CFile myFile(L"\\residentflash\\ImageViewer.ini", CFile::modeCreate | CFile::modeReadWrite);
	CArchive arStore(&myFile, CArchive::store);
	arStore.Write(&m_InitInf,sizeof(int)*3);
	
	arStore.WriteString( m_SourceFile );
	arStore.WriteString( L"\n" );

	for (int i=0;i<m_InitInf.FileListSize;i++)
	{
		arStore.WriteString( g_Playlist.m_FileList.GetAt(i) );
		arStore.WriteString( L"\n" );
	}
	arStore.Close();
	myFile.Close();
  }

	m_BgDC.DeleteDC();
	DeleteObject(m_hBitmap);
	m_DIBSection.DeleteObject();
}

void CImageViewerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CImageViewerDlg)
	DDX_Control(pDX, IDC_BUTTON_ZOOMOUT, m_butZoomOut);
	DDX_Control(pDX, IDC_BUTTON_OPEN, m_butOpen);
	DDX_Control(pDX, IDC_BUTTON_ZOOMIN, m_butZoomIn);
	DDX_Control(pDX, IDC_BUTTON_NEXT, m_butNext);
	DDX_Control(pDX, IDC_BUTTON_FULLSCREEN, m_butFullScreen);
	DDX_Control(pDX, IDC_BUTTON_CLOSE, m_butClose);
	DDX_Control(pDX, IDC_BUTTON_BACK, m_butBack);
	DDX_Control(pDX, IDC_BUTTON_AUTOPLAY, m_butAutoPlay);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CImageViewerDlg, CDialog)
	//{{AFX_MSG_MAP(CImageViewerDlg)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_BN_CLICKED(IDC_BUTTON_AUTOPLAY, OnButtonAutoplay)
	ON_BN_CLICKED(IDC_BUTTON_BACK, OnButtonBack)
	ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose)
	ON_BN_CLICKED(IDC_BUTTON_FULLSCREEN, OnButtonFullscreen)
	ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext)
	ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonOpen)
	ON_BN_CLICKED(IDC_BUTTON_ZOOMIN, OnButtonZoomin)
	ON_BN_CLICKED(IDC_BUTTON_ZOOMOUT, OnButtonZoomout)
	ON_WM_TIMER()
	ON_WM_LBUTTONUP()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONDBLCLK()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageViewerDlg message handlers

BOOL CImageViewerDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here
	MoveWindow(0,0,320,240);
	//
	m_butZoomOut.MoveWindow(272,37,46,46);
	m_butZoomOut.LoadBitmaps(IDB_IMAGE_ZOOMOUT,IDB_IMAGE_ZOOMOUTD,NULL,IDB_IMAGE_ZOOMOUTDIS);

	m_butZoomIn.MoveWindow(272,87,46,46);
	m_butZoomIn.LoadBitmaps(IDB_IMAGE_ZOOMIN,IDB_IMAGE_ZOOMIND,NULL,IDB_IMAGE_ZOOMINDIS);

	m_butFullScreen.MoveWindow(272,137,46,46);
	m_butFullScreen.LoadBitmaps(IDB_IMAGE_FULLSCREEN,IDB_IMAGE_FULLSCREEND,NULL,IDB_IMAGE_FULLSCREENDIS);

	m_butAutoPlay.MoveWindow(272,187,46,46);
	m_butAutoPlay.LoadBitmaps(IDB_IMAGE_PLAY,IDB_IMAGE_PLAY,NULL,IDB_IMAGE_PLAYDIS);

	m_butBack.MoveWindow(1,56,46,46);
	m_butBack.LoadBitmaps(IDB_IMAGE_BACK,IDB_IMAGE_BACKD,NULL,IDB_IMAGE_BACKDIS);

	m_butNext.MoveWindow(1,113,46,46);
	m_butNext.LoadBitmaps(IDB_IMAGE_NEXT,IDB_IMAGE_NEXTD,NULL,IDB_IMAGE_NEXTDIS);

	m_butOpen.MoveWindow(1,170,46,46);
	m_butOpen.LoadBitmaps(IDB_IMAGE_OPEN,IDB_IMAGE_OPEND);

	m_butClose.MoveWindow(283,7,25,25);
	m_butClose.LoadBitmaps(IDB_IMAGE_CLOSE,IDB_IMAGE_CLOSED);

//m_picImage.MoveWindow(59,37,203,172);
	// 合成背景画刷
	CBitmap tmpBmp;
	CDC  tmpDC;
	tmpBmp.LoadBitmap(IDB_IMAGE_WND);
	
	tmpDC.CreateCompatibleDC(NULL);
	tmpDC.SelectObject(&tmpBmp);	
	tmpBmp.DeleteObject();

	tmpBmp.CreateCompatibleBitmap(GetDC(),320,240);
	m_BgDC.CreateCompatibleDC(NULL);
	m_BgDC.SelectObject(&tmpBmp);	
	m_BgDC.BitBlt(0,0,320,240,&tmpDC,0,0,SRCCOPY);
	
	m_BgDC.SelectObject(m_titleFont);
	m_BgDC.SetTextColor(RGB(255,255,255));
	m_BgDC.SetBkMode(TRANSPARENT);
	m_BgDC.DrawText(m_TitleText,CRect(57,6,263,31),DT_CENTER|DT_VCENTER);

	tmpDC.DeleteDC();
	tmpBmp.DeleteObject();
	
	m_butZoomIn.EnableWindow(FALSE);
	m_butZoomOut.EnableWindow(FALSE);
	//读初始化文件
	CFile     myFile;
	if ( myFile.Open(L"\\residentflash\\ImageViewer.ini",CFile::modeRead,NULL) ) //打开成功;	
	{	 
		myFile.SeekToBegin();
		CArchive arStore(&myFile, CArchive::load);
		arStore.Read(&m_InitInf.FileviewPosition,sizeof(int));
		arStore.Read(&m_InitInf.FileListSize,sizeof(int));
		arStore.Read(&m_InitInf.CurrentFileNO,sizeof(int));
	
		arStore.ReadString( m_InitInf.SourceFile);
		m_SourceFile=m_InitInf.SourceFile;
		 CString	str;
		 g_Playlist.m_FileList.RemoveAll();
		for (int i=0;i<m_InitInf.FileListSize;i++)
		{
			arStore.ReadString( str);
			g_Playlist.m_FileList.Add(str) ;
		}
		arStore.Close();
		myFile.Close();

		g_Playlist.m_TotalFiles = m_InitInf.FileListSize;
		g_Playlist.m_CurrentFile = m_InitInf.CurrentFileNO;
		g_Playlist.m_FilePath = m_SourceFile.Left(m_SourceFile.ReverseFind(L'\\')+1);
		g_Playlist.InitSeed(g_Playlist.m_TotalFiles);
		
		if (g_Playlist.m_TotalFiles > 1)
		{
			m_butNext.EnableWindow(TRUE);
			m_butBack.EnableWindow(TRUE);
			m_butAutoPlay.EnableWindow(TRUE);
			m_FileNumber = g_Playlist.m_TotalFiles;
		} 
		else
		{
			m_butNext.EnableWindow(FALSE);
			m_butBack.EnableWindow(FALSE);
			m_butAutoPlay.EnableWindow(FALSE);
			m_FileNumber = 1;
		}
//
		if (!m_SourceFile.IsEmpty())
		{
			m_butFullScreen.EnableWindow(TRUE);			

			if (m_FileNumber > 1)
			{
				m_butBack.EnableWindow(TRUE);
				m_butNext.EnableWindow(TRUE);
			}
			else
			{
				m_butBack.EnableWindow(FALSE);
				m_butNext.EnableWindow(FALSE);
			}
		}
		else
		{
			m_butAutoPlay.EnableWindow(FALSE);
			m_butFullScreen.EnableWindow(FALSE);
			m_butBack.EnableWindow(FALSE);
			m_butNext.EnableWindow(FALSE);
		}
		
		//LoadImage(m_SourceFile);
		return TRUE;
	}

	m_hBitmap = 0;
	m_FileNumber = 0;
	m_Zoom = 0;
	m_SourceFile = L"";//L"\\SDMEM\\Picturs\\jpg2.jpg";
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

HBITMAP CImageViewerDlg::LoadImageJPG(const CString &strFileName)
{
	FILE *pFile;
	JSAMPARRAY pBuffer;
	int nRowSize;
	ByteArray imageData(320 * 240 * 3);

	struct jpeg_error_mgr jerr;
	struct jpeg_decompress_struct cinfo;

	if((pFile = _tfopen(strFileName,_T("rb"))) == NULL)
	{
		CString strError;

		strError.Format(_T("Can't Open File '%s'"),strFileName);
		MessageBox(strError);
		return 0;
	}

	cinfo.err = jpeg_std_error(&jerr);
	jpeg_create_decompress(&cinfo);
	jpeg_stdio_src(&cinfo,pFile);
	jpeg_read_header(&cinfo,TRUE);
	jpeg_start_decompress(&cinfo);

	nRowSize = cinfo.output_width * cinfo.output_components;

	pBuffer = (*cinfo.mem->alloc_sarray)
		((j_common_ptr) &cinfo, JPOOL_IMAGE, nRowSize, 1);

	while(cinfo.output_scanline < cinfo.output_height)
	{
		jpeg_read_scanlines(&cinfo,pBuffer,TRUE);
		imageData.Append(pBuffer[0],nRowSize);
	}
	
	m_ImageSize = CSize(cinfo.output_width,cinfo.output_height);
	
	if (m_hBitmap)
	{
		DeleteObject(m_hBitmap);
	}

	m_hBitmap = CSTScreenBuffer::CreateBitmapByRGBArray
		(imageData.GetData(),cinfo.output_width,cinfo.output_height);

	jpeg_finish_decompress(&cinfo);
	jpeg_destroy_decompress(&cinfo);
	
	fclose(pFile);

	return m_hBitmap;
}


void CImageViewerDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	//return;
	
	// TODO: Add your message handler code here	

	if (!m_SourceFile.IsEmpty())
	{	
		CDC buffDC;
		CBitmap bgBmp;
		bgBmp.CreateCompatibleBitmap(&dc,320,240);
		buffDC.CreateCompatibleDC(&dc);
		buffDC.SelectObject(&bgBmp);
			
		if (m_bFullScreen)  //全屏 显示全图,没有放大缩小功能
		{
			Zoom2FullScreen();
		}
		else    //窗口
		{		
			ZoomImage(m_Zoom);
			buffDC.BitBlt(0,0,320,240,&m_BgDC,0,0,SRCCOPY);
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -