본문 바로가기

c++/MFC

[MFC] 비트맵 배경을 스크롤하기

반응형

비트맵 배경 입힌 후,

https://seowoozzang.tistory.com/3



.h

	// These variables are required for vertical scrolling. 
static int m_yMinScroll;       // minimum vertical scroll value 
static int m_yCurrentScroll;   // current vertical scroll value 
static int m_yMaxScroll;       // maximum vertical scroll value 

.cpp

void CMyClass::OnSize(UINT nType, int cx, int cy)
{
	int xNewSize; 
	int yNewSize; 
	xNewSize = cx; 
	yNewSize = cy; 

	// The vertical scrolling range is defined by 
	// (bitmap_height) - (client_height). The current vertical 
	// scroll value remains within the vertical scrolling range. 
	m_yMaxScroll = max(m_cszBkgBitmap.cy - yNewSize, 0); 
	m_yCurrentScroll = min(m_yCurrentScroll, m_yMaxScroll);

	SCROLLINFO si;
	ZeroMemory(&si, sizeof(si));
	si.cbSize = sizeof(si); 
	si.fMask  = SIF_RANGE | SIF_PAGE | SIF_POS; 
	si.nMin   = m_yMinScroll; 
	si.nMax   = m_cszBkgBitmap.cy;
	si.nPage  = yNewSize; 
	si.nPos   = m_yCurrentScroll; 
	SetScrollInfo(SB_VERT, &si, TRUE); 
	CDialogEx::OnSize(nType, cx, cy);
}

void CMyClass::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	m_oldbitmap = m_MemDC.SelectObject(&m_bitmap);
	dc.SelectObject(m_oldbitmap);

	INT nBkgY = m_yCurrentScroll;

	m_hdc.BitBlt(0, 0, m_cszBkgBitmap.cx, m_cszBkgBitmap.cy, &m_MemDC, 0, nBkgY, SRCCOPY);
	dc.BitBlt(0, 0, m_cszBkgBitmap.cx, m_cszBkgBitmap.cy, &m_MemDC, 0, nBkgY, SRCCOPY);

	MoveResources();    //리소스 있으면 옮기기
}

void CMyClass::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	int yDelta;     // yDelta = new_pos - current_pos 
	int yNewPos;    // new position 

	switch (nSBCode) 
	{ 
	case SB_PAGEUP: 
		yNewPos = m_yCurrentScroll - 50; 
		break; 

		// User clicked the scroll bar shaft below the scroll box. 
	case SB_PAGEDOWN: 
		yNewPos = m_yCurrentScroll + 50; 
		break; 
		// User clicked the top arrow. 
	case SB_LINEUP: 
		yNewPos = m_yCurrentScroll - 5; 
		break; 
		// User clicked the bottom arrow. 
	case SB_LINEDOWN: 
		yNewPos = m_yCurrentScroll + 5; 
		break; 
		// User dragged the scroll box. 
	case SB_THUMBPOSITION: 
		yNewPos = nPos; 
		break; 
	default: 
		yNewPos = m_yCurrentScroll; 

	// Reset the current scroll position. 
	m_yCurrentScroll = yNewPos; 
	// Scroll the window. (The system repaints most of the 
	// client area when ScrollWindowEx is called; however, it is 
	// necessary to call UpdateWindow in order to repaint the 
	// rectangle of pixels that were invalidated.) 
	//ScrollWindowEx(0, -yDelta, (CONST RECT *) NULL, 
	//	(CONST RECT *) NULL, NULL, (PRECT) NULL, 
	//	SW_INVALIDATE); 
	//UpdateWindow(); 
	SCROLLINFO si;
	ZeroMemory(&si, sizeof(si));
	si.cbSize = sizeof(si); 
	si.fMask  = SIF_POS; 
	si.nPos   = m_yCurrentScroll; 
	SetScrollInfo(SB_VERT, &si, TRUE);
	Invalidate();	// OnPaint()호출
	}

}

BOOL CMyClass::OnEraseBkgnd(CDC* pDC)
{
	return TRUE;
	//return CDialogEx::OnEraseBkgnd(pDC); //화면깜빡임 방지
}

BOOL CMyClass::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
	if( zDelta > 0 )
	{
		PostMessage(WM_VSCROLL, SB_LINEUP);
	}
	else
	{
		PostMessage(WM_VSCROLL, SB_LINEDOWN);
	}
	return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);
}
반응형