U E D R , A S I H C RSS

5�용C++스터디/�블버��

  • 발표ì—� ê¼­ 들어가야 í•  것들
    • ë�”블버í�¼ë§�ì�´ 무엇ì�¸ê°€?
    • ë�”블버í�¼ë§�ì�€ 어떻게 하는가?

�블버���란>??

�블 버��� �미지를 화면� 바로 그리는 것� 아니�, 메모리(버�)� 먼저 그리고 화면� 나중� 그리는 방법�다. �블 버��� 화면� 깜빡임� 줄�고, �연스러운 애니메�션� 위해서 많� 사용�다.

그렇다면 ë�”블 버í�¼ë§�ì�„ 과연 언제 어떻게 사용해야 할까? ë�”블 버í�¼ë§�ì�˜ ìš©ë�„는 ê¼­ 화면 깜박임ì�„ 제거하는ë�°ë§Œ 있는 것ì�€ 아니다. ë‚´ë€ ë²„í�¼ì—�서 틈틈ì�´ 작업ì�„ í•  수 있으므로 ì•„ì�´ë“¤(Idle) 시간ì�„ 활용하기 위해서 사용할 수ë�„ 있고 ë‚´ë€ ë²„í�¼ë¥¼ ì™¸ë€ ë²„í�¼ë³´ë‹¤ ë�” í�¬ê²Œ 만들어 스í�¬ë¡¤ì—� 활용할 수ë�„ 있다.

여기서는 ë�”블 버í�¼ë§�ì�˜ ì›�리ì—� 대해서만 ì�´í•´í•˜ë�„ë¡� 하고 실무를 í•  때 ë�”블 버í�¼ë§�ì�„ ì“°ë©´ 좋겠다는 ìƒ�ê°�ì�´ 들면 ì �ê·¹ì �으로 활용해 보기 바란다. 다ì�Œ 예제는 ë�”블 버í�¼ë§�ì�„ 활용한 ê°± 화면ì�´ë‹¤. ê°±(Gang) 화면ì�´ëž€ 프로그램 제작ìž�를 소개하는 ìš©ë�„를 가지며 ì�¼ë°˜ì �으로 숨겨져 있지만 제작ìž� ìž�ì‹ ì�„ 표현한다는 ë©´ì—� 있어 다소 ë©‹ì�„ 좀 ë€ë¦¬ëŠ” 경향ì�´ 있다. ì�´ 예제는 ë°°ê²½ 비트맵ì�„ 깔고 ê·¸ 위ì—�서 제작ìž� 목ë¡�ì�„ 위로 스í�¬ë¡¤í•˜ëŠ” 예를 보여준다.



~cpp 
#include "resource.h"

HBITMAP hBit, hBaby;

TCHAR szGang[]="Gang Version 1.0\r\n\r\n� �� : 김 정수\r\n"

"개발� : 김 �형\r\n사진 모� : 김 한슬\r\n협찬 : 박 미�";

int my;

 

void DrawBitmap(HDC hdc,int x,int y,HBITMAP hBit)

{

HDC MemDC;

HBITMAP OldBitmap;

int bx,by;

BITMAP bit;

 

MemDC=CreateCompatibleDC(hdc);

OldBitmap=(HBITMAP)SelectObject(MemDC, hBit);

 

GetObject(hBit,sizeof(BITMAP),&bit);

bx=bit.bmWidth;

by=bit.bmHeight;

 

BitBlt(hdc,0,0,bx,by,MemDC,0,0,SRCCOPY);

 

SelectObject(MemDC,OldBitmap);

DeleteDC(MemDC);

}

 

void OnTimer()

{

RECT crt;

HDC hdc,hMemDC;

HBITMAP OldBit;

HFONT font, oldfont;

RECT grt;

int i,j;

 

GetClientRect(hWndMain,&crt);

hdc=GetDC(hWndMain);

 

if (hBit==NULL) {

    hBit=CreateCompatibleBitmap(hdc,crt.right,crt.bottom);

}

hMemDC=CreateCompatibleDC(hdc);

OldBit=(HBITMAP)SelectObject(hMemDC,hBit);

 

DrawBitmap(hMemDC,0,0,hBaby);

SetBkMode(hMemDC,TRANSPARENT);

 

font=CreateFont(30,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,

    VARIABLE_PITCH | FF_ROMAN,"�서");

oldfont=(HFONT)SelectObject(hMemDC,font);

 

my--;

if (my==20) {

    KillTimer(hWndMain,1);

}

 

SetTextColor(hMemDC,RGB(192,192,192));

for (i=-1;i<=1;i++) {

    for (j=-1;j<=1;j++) {

       SetRect(&grt,10+i,my+j,400+i,my+300+j);

       DrawText(hMemDC,szGang,-1,&grt,DT_WORDBREAK);

    }

}

 

SetTextColor(hMemDC,RGB(32,32,32));

SetRect(&grt,10,my,400,my+300);

DrawText(hMemDC,szGang,-1,&grt,DT_WORDBREAK);

 

SelectObject(hMemDC,oldfont);

DeleteObject(font);

 

SelectObject(hMemDC,OldBit);

DeleteDC(hMemDC);

ReleaseDC(hWndMain,hdc);

InvalidateRect(hWndMain,NULL,FALSE);

}

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

