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

📄 scrollbmp.cpp

📁 程序创建了位图滚动显示静态控件。解决图片尺寸大于静态控件预先定义大小而显示不全的问题。EVC 编写的POCKET PC 2003模拟器的程序。里边有一个类比较有参考价值。
💻 CPP
字号:
// ScrollBmp.cpp : implementation file
//

#include "stdafx.h"
#include "ScrollBmpUse.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()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CScrollBmp message handlers
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));
	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_offsetY,m_offsetY+bmInfo.bmHeight,m_rectStaticClient.Width(),
			18);
		m_vbar.ShowWindow(false);
	}
	else
		m_vbar.ShowWindow(true);
	m_vbar.SetScrollInfo(&horz);


	//更新显示
	InvalidateRect(&m_rectStaticClient);
}
//初始化滚动位图显示控件
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_VISIBLE | WS_CHILD,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();
	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::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);
	m_erase=true;
	InvalidateRect(&m_rectStaticClient);
	CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CScrollBmp::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);
	m_erase=true;
	InvalidateRect(&m_rectStaticClient);
	CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CScrollBmp::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);
	m_erase=false;
	// Do not call CWnd::OnPaint() for painting messages
}

BOOL CScrollBmp::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_erase)
		return false;
	else
	return CWnd::OnEraseBkgnd(pDC);
}

⌨️ 快捷键说明

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