www.pudn.com > ElectronicAlbums.rar > MyPicWnd.cpp


// MyWnd.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "MyPicWnd.h" 
#include "Picture.h" 
#include "NumberText.h" 
#include "InfoZip\InfoZip.h" 
 
#define  POTHO_RECT_SIDE        520 
#define  POTHO_RECT_SMALL_LEN   (POTHO_RECT_SIDE*3/4)   
#define  LEFT_DIS               101 
#define  TOP_DIS                21 
 
// CMyPicWnd 
 
IMPLEMENT_DYNAMIC(CMyPicWnd, CStatic) 
CMyPicWnd::CMyPicWnd() 
{ 
	m_bkColor = RGB(150,150,255);//9RGB(0, 255, 128); 
	m_layout = HORIZONTAL; 
	m_HavedNum = 0; 
	m_nCurPage = 1; 
	m_nPageNum = 0; 
} 
 
CMyPicWnd::~CMyPicWnd() 
{ 
	if(m_compDC.GetSafeHdc() != NULL) 
	{ 
		m_compDC.DeleteDC(); 
	} 
 
	if(m_bkDC.GetSafeHdc() != NULL) 
	{ 
		m_bkDC.DeleteDC(); 
	} 
 
	if(m_picDC.GetSafeHdc() != NULL) 
	{ 
		m_picDC.DeleteDC(); 
	} 
} 
 
BOOL CMyPicWnd::Create(DWORD style, const RECT& rect, CWnd* pParentWnd, UINT ID) 
{ 
	BOOL Result; 
	Result =  CStatic::Create(NULL, style, rect, pParentWnd, ID); 
	GetClientRect(m_Rect); 
     
	CPaintDC dc(this); 
	if(m_bkDC.GetSafeHdc() == NULL) 
	{ 
		m_bkDC.CreateCompatibleDC(&dc); 
		m_bkBitmap.CreateCompatibleBitmap(&dc, m_Rect.Width(), m_Rect.Height()); 
		m_bkDC.SelectObject(&m_bkBitmap); 
	} 
	if(m_compDC.GetSafeHdc() == NULL) 
	{ 
		m_compDC.CreateCompatibleDC(&dc); 
		m_compBitmap.CreateCompatibleBitmap(&dc, m_Rect.Width(), m_Rect.Height()); 
		m_compDC.SelectObject(&m_compBitmap); 
	} 
 
	if(m_picDC.GetSafeHdc() == NULL) 
	{ 
		m_picDC.CreateCompatibleDC(&dc); 
		m_picBitmap.CreateCompatibleBitmap(&dc, POTHO_RECT_SIDE, POTHO_RECT_SIDE); 
		m_picDC.SelectObject(&m_picBitmap); 
	} 
	DrawBK(); 
	return Result; 
} 
 
BEGIN_MESSAGE_MAP(CMyPicWnd, CStatic) 
	ON_WM_PAINT() 
END_MESSAGE_MAP() 
 
/* 
void CMyPicWnd::SetBkColor(COLORREF bkColor, COLORREF TextColor) 
{ 
	m_bkColor = bkColor; 
	m_textColor = TextColor; 
 
	DrawBK(); 
	m_compDC.BitBlt(0,0,m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
	Invalidate(); 
} 
*/ 
// CMyPicWnd 消息处理程序 
 
