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


// MyWnd.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "MyPicWnd.h" 
#include "Picture.h" 
#include "EPicBookView.h" 
#include "DirDialog.h" 
 
#define  POTHO_RECT_SIDE        520 
#define  POTHO_RECT_SMALL_LEN   (POTHO_RECT_SIDE*3/4)   
#define  LEFT_DIS               71 
#define  TOP_DIS                30 
 
// CMyPicWnd 
 
IMPLEMENT_DYNAMIC(CMyPicWnd, CStatic) 
CMyPicWnd::CMyPicWnd() 
{ 
	m_bkColor = RGB(255, 255, 255); 
	m_layout = HORIZONTAL; 
	m_HavedNum = 0; 
	m_nCurPage = 1; 
	m_strText = CString(_T("当前第1页")); 
} 
 
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() 
{ 
	DrawFrame(); 
 
	 
DrawNumText(m_strText); 
} 
   void CMyPicWnd::UpdateText(int num) 
{ 
	m_strText.Format(_T("当前第%d页"), num); 
	DrawNumText(m_strText); 
} 
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( 
		20,                        // nHeight 
		8,                         // 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.SetTextColor(RGB(100,100,250)); 
	m_compDC.TextOut(260,0, numString); 
	//m_compDC.TextOut(45,240, CString("98")); 
	//CSize strSize = m_compDC.GetTextExtent(m_strText); 
	//m_compDC.TextOut((m_Rect.Width() - strSize.cx)/2,(m_Rect.Height() - strSize.cy)/2, m_strText); 
	font.DeleteObject(); 
	font.DeleteObject(); 
	Invalidate(); 
} 
 
void CMyPicWnd::PlacePhoto(CString& picPath) 
{ 
	CRect rect; 
	int aa = (POTHO_RECT_SIDE - POTHO_RECT_SMALL_LEN)/2; 
	switch(m_layout) 
	{ 
	case HORIZONTAL: 
		rect = CRect(CPoint(LEFT_DIS, TOP_DIS),CSize(POTHO_RECT_SIDE, POTHO_RECT_SMALL_LEN)); 
		DrawPhoto(rect, picPath); 
		m_picPath1 = picPath; 
		break; 
 
	case VIRTICAL: 
		rect = CRect(CPoint(LEFT_DIS + aa, TOP_DIS),CSize(POTHO_RECT_SMALL_LEN, POTHO_RECT_SIDE)); 
		DrawPhoto(rect, picPath); 
		m_picPath1 = picPath; 
		break; 
 
	case LEFTTORIGHT: 
		if(m_HavedNum == 1) 
		{ 
			rect = CRect(CPoint(LEFT_DIS + POTHO_RECT_SIDE/2, TOP_DIS),CSize(POTHO_RECT_SIDE/2, POTHO_RECT_SMALL_LEN)); 
			m_HavedNum = 0; 
			m_picPath2 = picPath; 
		} 
		else 
		{ 
			rect = CRect(CPoint(LEFT_DIS , TOP_DIS),CSize(POTHO_RECT_SIDE/2, POTHO_RECT_SMALL_LEN)); 
			m_HavedNum = 1; 
			m_picPath1 = picPath; 
		} 
		DrawPhoto(rect, picPath); 
		break; 
 
	case UPTODOWN: 
		if(m_HavedNum == 1) 
		{ 
			m_HavedNum = 0; 
			rect = CRect(CPoint(LEFT_DIS + aa, TOP_DIS + POTHO_RECT_SIDE/2),CSize(POTHO_RECT_SMALL_LEN, POTHO_RECT_SIDE/2)); 
	        m_picPath2 = picPath; 
		} 
		else 
		{ 
			m_HavedNum = 1; 
			rect = CRect(CPoint(LEFT_DIS +aa , TOP_DIS),CSize(POTHO_RECT_SMALL_LEN, POTHO_RECT_SIDE/2)); 
		    m_picPath1 = picPath; 
		} 
		DrawPhoto(rect, picPath); 
		break; 
		 
	default: 
		break; 
	} 
} 
 
 
void CMyPicWnd::DoPothoBook() 
{ 
	if(m_picSeri.GetPageNum() == 0) 
	{ 
		return; 
	} 
	CString savePath; 
	CFile file; 
	if(m_picSeri.IsNewPage(m_nCurPage) && (!m_picPath1.IsEmpty())) //保存现在没有保存的最后一页 
	{ 
		m_picSeri.InsertNewPage(m_nCurPage, m_layout, m_picPath1, m_picPath2); 
	} 
    char cFilename[10] = {'\0'}; 
	char szFilter[50] = {'\0'}; 
	strcpy(cFilename , "*.ebk"); 
	strcpy(szFilter,"ebk File (*.ebk)|*.ebk|All Files (*.*)|*.*||"); 
	CFileDialog fileDlg(FALSE,cFilename,cFilename, 
				OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, 
				_T(szFilter)); 
 
	if(fileDlg.DoModal() == IDOK) 
	{ 
		savePath = fileDlg.GetPathName(); 
		file.Open(savePath, CFile::modeCreate | CFile::modeRead |CFile::modeWrite); 
		CArchive ar(&file, CArchive::store); 
		m_picSeri.Serialize(ar); 
		ar.Close(); 
		file.Close(); 
		BeginWaitCursor(); 
		m_picSeri.ZipFiles(savePath); 
		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, TOP_DIS); 
	    m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE, TOP_DIS); 
        m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE, TOP_DIS + POTHO_RECT_SMALL_LEN); 
	    m_bkDC.LineTo(LEFT_DIS, TOP_DIS + POTHO_RECT_SMALL_LEN); 
	    m_bkDC.LineTo(LEFT_DIS, TOP_DIS); 
		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, TOP_DIS); 
	    m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE, TOP_DIS); 
        m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE, TOP_DIS + POTHO_RECT_SMALL_LEN); 
	    m_bkDC.LineTo(LEFT_DIS, TOP_DIS + POTHO_RECT_SMALL_LEN); 
	    m_bkDC.LineTo(LEFT_DIS, TOP_DIS); 
 
		m_bkDC.MoveTo(LEFT_DIS + POTHO_RECT_SIDE/2, TOP_DIS); 
		m_bkDC.LineTo(LEFT_DIS + POTHO_RECT_SIDE/2, TOP_DIS + 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); 
	Invalidate(); 
} 
 