HDC hdc,hMemDC;

PAINTSTRUCT ps;

HBITMAP OldBit;

RECT crt;

 

switch(iMessage) {

case WM_CREATE:

    hBaby=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1));

case WM_LBUTTONDOWN:

    SetTimer(hWnd,1,70,NULL);

    my=310;

    return 0;

case WM_TIMER:

    OnTimer();

    return 0;

case WM_PAINT:

    hdc=BeginPaint(hWnd, &ps);

    GetClientRect(hWnd,&crt);

    hMemDC=CreateCompatibleDC(hdc);

    OldBit=(HBITMAP)SelectObject(hMemDC, hBit);

    BitBlt(hdc,0,0,crt.right,crt.bottom,hMemDC,0,0,SRCCOPY);

    SelectObject(hMemDC, OldBit);

    DeleteDC(hMemDC);

    EndPaint(hWnd, &ps);

    return 0;

case WM_DESTROY:

    if (hBit) {

       DeleteObject(hBit);

    }

    DeleteObject(hBaby);

    PostQuitMessage(0);

    KillTimer(hWnd,1);

    return 0;

}

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}


실행 결과는 다�과 같다. 움��는 화면�므로 �접 실행해 �야 결과를 볼 수 있다. 예� 아기 그림� 있고 아래�서 문�열� 천천히 위로 올�오는 �작� 한다.



문ìž�ì—´ì�€ 바깥쪽ì—� 회색 í…Œë‘�리를 가지ë�„ë¡� 했으며 보기 편하ë�„ë¡� í�¼ì§�한 í�°íŠ¸ë¥¼ 사용했다. 비트맵 위ì—�서 글ìž�ê°€ 움ì§�ì�´ì§€ë§Œ 깜박임ì�€ 전혀 없으며 아주 ë€ë“œëŸ½ê²Œ 스í�¬ë¡¤ë�˜ëŠ” 것ì�„ ë³¼ 수 있다. 만약 ì�´ëŸ° 화면ì�„ ë�”블 버í�¼ë§�으로 처리하지 않는다면 ë°°ê²½ 비트맵과 그림ì�´ 계ì†� 반복ì �으로 화면ì—� 나타나기 때문ì—� 깜박임ì�´ 심해지고 ê°± 화면으로서 가치가 떨어질 것ì�´ë‹¤.

좀 � 코드를 작성한다면 글�들� 오른쪽�서 왼쪽으로 한 줄씩 날� 오�� 할 수� 있고 �� 확대�는 모양으로 만들 수� 있다. �는 약간� 애니메�션� 첨가한다거나 글�� 색�� 조작하여 Fade In, Fade Out 등� 장면 전환 효과를 낼 수� 있다. 아�든 �블 버��� 쓰기만 하면 어떠한 모양� 깔�하게 화면으로 구현할 수 있으므로 기발한 ��력� 발휘해 볼만하다.

~cpp 
public:
	CBitmap MemBitmap;
	CDC MemDC;
	CPoint Position;

~cpp 
CTestView::CTestView()
{
	// TODO: add construction code here
	Position = CPoint(0, 0);

}

~cpp 
void CTestView::OnDraw(CDC* pDC)
{
	CTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	MemDC.FillSolidRect(0, 0, 1024, 768, RGB(255, 255, 255));
	MemDC.SelectStockObject(NULL_BRUSH);
	for(int i = 5 ; i <= 10 ; i++)
	{
		MemDC.Ellipse(Position.x - i, Position.y - i,
			Position.x + i, Position.y + i);
		MemDC.Rectangle(Position.x + 10 - i, Position.y + 10 - i,
			Position.x + 10 + i, Position.y + 10 + i);
	}
	//pDC->StretchBlt(0, 0, 102, 77, &MemDC, 0, 0, 1024, 768, SRCCOPY);
	pDC->BitBlt(0, 0, 1024, 768, &MemDC, 0, 0, SRCCOPY);
	// TODO: add draw code for native data here
}

~cpp 
int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	CDC *pDC = GetDC();
	MemDC.CreateCompatibleDC(pDC);
	MemBitmap.CreateCompatibleBitmap(pDC, 1024, 768);
	MemDC.SelectObject(&MemBitmap);
	ReleaseDC(pDC);
	SetTimer(1, 1000, NULL);
	
	
	
	// TODO: Add your specialized creation code here
	
	return 0;
}

void CTestView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	Invalidate();
	Position.x += 2;
	Position.y += 1;
	
	CView::OnTimer(nIDEvent);
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:18
Processing time 0.0717 sec