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

📄 scrollbmp.cpp

📁 WINCE下 EVC 图片滚动效果AU1200下
💻 CPP
字号:
// ScrollBmp.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "ScrollBmp.h"

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

/////////////////////////////////////////////////////////////////////////////
// CScrollBmp

CScrollBmp::CScrollBmp()
{
}

CScrollBmp::~CScrollBmp()
{
}


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


/////////////////////////////////////////////////////////////////////////////
// CScrollBmp message handlers

//初始化滚动位图显示控件
void CScrollBmp::InitBmpCtrl()
{
	CClientDC dc(this);
	//创建位图显示内存环境变量
	m_dcMem.CreateCompatibleDC( &dc );
   
	CRect tmpRect;
	GetClientRect(tmpRect);
	//创建位图显示控件底部滚动条
	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);
}

//根据位图名加载位图
BOOL CScrollBmp::LoadBmp(LPTSTR lpszResourceName)
{
	if(m_hBmpNew != NULL )
	DeleteObject(m_hBmpNew);
	
	m_hBmpNew = SHLoadDIBitmap(lpszResourceName);
	if( m_hBmpNew == NULL )
	{
		AfxMessageBox(_T("加载位图失败"));
		return FALSE;
	}
	LoadBmpToCtrl();
	m_offsetX=800;
	m_offsetY=0;
	m_sourceX=0;
	m_sourceY=0;
	SetTimer(1,5,NULL);
	return TRUE;
}

//根据位图资源ID加载位图
BOOL CScrollBmp::LoadBmp(UINT nIDResource)
{
	if(m_hBmpNew != NULL )
	DeleteObject(m_hBmpNew);
	
	m_hBmpNew = LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(nIDResource));
	if( m_hBmpNew == NULL )
	{
		AfxMessageBox(_T("加载位图失败"));
		return FALSE;
	}
	LoadBmpToCtrl();
	return TRUE;
}

//将位图加载到控件上显示
void CScrollBmp::LoadBmpToCtrl()
{
	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
	GetObject(m_hBmpNew , sizeof(BITMAP), &bmInfo );
	VERIFY(m_hBmpOld = (HBITMAP)SelectObject(m_dcMem, m_hBmpNew )  );

	bm_width=bmInfo.bmWidth;
	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_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_vbar.ShowWindow(false);
	}
	else
	//	m_vbar.ShowWindow(true);
	m_vbar.SetScrollInfo(&vert);
	
	//更新显示
//	InvalidateRect(&m_rectStaticClient);
}

//水平滚动事件
void CScrollBmp::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	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);
	m_erase=true;
	InvalidateRect(&m_rectStaticClient);

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

//竖直滚动事件
void CScrollBmp::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	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);
    m_erase=true;
    InvalidateRect(&m_rectStaticClient);
	
	CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CScrollBmp::OnPaint() 
{
	CPaintDC dc(this); // device context for painting


	//显示指定位置的图片
	dc.BitBlt(m_offsetX,m_offsetY,m_rectStaticClient.Width(),m_rectStaticClient.Height(), 
                   &m_dcMem, m_sourceX, m_sourceY,SRCCOPY);

	m_erase=false;	
}

BOOL CScrollBmp::OnEraseBkgnd(CDC* pDC) 
{
	if(m_erase)
		return false;
	else	
	return CWnd::OnEraseBkgnd(pDC);	
}

/*void CScrollBmp::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	AfxMessageBox(TEXT("Simple message box."));

	m_sourceX+=10;
	if(m_sourceX>m_rectStaticClient.Width())
         m_sourceX=0;

	m_hbar.SetScrollPos(m_sourceX);
	m_erase=true;
	InvalidateRect(&m_rectStaticClient);
	CWnd::OnTimer(nIDEvent);
}*/

void CScrollBmp::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	
	m_offsetX-=1;
	if((m_offsetX+540)<=0)
	{
    m_offsetX=800;
	
	}
	
    



	//m_hbar.SetScrollPos(m_sourceX);
	//m_erase=true;
	InvalidateRect(&m_rectStaticClient);
	CWnd::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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