📄 imageviewerdlg.cpp
字号:
// 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 + -