- 발표ì—� ê¼ ë“¤ì–´ê°€ì•¼ í• ê²ƒë“¤
- �블버��� 무엇�가?
- �블버��� 어떻게 하는가?
- �블버��� 무엇�가?
ë�”블버í�¼ë§�ì�´ëž€>?? ¶
ë�”블 버í�¼ë§�ì�€ ì�´ë¯¸ì§€ë¥¼ 화면ì—� 바로 그리는 것ì�´ 아니ë�¼, 메모리(버í�¼)ì—� ë¨¼ì € ê·¸ë¦¬ê³ í™”ë©´ì—� 나중ì—� 그리는 방법ì�´ë‹¤. ë�”블 버í�¼ë§�ì�€ 화면ì�˜ 깜빡임ì�„ 줄ì�´ê³ , ìž�연스러운 ì• ë‹ˆë©”ì�´ì…˜ì�„ 위해서 ë§Žì�´ 사용ë�œë‹¤.
ê·¸ë ‡ë‹¤ë©´ ë�”블 버í�¼ë§�ì�„ 과연 ì–¸ì œ 어떻게 사용해야 í• ê¹Œ? ë�”블 버í�¼ë§�ì�˜ ìš©ë�„는 ê¼ í™”ë©´ 깜박임ì�„ ì œê±°í•˜ëŠ”ë�°ë§Œ 있는 것ì�€ 아니다. ë‚´ë¶€ 버í�¼ì—�서 틈틈ì�´ 작업ì�„ í• ìˆ˜ 있으므로 ì•„ì�´ë“¤(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);
}













