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

📄 showbmp~.cpp

📁 wince(eMbedded Visual C++ ) 图片浏览器的源代码。
💻 CPP
字号:
// ShowBMP.cpp : implementation file
//

#include "stdafx.h"
#include "ShowBMP.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CShowBMP

CShowBMP::CShowBMP()
{
}

CShowBMP::~CShowBMP()
{
	m_dcMem.DeleteDC();
}


BEGIN_MESSAGE_MAP(CShowBMP, CWnd)
	//{{AFX_MSG_MAP(CShowBMP)
	ON_WM_PAINT()
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CShowBMP message handlers


//////////////////////////////////////////////////////////////////////////////
//functions

void CShowBMP::Init()
{

	CClientDC dc(this);

	//创建位图显示内存环境变量
	m_dcMem.CreateCompatibleDC( &dc );
   
	CRect tmpRect;
	GetClientRect(&tmpRect);

	
CString aa;
aa.Format(_T("%d %d %d %d"), tmpRect.left,tmpRect.top,tmpRect.right, tmpRect.bottom);
AfxMessageBox(aa);


	//创建位图显示控件底部滚动条
	m_hbar.Create(SBS_HORZ | WS_CHILD | WS_VISIBLE, 
                  CRect(tmpRect.left,tmpRect.bottom-10,tmpRect.right, tmpRect.bottom), this, 100);
    //创建位图显示控件右边滚动条	
	m_vbar.Create(SBS_VERT  | WS_CHILD | WS_VISIBLE, 
                  CRect(tmpRect.right-10,tmpRect.top,tmpRect.right, tmpRect.bottom-10), this, 101);

	m_hbar.ShowWindow(false);
	m_vbar.ShowWindow(false);

	::SetBkColor(dc, RGB(255, 0, 0));
	/*
	tmpbtn.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), this, 1);

	tmpbtn.MoveWindow(0, 580, 20, 20);
	tmpbtn.ShowWindow(true);
	*/
}


BOOL CShowBMP::LoadBMP(HBITMAP hbmp)
{
//	if(hbmp != NULL )
//	DeleteObject(hbmp);

//	hbmp= SHLoadDIBitmap(strFileName);

//	hbmp = m_ImageViewerCtrl.DecompressImage(strFileName,NULL,NULL,FALSE);
	ASSERT( hbmp != NULL );

//加载BMP到控件

	BITMAP bmInfo;        // bmp位图信息结构
	CPoint pt; 
	SCROLLINFO horz,vert; // 滚动条参数
	m_sourceX=m_sourceY=0;
	
	//得到滚动位图显示控件大小
	GetClientRect( &m_rectStaticClient );
	m_rectStaticClient.NormalizeRect();

	pt.x = m_rectStaticClient.left;
	pt.y = m_rectStaticClient.top;

	//得到位图信息,存储到bmInfo
	HBITMAP hbmpOld;
	GetObject(hbmp , sizeof(BITMAP), &bmInfo );
	VERIFY(hbmpOld = (HBITMAP)SelectObject(m_dcMem, hbmp )  );

	m_offsetX = pt.x;
	m_offsetY = pt.y;

	// 设置滚动条参数
	horz.cbSize = sizeof(SCROLLINFO);
	horz.fMask = SIF_ALL;
	horz.nMin = 0;
	horz.nMax = bmInfo.bmWidth-m_rectStaticClient.Width();
	horz.nPage =0;
	horz.nPos = 0;
	horz.nTrackPos=0;
	
	//设置底部和右边滚动条
	if(bmInfo.bmWidth <= m_rectStaticClient.Width())
	{
		if((m_rectStaticClient.Width()-bmInfo.bmWidth)==0)
			m_offsetX= pt.x;
		else
			m_offsetX= pt.x+((m_rectStaticClient.Width()-bmInfo.bmWidth)/2);
		
		m_vbar.MoveWindow(m_offsetX+bmInfo.bmWidth,m_offsetY,18,m_rectStaticClient.Height());
	//	m_vbar.MoveWindow(SCREENFULLWIDTH - 20,m_offsetY,18,m_rectStaticClient.Height());
		m_hbar.ShowWindow(false);
	}
	else
		m_hbar.ShowWindow(true);

	m_hbar.SetScrollInfo(&horz);

	vert.cbSize = sizeof(SCROLLINFO);
	vert.fMask = SIF_ALL;
	vert.nMin = 0;
	vert.nMax = bmInfo.bmHeight-(m_rectStaticClient.Height());
	vert.nPage = 0;
	vert.nPos = 0;
	vert.nTrackPos= 0;

	if(bmInfo.bmHeight<=m_rectStaticClient.Height())
	{
		if((m_rectStaticClient.Height()-bmInfo.bmHeight)==0)
			m_offsetY= pt.y;
		else
			m_offsetY= pt.y+((m_rectStaticClient.Height()-bmInfo.bmHeight)/2);
		m_hbar.MoveWindow(m_offsetX,m_offsetY+bmInfo.bmHeight,m_rectStaticClient.Width(),18);
//		m_hbar.MoveWindow(m_offsetX,SCREENFULLHEIGHT - 20,m_rectStaticClient.Width(),18);
		m_vbar.ShowWindow(false);
	}
	else
		m_vbar.ShowWindow(true);
	m_vbar.SetScrollInfo(&vert);
	
	//更新显示
	InvalidateRect(&m_rectStaticClient);

//	CString aa;
//	aa.Format(_T("%d %d %d %d"), m_rectStaticClient.top, m_rectStaticClient.left, m_rectStaticClient.Width, m_rectStaticClient.Height);
//	AfxMessageBox(aa);

	return TRUE;

}

