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


// MyWnd.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "MyWnd.h" 
 
#include "picture.h" 
 
#define  POTHO_VIEW_RECT    126 
#define  INVA_DIS           10 
#define  LEFT_DIS           20 
#define  TOP_DOS            20 
 
// CMyWnd 
 
IMPLEMENT_DYNAMIC(CMyWnd, CStatic) 
CMyWnd::CMyWnd() 
{ 
	m_bkColor = RGB(255, 255, 255); 
	m_textColor = RGB(100,100,255); 
	m_selIndex = -1; 
	m_nextLoad = 0; 
	InitpicInfo(); 
	 
} 
 
CMyWnd::~CMyWnd() 
{ 
	if(m_compDC.GetSafeHdc() != NULL) 
	{ 
		m_compDC.DeleteDC(); 
	} 
 
	if(m_bkDC.GetSafeHdc() != NULL) 
	{ 
		m_bkDC.DeleteDC(); 
	} 
 
	if(m_selPicDC.GetSafeHdc() != NULL) 
	{ 
		m_selPicDC.DeleteDC(); 
	} 
	 
	pic.Free(); 
} 
 
 
void CMyWnd ::InitpicInfo() 
{ 
	for(int i = 0; i< MAX_RECT; ++i) 
	{ 
		m_picInfos[i].filePath.Empty(); 
		m_picInfos[i].IsLoaded = FALSE; 
	} 
} 
 
BOOL CMyWnd::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_selPicDC.GetSafeHdc() == NULL) 
	{ 
		m_selPicDC.CreateCompatibleDC(&dc); 
		m_selpicBitmap.CreateCompatibleBitmap(&dc, POTHO_VIEW_RECT, POTHO_VIEW_RECT); 
		m_selPicDC.SelectObject(&m_selpicBitmap); 
	} 
	DrawBK(); 
	m_compDC.BitBlt(0,0,m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
	Invalidate(); 
	return Result; 
} 
 
BEGIN_MESSAGE_MAP(CMyWnd, CStatic) 
	ON_WM_PAINT() 
END_MESSAGE_MAP() 
 
/* 
void CMyWnd::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(); 
} 
*/ 
// CMyWnd 消息处理程序 
 
void CMyWnd::DrawBK() 
{ 
	m_bkDC.FillSolidRect(&m_Rect, m_bkColor); 
	CPen pen, *oldPen; 
	pen.CreateStockObject(BLACK_PEN); 
    oldPen  = m_bkDC.SelectObject(&pen); 
 
	for(int i = 0; i < 4 ; ++i) 
	{ 
		for(int j = 0; j < 2; ++j) 
		{ 
			int x = LEFT_DIS + j*(POTHO_VIEW_RECT + 40); 
			int y = TOP_DOS + i*(POTHO_VIEW_RECT + INVA_DIS); 
			m_bkDC.MoveTo(x, y); 
			m_bkDC.LineTo(x + POTHO_VIEW_RECT, y); 
			m_bkDC.LineTo(x + POTHO_VIEW_RECT, y + POTHO_VIEW_RECT); 
			m_bkDC.LineTo(x, y + POTHO_VIEW_RECT); 
			m_bkDC.LineTo(x, y); 
 
			m_picRects[j + i*2] = CRect(CPoint(x, y), CSize(POTHO_VIEW_RECT, POTHO_VIEW_RECT)); 
		} 
	} 
	m_bkDC.SelectObject(oldPen); 
	pen.DeleteObject(); 
} 
 void CMyWnd::UpdateText(int num,int maxnum) 
{ 
	m_strText.Format(_T("第%d页/共%d页"), num,maxnum); 
	DrawNumText(m_strText); 
} 
 
void CMyWnd::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); 
	CSize strSize = m_compDC.GetTextExtent(numString); 
	m_compDC.TextOut((m_Rect.Width() - strSize.cx)/2,0, numString); 
	//m_compDC.TextOut(45,240, CString("98")); 
	font.DeleteObject(); 
	Invalidate(); 
} 
 
void CMyWnd::LButtonUp(CPoint& point) 
{ 
	TRACE("single!\n"); 
	for(int i = 0; i < MAX_RECT; ++i) 
	{ 
		if((m_picRects[i].PtInRect(point)) && (m_picInfos[i].IsLoaded)&&(m_selIndex != i)) 
		{ 
			m_selIndex = i; 
			Invalidate(); 
			break; 
		} 
	} 
} 
 
CString CMyWnd::LButtonDblClk(CPoint& point) 
{ 
	TRACE("double!\n"); 
	CString picPath; 
	for(int i = 0; i < MAX_RECT; ++i) 
	{ 
		if((m_picRects[i].PtInRect(point)) && (m_picInfos[i].IsLoaded)) 
		{ 
			m_selIndex = i; 
			picPath = m_picInfos[i].filePath; 
			break; 
		} 
	} 
	return picPath; 
} 
 
void CMyWnd::LoadPic(const CString& strPath) 
{ 
	n=1; 
	InitpicInfo(); 
	m_selIndex = -1; 
	findFile.Free(); 
	m_compDC.BitBlt(0, 0, m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
 
	m_strPicPath = strPath; 
	findFile.SearchFiles(m_strPicPath, _T("*.jpg")); 
	CString strname; 
     int maxFile = findFile.GetSize() > MAX_RECT? MAX_RECT: findFile.GetSize(); 
    for(int i = 0; i < maxFile; ++i) 
	{ 
		strname = strPath + "\\" +findFile.GetAt(i); 
		if(!pic.Load(strname)) 
			continue; 
		pic.Render(&m_selPicDC, CRect(0, 0, POTHO_VIEW_RECT- 1, POTHO_VIEW_RECT -1)); 
		 
		m_compDC.BitBlt(m_picRects[i].left,m_picRects[i].top , 
			POTHO_VIEW_RECT, POTHO_VIEW_RECT, &m_selPicDC, 0,0, SRCCOPY); 
 
		m_picInfos[i].filePath = strname; 
		m_picInfos[i].IsLoaded = TRUE; 
	} 
	m_nextLoad = maxFile; 
	pic.Free(); 
	 
	UpdateText(n,findFile.GetSize()%MAX_RECT==0?findFile.GetSize()/MAX_RECT:findFile.GetSize()/MAX_RECT+1); 
	Invalidate(); 
} 
 
 
void CMyWnd::OnBTDown() 
{ 
	if(m_nextLoad >= MAX_RECT && m_nextLoad < findFile.GetSize()) 
	{ 
		CString strname; 
		InitpicInfo(); 
		if(findFile.GetSize() - m_nextLoad == 0) 
			return; 
	    m_compDC.BitBlt(0, 0, m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
		int maxNum = findFile.GetSize() - m_nextLoad > MAX_RECT ? MAX_RECT : findFile.GetSize() - m_nextLoad; 
		for(int i = 0; i < maxNum; ++i) 
		{ 
			strname = m_strPicPath + "\\" +findFile.GetAt(i + m_nextLoad); 
			if(!pic.Load(strname)) 
			{ 
				continue; 
			} 
				 
			pic.Render(&m_selPicDC, CRect(0, 0, POTHO_VIEW_RECT- 1, POTHO_VIEW_RECT -1)); 
			 
			m_compDC.BitBlt(m_picRects[i].left,m_picRects[i].top , 
				POTHO_VIEW_RECT, POTHO_VIEW_RECT, &m_selPicDC, 0,0, SRCCOPY); 
			 
			m_picInfos[i].filePath = strname; 
			m_picInfos[i].IsLoaded = TRUE; 
		} 
		n++; 
		 
		m_nextLoad += maxNum; 
	UpdateText(n,findFile.GetSize()%MAX_RECT==0?findFile.GetSize()/MAX_RECT:findFile.GetSize()/MAX_RECT+1); 
		 
		Invalidate(); 
	} 
} 
 
void CMyWnd::OnBTUp() 
{ 
	if(m_nextLoad > MAX_RECT) 
	{ 
		CString strname; 
		InitpicInfo(); 
 
	    m_compDC.BitBlt(0, 0, m_Rect.Width(), m_Rect.Height(), &m_bkDC, 0,0, SRCCOPY); 
		int shang; 
		int yushu = m_nextLoad % MAX_RECT; 
		if(yushu == 0) 
			shang = m_nextLoad / MAX_RECT - 2; 
		else 
			shang = m_nextLoad / MAX_RECT - 1; 
 
		for(int i = 0; i < MAX_RECT; ++i) 
		{ 
			strname = m_strPicPath + "\\" +findFile.GetAt(i +shang*MAX_RECT); 
			pic.Load(strname); 
			pic.Render(&m_selPicDC, CRect(0, 0, POTHO_VIEW_RECT- 1, POTHO_VIEW_RECT -1)); 
			 
			m_compDC.BitBlt(m_picRects[i].left,m_picRects[i].top , 
				POTHO_VIEW_RECT, POTHO_VIEW_RECT, &m_selPicDC, 0,0, SRCCOPY); 
			 
			m_picInfos[i].filePath = strname; 
			m_picInfos[i].IsLoaded = TRUE; 
			 
		}n--; 
		if(yushu != 0) 
			m_nextLoad -= yushu; 
		else 
			m_nextLoad -= MAX_RECT; 
		UpdateText(n,findFile.GetSize()%MAX_RECT==0?findFile.GetSize()/MAX_RECT:findFile.GetSize()/MAX_RECT+1); 
     
		Invalidate(); 
	} 
} 
 
void CMyWnd::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); 
    
	if(m_selIndex != -1) 
	{ 
		CPen pen, *oldPen; 
		pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255)); 
		oldPen  = dc.SelectObject(&pen); 
		 
		dc.MoveTo(m_picRects[m_selIndex].left, m_picRects[m_selIndex].top); 
		dc.LineTo(m_picRects[m_selIndex].left + POTHO_VIEW_RECT, m_picRects[m_selIndex].top); 
		dc.LineTo(m_picRects[m_selIndex].left + POTHO_VIEW_RECT, m_picRects[m_selIndex].top + POTHO_VIEW_RECT); 
		dc.LineTo(m_picRects[m_selIndex].left, m_picRects[m_selIndex].top + POTHO_VIEW_RECT); 
		dc.LineTo(m_picRects[m_selIndex].left, m_picRects[m_selIndex].top); 
		dc.SelectObject(oldPen); 
		pen.DeleteObject(); 
	} 
}