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

📄 bitmapctrl.cpp

📁 在对话框的图片控件加滚动条的程序
💻 CPP
字号:
//John Melas
//jmelas@cc.ece.ntua.gr

#include "stdafx.h"
#include "BitmapCtrl.h"

CBitmapCtrl::~CBitmapCtrl()
{
	if(memDC.GetSafeHdc() != NULL)
	{
		memDC.SelectObject(pOldBitmap);
		if(pBitmap != NULL)
			delete pBitmap;
	}
}

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

BOOL CBitmapCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd) 
{
	scrollbar_width = GetSystemMetrics(SM_CXVSCROLL);
	
	// create window
	BOOL ret;
	static CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,AfxGetApp()->LoadStandardCursor(IDC_ARROW));
	ret = CWnd::CreateEx(WS_EX_CLIENTEDGE,className,NULL,dwStyle, 
		rect.left,rect.top,rect.right - rect.left,rect.bottom - rect.top,
		pParentWnd->GetSafeHwnd(),0);
	// init virtual screen
	GetClientRect(rcClient);
	CClientDC dc(this);
	if(memDC.GetSafeHdc() == NULL)
	{
		memDC.CreateCompatibleDC(&dc);
		if((pBitmap = new CBitmap()) == NULL) return FALSE;
		pBitmap->CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
		pOldBitmap = memDC.SelectObject(pBitmap);
		memDC.SelectStockObject(ANSI_VAR_FONT);
		memDC.SetBkMode(TRANSPARENT);
	}
	x_offset = 0;
	y_offset = 0;
	memDC.FillSolidRect(&rcClient,RGB(128,128,128));

	return ret;
}

void CBitmapCtrl::OnPaint() 
{
	CPaintDC dc(this);
	if(memDC.GetSafeHdc() != NULL)
		dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,SRCCOPY);
}


void CBitmapCtrl::SetBitmap(HBITMAP hBmp)
{
	//reset offsets
	x_offset = 0;
	y_offset = 0;

	//reset scrollbar
	SCROLLINFO si;
	si.fMask = SIF_PAGE | SIF_RANGE;
	si.nMin = 0;
	si.nMax = 0;
	si.nPage = 0;
	SetScrollInfo(SB_HORZ, &si, TRUE);
	SetScrollInfo(SB_VERT, &si, TRUE);
	
	//redraw background
	GetClientRect(&rcClient);
	memDC.FillSolidRect(&rcClient,RGB(128,128,128));
		
	//get bitmap handle
	hBitmap = hBmp;

	if (hBitmap == 0)
	{
		memDC.TextOut(0,0,"File not found.");
		Invalidate();
		return;
	}
	
	//get image size
	CPoint point(x_offset,y_offset);
	BITMAP bmpInfo;
	CBitmap::FromHandle(hBitmap)->GetBitmap(&bmpInfo);
	image_size.cx = bmpInfo.bmWidth;
	image_size.cy = bmpInfo.bmHeight;
	
	//check image size
	BOOL x_fit;
	BOOL y_fit;
	x_fit = (bmpInfo.bmWidth <= rcClient.Width());
	if (!x_fit)
		rcClient.bottom -= scrollbar_width;
	y_fit = (bmpInfo.bmHeight <= rcClient.Height());
	if (!y_fit)
	{
		rcClient.right -= scrollbar_width;
		x_fit = (bmpInfo.bmWidth <= rcClient.Width());
	}
	if (!x_fit)
	{
		// show scrollbar
		ShowScrollBar(SB_HORZ);
	/*CRect scroll_rect;
	GetScrollBarCtrl(SB_HORZ)->GetWindowRect(&scroll_rect);
	char sz[256];
	sprintf(sz,"%d",scroll_rect.left - scroll_rect.right);
	MessageBox(sz);*/
		// update scrollbar
		SCROLLINFO si;
		si.fMask = SIF_PAGE | SIF_RANGE;
		si.nMin = 0;
		si.nMax = bmpInfo.bmWidth-1;
		si.nPage = rcClient.Width();
		SetScrollInfo(SB_HORZ, &si, TRUE);
	}
	if (!y_fit)
	{
		// show scrollbar
		ShowScrollBar(SB_VERT);
		// update scrollbar
		SCROLLINFO si;
		si.fMask = SIF_PAGE | SIF_RANGE;
		si.nMin = 0;
		si.nMax = bmpInfo.bmHeight-1;
		si.nPage = rcClient.Height();
		SetScrollInfo(SB_VERT, &si, TRUE);
	}
	
	DrawBitmap();
}

void CBitmapCtrl::DrawBitmap()
{
	CPoint point(-x_offset,-y_offset);
	memDC.DrawState(point,image_size,hBitmap,DST_BITMAP|DSS_NORMAL);
	Invalidate();
}

void CBitmapCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int nSmall = 1;
	int nLarge = 20;

	if(pScrollBar == GetScrollBarCtrl(SB_HORZ))
	{
		if(nSBCode == SB_LEFT || nSBCode == SB_LINELEFT)
			x_offset -= nSmall;
		if(nSBCode == SB_PAGELEFT)
			x_offset -= nLarge;
		if(nSBCode == SB_RIGHT || nSBCode == SB_LINERIGHT)
			x_offset += nSmall;
		if(nSBCode == SB_PAGERIGHT)
			x_offset += nLarge;
		if(nSBCode == SB_THUMBPOSITION)
			x_offset = (int)nPos;
		if(nSBCode == SB_THUMBTRACK)
			x_offset = (int)nPos;
		if (x_offset<0)
			x_offset = 0;
		if (x_offset>image_size.cx - rcClient.Width())
			x_offset = image_size.cx - rcClient.Width();
		SetScrollPos(SB_HORZ, x_offset, TRUE);
		DrawBitmap();
	}
}

void CBitmapCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int nSmall = 1;
	int nLarge = 20;

	if(pScrollBar == GetScrollBarCtrl(SB_VERT))
	{
		if(nSBCode == SB_TOP || nSBCode == SB_LINEUP)
			y_offset -= nSmall;
		if(nSBCode == SB_PAGEUP)
			y_offset -= nLarge;
		if(nSBCode == SB_BOTTOM || nSBCode == SB_LINEDOWN)
			y_offset += nSmall;
		if(nSBCode == SB_PAGEDOWN)
			y_offset += nLarge;
		if(nSBCode == SB_THUMBPOSITION)
			y_offset = (int)nPos;
		if(nSBCode == SB_THUMBTRACK)
			y_offset = (int)nPos;
		if (y_offset<0)
			y_offset = 0;
		if (y_offset>image_size.cy - rcClient.Height())
			y_offset = image_size.cy - rcClient.Height();
		SetScrollPos(SB_VERT, y_offset, TRUE);
		DrawBitmap();
	}
}

void CBitmapCtrl::LoadFile(CString filename)
{
	HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
	SetBitmap(hBitmap);
}

⌨️ 快捷键说明

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