본문 바로가기
프로그래밍/라이브러리

[MFC] CDC/CClientDC

by 써드아이 2008. 2. 6.
CDC   : 실행된 윈도우에 대한 모든 소유권을 갖으며 사용후 반드시 ReleaseDC를 해야한다.
CClientDC : CDC의 subset 개념이며 ReleaseDC가 필요없다.


CDC dc;
CPen pen;
pen.SelectObject( &dc );
    pen이 dc 안에서만 동작하도록 설정/ 사용전 old object를 가지고 있다가 사용후 old를 반환
    dc를 clientdc로 사용할 때 global로 clientdc를 잡은 경우 object의
    주체를 알 수 없고 local로 잡을 경우 scope rule의 문제가 생긴다.


CClientDc dc( this );
DCD MemDC;
MemDC.CreateCompatibleDC( &dc );
    DC(여기서는 MemDC)를 ClientDC 처럼 사용. ReleaseDC가 필요 없이 ClientDC의
    scope rule을 따른다.

MemDC.CreateCompatibleBitmap( &dc, x, x )
    DC에  bitmap을 사용하지만 실제로는 ClientDC에 적용된다.
    이처럼 다른 handle에 적용하기 위해서는 CreateCompatibleHandle( &dc... )
    를 해준다.


GetWindowRect( &rect ) : 좌표를 전체 화면 기준으로 가져온다
ScreeToClient( &rect ) : 현재 실행중인 윈도를 기준 잡아 0,0을 만든다.

Invalidate()  : 전체 화면을 다시 그린다.
InvalidateRect()/InvalidateRgn() : Rect/Rgn 영역만 다시 그린다.


Picture Control에다가 Dialog를 넣고 LButtonDown시 InvalidateRect()을 사용하여
Picture Control을 다시 그리고 Rect와 WParam/LParam으로 넘어오는 좌표를 비교