void CMyPicWnd::DrawBK() 
{ 
	m_bkDC.FillSolidRect(&m_Rect, m_bkColor); 
    m_compDC.BitBlt(0,0,m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
} 
 
void CMyPicWnd::DrawNumText(CString& numString) 
{ 
	CFont font; 
	//font.CreateFont(50, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,  DEFAULT_PITCH | FF_SWISS, "Arial"); 
	VERIFY(font.CreateFont( 
		100,                        // nHeight 
		50,                         // nWidth 
		0,                         // nEscapement 
		0,                         // nOrientation 
		FW_BOLD,                 // nWeight 
		FALSE,                     // bItalic 
		FALSE,                     // bUnderline 
		0,                         // cStrikeOut 
		ANSI_CHARSET,              // nCharSet 
		OUT_DEFAULT_PRECIS,        // nOutPrecision 
		CLIP_DEFAULT_PRECIS,       // nClipPrecision 
		DEFAULT_QUALITY,           // nQuality 
		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily 
		"Arial"));                 // lpszFacename 
 
    m_compDC.BitBlt(0,0,m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
	m_compDC.SetBkColor(m_bkColor); 
	m_compDC.SetTextColor(m_textColor); 
	m_compDC.SelectObject(&font); 
	m_compDC.TextOut(45,30, numString); 
	m_compDC.SetTextColor(RGB(255,255,128)); 
	m_compDC.TextOut(45,240, CString("98")); 
	font.DeleteObject(); 
	Invalidate(); 
} 
 
void CMyPicWnd::PlacePhoto() 
{ 
	CRect rect; 
	int aa = (POTHO_RECT_SIDE - POTHO_RECT_SMALL_LEN)/2; 
	switch(m_layout) 
	{ 
	case HORIZONTAL: 
		rect = CRect(CPoint(LEFT_DIS, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2),CSize(POTHO_RECT_SIDE, POTHO_RECT_SMALL_LEN)); 
		DrawPhoto(rect, m_picPath1); 
		break; 
 
	case VIRTICAL: 
		rect = CRect(CPoint(LEFT_DIS + aa, TOP_DIS),CSize(POTHO_RECT_SMALL_LEN, POTHO_RECT_SIDE)); 
		DrawPhoto(rect, m_picPath1); 
		break; 
 
	case LEFTTORIGHT: 
		rect = CRect(CPoint(LEFT_DIS + POTHO_RECT_SIDE/2, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2),CSize(POTHO_RECT_SIDE/2, POTHO_RECT_SMALL_LEN)); 
		DrawPhoto(rect, m_picPath2); 
		rect = CRect(CPoint(LEFT_DIS, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2),CSize(POTHO_RECT_SIDE/2, POTHO_RECT_SMALL_LEN)); 
		DrawPhoto(rect, m_picPath1); 
		break; 
 
	case UPTODOWN: 
		rect = CRect(CPoint(LEFT_DIS + aa, TOP_DIS + POTHO_RECT_SIDE/2),CSize(POTHO_RECT_SMALL_LEN, POTHO_RECT_SIDE/2)); 
		DrawPhoto(rect, m_picPath2); 
		rect = CRect(CPoint(LEFT_DIS +aa , TOP_DIS),CSize(POTHO_RECT_SMALL_LEN, POTHO_RECT_SIDE/2)); 
		DrawPhoto(rect, m_picPath1); 
		break; 
		 
	default: 
		break; 
	} 
} 
 
 
void CMyPicWnd::LoadPothoBook(CNumberText& textWnd) 
{ 
	CString savePath; 
	CFile file; 
    char cFilename[10] = {'\0'}; 
	char szFilter[50] = {'\0'}; 
	strcpy(cFilename , "*.ebk"); 
	strcpy(szFilter,"ebk File (*.ebk)|*.ebk|All Files (*.*)|*.*||"); 
	CFileDialog fileDlg(TRUE,cFilename,cFilename, 
				OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, 
				_T(szFilter)); 
 
	if(fileDlg.DoModal() == IDOK) 
	{ 
		savePath = fileDlg.GetPathName(); 
		if(savePath == m_curFilePath) //已经加载了这个文件 
		{ 
			return; 
		} 
		m_curFilePath = savePath; 
 
        savePath += "pak"; 
		if(!file.Open(savePath, CFile::modeRead)) 
		{ 
			AfxMessageBox("*.ebkpak文件找不到!"); 
			return; 
		} 
		file.Close(); 
 
		char pszArchive[260] = {0}; 
        char pszTarget[260] = {0}; 
        memcpy(pszArchive, savePath.GetBuffer(0), savePath.GetLength()); 
		CString tmpTarget = m_curFilePath; 
		int index = tmpTarget.ReverseFind('\\'); 
		if(index == -1) 
		{ 
			return; 
		} 
        tmpTarget.Delete(index, tmpTarget.GetLength() - index); 
 
        //memcpy(pszTarget, tmpTarget.GetBuffer(0), tmpTarget.GetLength()); 
		BeginWaitCursor(); 
		CInfoZip InfoZip; 
		if (!InfoZip.Initialize()) 
		{ 
			EndWaitCursor(); 
			AfxMessageBox("Must be initialized", MB_OK); 
			return; 
		} 
		if (!InfoZip.InitializeUnzip()) 
		{ 
			EndWaitCursor(); 
			AfxMessageBox("Must be initialized", MB_OK); 
			return; 
		} 
		 
		if (!InfoZip.ExtractFiles(pszArchive, pszTarget)) 
		{ 
		EndWaitCursor(); 
		AfxMessageBox("Files not added", MB_OK); 
		return; 
		} 
		 
		if (!InfoZip.FinalizeUnzip()) 
		{ 
			EndWaitCursor(); 
			AfxMessageBox("Cannot finalize", MB_OK); 
			return; 
		} 
		 
		if (!InfoZip.Finalize()) 
		{ 
			EndWaitCursor(); 
			AfxMessageBox("Cannot finalize", MB_OK); 
			return; 
		} 
		 
		file.Open(m_curFilePath, CFile::modeRead); 
		CArchive ar(&file, CArchive::load); 
		m_picSeri.Serialize(ar); 
		ar.Close(); 
		file.Close(); 
 
		m_picSeri.UpdatePath(tmpTarget); 
		m_nPageNum = m_picSeri.GetPageNum(); 
		m_nCurPage = 1; 
		m_picSeri.GetPageofIndex(m_nCurPage, m_layout, m_picPath1, m_picPath2); 
		DrawFrame(); 
		PlacePhoto(); 
		this->Invalidate(); 
        textWnd.UpdateText(m_nCurPage, m_nPageNum); 
 
		EndWaitCursor(); 
	} 
} 
 
void CMyPicWnd::OnPaint() 
{ 
	CPaintDC dc(this); // device context for painting 
	// TODO: 在此处添加消息处理程序代码 
	// 不为绘图消息调用 CStatic::OnPaint() 
	dc.BitBlt(0, 0, m_Rect.Width(), m_Rect.Height(), &m_compDC, 0, 0, SRCCOPY); 
} 
 
void CMyPicWnd::DrawFrame() 
{ 
	m_bkDC.FillSolidRect(&m_Rect, m_bkColor); 
	CPen pen, *oldPen; 
	pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); 
    oldPen  = m_bkDC.SelectObject(&pen); 
	int aa = (POTHO_RECT_SIDE - POTHO_RECT_SMALL_LEN)/2; 
	switch(m_layout) 
	{ 
	case HORIZONTAL: 
		m_bkDC.MoveTo(LEFT_DIS, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2); 
	    m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2); 
        m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2 + POTHO_RECT_SMALL_LEN); 
	    m_bkDC.LineTo(LEFT_DIS, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2 + POTHO_RECT_SMALL_LEN); 
	    m_bkDC.LineTo(LEFT_DIS, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2); 
		break; 
	case VIRTICAL: 
		m_bkDC.MoveTo(LEFT_DIS + aa, TOP_DIS); 
	    m_bkDC.LineTo(LEFT_DIS + aa + POTHO_RECT_SMALL_LEN, TOP_DIS); 
        m_bkDC.LineTo(LEFT_DIS + aa + POTHO_RECT_SMALL_LEN, TOP_DIS + POTHO_RECT_SIDE); 
	    m_bkDC.LineTo(LEFT_DIS + aa, TOP_DIS + POTHO_RECT_SIDE); 
	    m_bkDC.LineTo(LEFT_DIS + aa, TOP_DIS); 
        break; 
	case LEFTTORIGHT: 
		m_bkDC.MoveTo(LEFT_DIS, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2); 
	    m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2); 
        m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2 + POTHO_RECT_SMALL_LEN); 
	    m_bkDC.LineTo(LEFT_DIS, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2 + POTHO_RECT_SMALL_LEN); 
	    m_bkDC.LineTo(LEFT_DIS, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2); 
 
		m_bkDC.MoveTo(LEFT_DIS + POTHO_RECT_SIDE/2, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2); 
		m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE/2, (m_Rect.Height() - POTHO_RECT_SMALL_LEN)/2 + POTHO_RECT_SMALL_LEN); 
		break; 
	case UPTODOWN: 
		m_bkDC.MoveTo(LEFT_DIS + aa, TOP_DIS); 
	    m_bkDC.LineTo(LEFT_DIS + aa + POTHO_RECT_SMALL_LEN, TOP_DIS); 
        m_bkDC.LineTo(LEFT_DIS + aa + POTHO_RECT_SMALL_LEN, TOP_DIS + POTHO_RECT_SIDE); 
	    m_bkDC.LineTo(LEFT_DIS + aa, TOP_DIS + POTHO_RECT_SIDE); 
	    m_bkDC.LineTo(LEFT_DIS + aa, TOP_DIS); 
 
		m_bkDC.MoveTo(LEFT_DIS + aa, TOP_DIS + POTHO_RECT_SIDE/2); 
	    m_bkDC.LineTo(LEFT_DIS + aa + POTHO_RECT_SMALL_LEN, TOP_DIS + POTHO_RECT_SIDE/2); 
		break; 
	default: 
		break; 
	} 
	m_HavedNum  = 0; 
	m_bkDC.SelectObject(oldPen); 
	pen.DeleteObject(); 
	m_compDC.BitBlt(0,0,m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
} 
 