void CMyPicWnd::ChangeLayout(int nlay) 
{ 
	if(nlay == m_layout) 
	{ 
		return; 
	} 
 
	m_layout = nlay; 
	m_picPath1.Empty(); 
	m_picPath2.Empty(); 
	DrawFrame(); 
	UpdateText(m_nCurPage); 
 
} 
 
void CMyPicWnd::DrawPhoto(CRect m_rect, CString& picPath) 
{ 
	CPicture pic; 
//	int cx,cy; 
	if(!pic.Load(picPath)) 
		return; 
	CSize m_PicSize = pic.GetImageSize(&m_picDC); 
 
	//CPicture pic; 
	CRect DrawRect; 
 
 
	if(m_rect.Width() < m_rect.Height() * m_PicSize.cx / m_PicSize.cy) 
	{ 
		DrawRect.left = 0; 
		DrawRect.right = m_rect.right-m_rect.left; 
		DrawRect.top  = 0 + (m_rect.Height() - m_rect.Width() * m_PicSize.cy / m_PicSize.cx) / 2; 
	    DrawRect.bottom = m_rect.Width() * m_PicSize.cy / m_PicSize.cx + DrawRect.top; 
	   
	} 
    if(m_rect.Width() > m_rect.Height() * m_PicSize.cx / m_PicSize.cy) 
	{ 
		DrawRect.top  = 0; 
        DrawRect.bottom = m_rect.bottom-m_rect.top; 
		 
		DrawRect.left = 0 + (m_rect.Width() - m_rect.Height() * m_PicSize.cx/m_PicSize.cy)/2; 
		DrawRect.right = m_rect.Height() * m_PicSize.cx / m_PicSize.cy + DrawRect.left; 
	} 
	if(m_rect.Width() == m_rect.Height() * m_PicSize.cx / m_PicSize.cy) 
	{ 
		DrawRect.left = 0; 
		DrawRect.top  = 0; 
		DrawRect.right = m_rect.right-m_rect.left; 
       DrawRect.bottom = m_rect.bottom-m_rect.top; 
	} 
	 
	if(m_PicSize.cx <= m_rect.Width()&&m_PicSize.cy <= m_rect.Height()) 
	{ 
		DrawRect.left = 0; 
        DrawRect.top = 0; 
        DrawRect.right = m_PicSize.cx; 
		DrawRect.bottom = m_PicSize.cy; 
	} 
	/*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); 
	}*/ 
	m_picDC.FillSolidRect(CRect(0,0,520,520), RGB(150,150,255)); 
	pic.Render(&m_picDC,DrawRect); 
	//pic.Render(&m_picDC, CRect(0,0, cx, cy)); 
	UpdateText(m_nCurPage); 
 
	m_compDC.FillSolidRect(m_rect, RGB(0,0,0)); 
	 
	m_compDC.BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), &m_picDC, 0, 0, SRCCOPY); 
 
	Invalidate(); 
} 
 
 
void CMyPicWnd::NextPage() 
{ 
	if(m_picPath1.IsEmpty() && m_picPath2.IsEmpty()) 
	{ 
		AfxMessageBox("还没有放置图片呢,不能翻页!"); 
		return; 
	} 
 
	//插入或者修改 
	m_picSeri.InsertNewPage(m_nCurPage, m_layout, m_picPath1, m_picPath2); 
	 
	m_nCurPage ++;    
 
	if(m_picSeri.IsNewPage(m_nCurPage)) 
	{ 
		m_HavedNum = 0 ; 
		m_picPath1.Empty(); 
		m_picPath2.Empty(); 
		 
		m_compDC.BitBlt(0,0,m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
		 
	} 
	else 
	{ 
		m_picSeri.GetPageofIndex(m_nCurPage, m_layout, m_picPath1, m_picPath2); 
		DrawFrame(); 
		m_HavedNum = 0; 
		PlacePhoto(m_picPath1); 
		if(m_layout == UPTODOWN || m_layout == LEFTTORIGHT) 
		{ 
			PlacePhoto(m_picPath2); 
		} 
		((CEPicBookView*)GetParent())->ChangeCheckLayout(m_layout); 
	} 
UpdateText(m_nCurPage); 
 
} 
 
void CMyPicWnd::PrevPage() 
{ 
	if(m_nCurPage == 1) 
		return; 
 
	m_nCurPage --; 
	m_picSeri.GetPageofIndex(m_nCurPage, m_layout, m_picPath1, m_picPath2); 
	DrawFrame(); 
	m_HavedNum = 0; 
	PlacePhoto(m_picPath1); 
 
	if(m_layout == UPTODOWN || m_layout == LEFTTORIGHT) 
	{ 
		PlacePhoto(m_picPath2); 
	} 
	((CEPicBookView*)GetParent())->ChangeCheckLayout(m_layout); 
 
}