void CShowBMP::RefreshShow(HBITMAP hbmp)
{

	m_dcMem.DeleteDC();
	ASSERT( hbmp != NULL );

//加载BMP到控件

	BITMAP bmInfo;        // bmp位图信息结构
	CPoint pt; 
	SCROLLINFO horz,vert; // 滚动条参数
	m_sourceX=m_sourceY=0;
	
	//得到滚动位图显示控件大小
	GetClientRect( &m_rectStaticClient );
	m_rectStaticClient.NormalizeRect();

	pt.x = m_rectStaticClient.left;
	pt.y = m_rectStaticClient.top;



	ASSERT( hbmp != NULL);

	//得到位图信息,存储到bmInfo

	HBITMAP hbmpOld;
	GetObject(hbmp , sizeof(BITMAP), &bmInfo );

	CString aa;
	aa.Format(_T("%d"),bmInfo.bmWidth);
	AfxMessageBox(aa);

//	VERIFY(hbmpOld = (HBITMAP)SelectObject(m_dcMem, hbmp )  );
hbmpOld = (HBITMAP)SelectObject(m_dcMem, hbmp );
	m_offsetX = pt.x;
	m_offsetY = pt.y;

	// 设置滚动条参数
	horz.cbSize = sizeof(SCROLLINFO);
	horz.fMask = SIF_ALL;
	horz.nMin = 0;
	horz.nMax = bmInfo.bmWidth-m_rectStaticClient.Width();
	horz.nPage =0;
	horz.nPos = 0;
	horz.nTrackPos=0;
	
	//设置底部和右边滚动条
	if(bmInfo.bmWidth <= m_rectStaticClient.Width())
	{
		if((m_rectStaticClient.Width()-bmInfo.bmWidth)==0)
			m_offsetX= pt.x;
		else
			m_offsetX= pt.x+((m_rectStaticClient.Width()-bmInfo.bmWidth)/2);
		
		m_vbar.MoveWindow(m_offsetX+bmInfo.bmWidth,m_offsetY,18,m_rectStaticClient.Height());
	//	m_vbar.MoveWindow(SCREENFULLWIDTH - 20,m_offsetY,18,m_rectStaticClient.Height());
		m_hbar.ShowWindow(false);
	}
	else
		m_hbar.ShowWindow(true);

	m_hbar.SetScrollInfo(&horz);

	vert.cbSize = sizeof(SCROLLINFO);
	vert.fMask = SIF_ALL;
	vert.nMin = 0;
	vert.nMax = bmInfo.bmHeight-(m_rectStaticClient.Height());
	vert.nPage = 0;
	vert.nPos = 0;
	vert.nTrackPos= 0;

	if(bmInfo.bmHeight<=m_rectStaticClient.Height())
	{
		if((m_rectStaticClient.Height()-bmInfo.bmHeight)==0)
			m_offsetY= pt.y;
		else
			m_offsetY= pt.y+((m_rectStaticClient.Height()-bmInfo.bmHeight)/2);
		m_hbar.MoveWindow(m_offsetX,m_offsetY+bmInfo.bmHeight,m_rectStaticClient.Width(),18);
//		m_hbar.MoveWindow(m_offsetX,SCREENFULLHEIGHT - 20,m_rectStaticClient.Width(),18);
		m_vbar.ShowWindow(false);
	}
	else
		m_vbar.ShowWindow(true);
	m_vbar.SetScrollInfo(&vert);
	
	//更新显示
	InvalidateRect(&m_rectStaticClient);


}


void CShowBMP::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	dc.BitBlt(m_offsetX,m_offsetY,m_rectStaticClient.Width()-10,m_rectStaticClient.Height()-10, 
           &m_dcMem, m_sourceX, m_sourceY,SRCCOPY);
	// Do not call CWnd::OnPaint() for painting messages
}

void CShowBMP::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	switch (nSBCode)
	{
	case SB_TOP:
		m_sourceX = 0;
		break;
	case SB_BOTTOM:
		m_sourceX = INT_MAX;
		break;
	case SB_THUMBTRACK:
		m_sourceX= nPos;
		break;
	}
	m_hbar.SetScrollPos(m_sourceX);
	InvalidateRect(&m_rectStaticClient);

	CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CShowBMP::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
		switch (nSBCode)
	{
	case SB_TOP:
		m_sourceY = 0;
		break;
	case SB_BOTTOM:
		m_sourceY = INT_MAX;
		break;
	case SB_THUMBTRACK:
		m_sourceY = nPos;
		break;
	}
	m_vbar.SetScrollPos(m_sourceY);
    InvalidateRect(&m_rectStaticClient);

	CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}

BOOL CShowBMP::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	// 设置背景画刷颜色
	CBrush backBrush(RGB(255, 255, 255));
	// 保存旧画刷
	CBrush* pOldBrush = pDC->SelectObject(&backBrush);
	CRect rect;
	pDC->GetClipBox(&m_rectStaticClient); // 擦掉所要画的区域
	pDC->PatBlt(m_rectStaticClient.left, m_rectStaticClient.top, m_rectStaticClient.Width(),
				m_rectStaticClient.Height(), PATCOPY);
	pDC->SelectObject(pOldBrush);

	//return TRUE;

	return CWnd::OnEraseBkgnd(pDC);
}

⌨️ 快捷键说明

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