본문 바로가기

소프트웨어/Win32

Win32] Bitmap Bitblt, StretchBlt

https://github.com/ManSung-Kim/Win32Study/blob/master/StudyWin32/Bitmap.cpp




Java Window Programming을 했을때 여러장의 bitmap을 그냥 그리면 깜빡거리는 문제를 겪은적이있다.

문제는 화면에 뿌릴 버퍼가 하나여서 bitmap을 만들고 뿌리는동안 간격이 생겨서 그런 문제였다. 이 문제는 DoubleBuffering으로 해결하는데 Window에서 Bitmap을 그릴때도 같은 개념으로 문제를 해결한다.

물론 이 소스는 더블버퍼링은 아니지만,,



Win32에서는 기본 DC와 MemoryDC를 이용하여 그리기를 수행할수 있다.

준비물. 

hdc : 외부에 뿌려질 DC

MemDC : hdc의 호환성을 갖는 내부용 Memory DC

MyBitMap : BITMAP Resource로부터 얻어지는 bitmap handle

OldBitMap : MyBitMap을 사용하기 이전 bitmap handle값, MyBitmap을 놓고(끊고?) 삭제할때 원본 bitmap handle로 돌리기 위함

#BitBlt : MemDC에 그려진 값을 HDC로 옮기는데 쓰임

#StretchBlt : BitBlt과 같은 성격을 갖고있으나 복사될 origin src의 size를 지정할수있다.





hdc=BeginPaint(hWnd,&ps);
		MemDC=CreateCompatibleDC(hdc); // Memory DC 만들기(Hdc에 호환되는 background dc만들기,버퍼링)
		MyBitMap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1)); // bitmap 불러오기
		OldBitMap = (HBITMAP)SelectObject(MemDC,MyBitMap); 
			// slect object는 arg2의 gdiHandle을 현재 dc의 handle로 선택하고
			// 이전에 선택되어있던 handle을 리턴한다. 
			// select된 handle은 삭제를하면 안되므로 나중에 oldhandle로 복귀후 myhandle을 삭제.
			// (이전 handle값을 저장해놔야 그린 이후 이전 핸들로 복귀할수있기때문)
		//BitBlt(hdc,0,0, 100,100,MemDC,0,0,SRCCOPY); 
		BitBlt(hdc,0,0, 100,100,MemDC,0,0,MERGECOPY); // 원본크기대로 복사수행
		BitBlt(hdc,100,100, 100,200,MemDC,0,0,MERGECOPY); // 겹쳐서 또 그림
		StretchBlt(hdc,300,300,100,300,MemDC,0,0,500,500,MERGECOPY); // 복사될 크기 정해서 복사수행
			// bitblt는 DC간 고속복사 수행함.
			// hdc, stX,stY,edX,edY
			// hdcSrc(MemDC) : hdc로 복사하고자하는 back DC
			// MemDc에 그려져있는 bitmap의 시작좌표
			// dwRop(SRCCOPY) : 복사모드, srccopy는 원본그대로복사
			//		SRCCOPY,BLACKNESS,DSTINVERT,MERGECOPY(AND),MERGEPAINT(OR),WHITENESS 등이있다.
		SelectObject(MemDC, OldBitMap); // MyBitmap삭제를 위해 handle을 old로 다시 바꿔선택한다.
		DeleteObject(MyBitMap); // MyBitmap을 삭제한다.
		DeleteDC(MemDC); // Back에서 사용한  MemDC는 삭제한다.

		EndPaint(hWnd,&ps);



결과물 스크린샷





'소프트웨어 > Win32' 카테고리의 다른 글

Win32] Edit  (0) 2016.01.17
Win32] CheckBox  (0) 2016.01.17
Win32] Button  (0) 2016.01.17
Win32 공부를 시작하면서..  (0) 2016.01.06
Win32] Menu 만들기  (0) 2016.01.06
Win32 첫 소스(기본소스)  (0) 2016.01.06
VS2010] Resource .rc 다른편집기에서 열려있습니다.  (0) 2016.01.06