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

📄 mywnd.cpp

📁 电子相册程序,实现图片的浏览,放大缩小等动能!evc4.0下编译通过!
💻 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();
	}
}

⌨️ 快捷键说明

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