void CMyPicWnd::ChangeLayout(int nlay) 
{ 
	if(nlay == m_layout) 
	{ 
		return; 
	} 
 
	m_layout = nlay; 
	m_picPath1.Empty(); 
	m_picPath2.Empty(); 
	DrawFrame(); 
} 
 
void CMyPicWnd::DrawPhoto(CRect& rect, CString& picPath) 
{ 
	CPicture pic; 
	int cx,cy; 
	if(!pic.Load(picPath)) 
		return; 
	CSize picSize = pic.GetImageSize(&m_picDC); 
	if(picSize.cx <= rect.Width()&&picSize.cy <= rect.Height()) 
	{ 
		cx = picSize.cx; 
		cy = picSize.cy; 
	} 
	else if(picSize.cx > picSize.cy) 
	{ 
		double wRate = ((double)picSize.cy)/picSize.cx; 
		cx = rect.Width(); 
		cy = (int)(cx * wRate); 
	} 
	else 
	{ 
		double hRate = ((double)picSize.cx)/picSize.cy; 
		cy = rect.Height(); 
		cx = (int)(cy*hRate); 
	} 
	pic.Render(&m_picDC, CRect(0,0, cx, cy)); 
	m_compDC.FillSolidRect(&rect, m_bkColor); 
	m_compDC.BitBlt(rect.left, rect.top, cx, cy, &m_picDC, 0, 0, SRCCOPY); 
} 
 
 
void CMyPicWnd::NextPage(CNumberText& textWnd) 
{ 
	if(m_nPageNum == 0) 
	{ 
		AfxMessageBox("请先载入相册!"); 
		return; 
	} 
 
	if(m_nCurPage >= m_nPageNum) 
	{ 
		AfxMessageBox("最后一页了!"); 
		return; 
	} 
	m_nCurPage ++; 
	m_picSeri.GetPageofIndex(m_nCurPage, m_layout, m_picPath1, m_picPath2); 
	DrawFrame(); 
	PlacePhoto(); 
	this->Invalidate(); 
	textWnd.UpdateText(m_nCurPage, m_nPageNum); 
} 
 
void CMyPicWnd::PrevPage(CNumberText& textWnd) 
{ 
	if(m_nPageNum == 0) 
	{ 
		AfxMessageBox("请先载入相册!"); 
		return; 
	} 
 
	if(m_nCurPage == 1) 
	{ 
		AfxMessageBox("已经是第一页了!"); 
		return; 
	} 
 
	m_nCurPage --; 
	m_picSeri.GetPageofIndex(m_nCurPage, m_layout, m_picPath1, m_picPath2); 
	DrawFrame(); 
	PlacePhoto(); 
	this->Invalidate(); 
	textWnd.UpdateText(m_nCurPage, m_nPageNum); 
}