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 |