티스토리 뷰
1. 더블 버퍼링에 대하여
더블버퍼링은 WM_PAINT에서 해주는 일을 간략화 시켜주기 위해! 다른 곳에서 미리 BITMAP에다가 다 그려놓고 WM_PAINT에서는 해당 BITMAP을 불러와주는 일만 해주도록 하는 것. MFC의 경우엔 CBitmap을 사용한다
클래스 내에 CBitmap m_BitmapBG; 뭐 이런식으로 하나 만들고
다른 함수 (예를 들어 고정 배경이라면 Init부분에서)에서 MemDC를 만들어 SelectObject로 m_BitmapBG를 선택한 후 그리기를 완료한다. 이 때 중요한 점은 CBitmap.DeleteObject()를 하면 안된다는 것! 이건 WM_DESTROY시에 해줘야 한다.
여튼.. m_BitmapBG에 그리기를 완료하고나서는 WM_PAINT에서는 m_BitmapBG만 Select하고 BitBlt으로 불러와 주면 된다.
예제를 보면..
CDC* pdc;
CDC* p_MemDc = new CDC();
pdc = GetDC();
m_BitmapBG.CreateCompatibleBitmap(pdc,x,y); //비트맵 크기를 꼭 할당해야한다.
p_MemDC->CreateCompatibleDC(pdc); //MemDC도 크기를 꼭 할당해야한다.
p_MemDC->SelectObject(&m_BitmapBG); //MemDC의 Bitmap으로 m_BitmapBG를 선택한다.
이후에는 p_MemDC에 그리기 작업을 다 수행해준다.
GetDC로 얻은 것은 ReleaseDC(pdc);로 지워주고
절대 ->DeleteDC 이딴건 쓰지 말 것.
이제 WM_PAINT를 보면
CPaintDC dc(this);
CDC *p_MemDC = new CDC();
CBitmap* p_oldBitmap;
p_MemDC->CreateCompatibleDC(&dc);
p_oldBitmap = p_MemDC->SelectObject(&m_BitmapBG);
dc.BitBlt(0,0,x,y,p_MemDC,0,0,SRCCOPY);
p_MemDC->SelectObject(p_oldBitmap);
delete p_MemDC;
소스가 이게 전부이다. MemDC를 하나 생성해 SelectObject로 아까 그려준 비트맵을 선택하여 BitBlt으로 PaintDC에 고속 복사 해준다. 끝~
2. delete에 관하여
우선, 포인터 변수 중 new로 생성한 녀석은 반드시 delete가 있어야 한다. 한마디로 하나의 new에는 하나의 delete가 필히 존재해야 한다.
Object들 역시 사용을 완료한 녀석들은 DeleteObject();로 지워준다. DeleteObject();로 지워주기 전에 DC의 Object는 OldObject로 교체해 주는 센스..
DC도 사용 후에는 반드시 DeleteDC를 해주자.
단, new를 사용하지 않고 걍 포인터를 사용하여 지역변수로 생성한 녀석들은 굳이 delete해주지 않아도 된다.
예를 보면
CDC* pdc;
CPen pen(PS_SOLID,1,RGB(255,255,255)), *p_oldpen;
pdc = GetDC();
p_oldpen = p_MemDC->SelectObject(&pen);
p_MemDC->MoveTo(0,0);
p_MemDC->LineTo(50,50);
p_MemDC->SelectObject(p_oldpen);
pen.DeleteObject();
ReleaseDC(pdc);
이렇게 된다.
만약 생성을 CPen* pen = new CPen(); 이런식으로 했다면 다 사용한 후
delete pen; 을 꼭 해줘야 한다.
p.s> CPaintDC는 delete를 안해주는데.. 왜 안해주는지 모르겠다. 걍 MFC하지 말래서 안한다 =_=aa
'Development > Windows' 카테고리의 다른 글
[Visual Studio] DLL을 만들기. DLL 사용하기. (0) | 2010.11.26 |
---|---|
버튼을 생성했더니 다이얼로그 프로그램 종료가 되지 않았다. (0) | 2010.10.22 |
[MFC] Class 에서 static 멤버 변수 사용하기 (0) | 2010.10.20 |
[UAC] Windows Vista의 사용자 계정 컨트롤(User Account Control : UAC) – 누구를 위한 기능인가? 그리고 왜? (0) | 2010.10.11 |
MFC 다이얼로그 상속 받기 (0) | 2010.08.18 |
MFC Dialog Base 프로그램에서 엔터치면 꺼지는 문제 해결 (1) | 2010.07.19 |
MFC Button위에 Bitmap 입히기 (6) | 2010.07.15 |
MFC 기본 TIP (0) | 2010.07.15 |
- Total
- Today
- Yesterday
- C++
- 프로그래밍
- jni강좌
- winapi
- API
- gcc
- 드라이버
- 안드로이드
- 음악
- jni
- source
- C
- java
- Visual C++
- algorithm
- it
- kering
- MFC
- Cloud
- Quiz
- 리눅스
- NDK
- android
- driver
- AWS
- linux
- Python
- database
- Troubleshooting
- db
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |