OnPaint()
Programming/MFC 2012. 2. 13. 10:23 |WM_PAINT : 윈도우를 다시 그려야 할 때(윈도우 작업 영역 중 일부가 무효화되어 있을 때) 발생하는 메시지.
① 윈도우가 처음 생성되었을 때
② 윈도우의 위치가 이동되었을 때
③ 윈도우의 크기가 변경되었을 때. 최대/최소화 되었을 때.
④ 다른 윈도우에 가려져있다가 드러날 때
⑤ 스크롤 될 때
① 윈도우가 처음 생성되었을 때
② 윈도우의 위치가 이동되었을 때
③ 윈도우의 크기가 변경되었을 때. 최대/최소화 되었을 때.
④ 다른 윈도우에 가려져있다가 드러날 때
⑤ 스크롤 될 때
WM_PAINT 메세지는 플래그성 메세지이기 때문에 메세지가 발생하여 WM_PAINT 관련 플래그에 1 로
설정되면 메세지 큐가 비어 있어도 WM_PAINT 메세지가 지속적으로 발생하게 된다. 이 행위는
WM_PAINT 관련 플래그가 0 으로 다시 변경되기 전까지 계속 반복되므로 WM_PAINT 메세지를 처리해주는 OnPaint() 에는 무효화 영역을 복구하는 코드와 함께 WM_PAINT메세지를 0 으로 변경해 주는 코드도 함께 존재하게 처리해야 한다.
보통은 아래와 같이 작성하게 된다.
... 위 코드의 CPaintDC dc(this); 를 제외한 if 문과 동일 ( 중략 ) ...
} else {
이런식으로 OnPaint()를 처리하면 이렇게 안했을 경우에 비해서 CPU점유율이 감소하게 된다.
왜? 필요할때만 OnPaint()를 호출하기 떄문에~
출처 : http://www.winapi.co.kr http://kentaro9.tistory.com/137
void 클래스명::OnPaint()
{
// IsIconic은 WIN32 API는 IsIconic(HWND hWnd) 이렇고, MFC는 IsIconic() 은 이렇다. 해당 윈도우의 최소화 여부를 판단하여 최소화 되었다면 0이 아닌값. 최소화가 아니라면 0을 리턴한다.
if (IsIconic()) {
CPaintDC dc(this); // device context for painting
{
// IsIconic은 WIN32 API는 IsIconic(HWND hWnd) 이렇고, MFC는 IsIconic() 은 이렇다. 해당 윈도우의 최소화 여부를 판단하여 최소화 되었다면 0이 아닌값. 최소화가 아니라면 0을 리턴한다.
if (IsIconic()) {
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
} else {
CDialog::OnPaint();
}
}
dc.DrawIcon(x, y, m_hIcon);
} else {
CDialog::OnPaint();
}
}
이를 간단히 설명하면, 위 함수에서 if 문은 프로그램이 최소화되었을 때 아이콘을 그려주는 루틴이고, else 문의 경우 프로그램이 최소화 상태가 아닌 경우에 사용자가 처리해 주어야 하는 무효화되었던 영역을 복구하는 루틴이다.
결론은 이렇게 OnPaint()를 처리하면, IsIconic()으로 프로그램이 최소화 됐을때 불필요하게 OnPaint()를 호출하는 일이 없어진다.
결론은 이렇게 OnPaint()를 처리하면, IsIconic()으로 프로그램이 최소화 됐을때 불필요하게 OnPaint()를 호출하는 일이 없어진다.
보통은 아래와 같이 작성하게 된다.
void 클래스명::OnPaint()
{
{
CPaintDC dc(this); // device context for painting
if (IsIconic()) {
if (IsIconic()) {
... 위 코드의 CPaintDC dc(this); 를 제외한 if 문과 동일 ( 중략 ) ...
} else {
// 직접 무효화 영역을 복구할 경우..
dc.Rectangle(10, 10, 100, 100);
// 직접하기 귀찮다면 다시 OnPaint()에게 떠넘김.. CDialog::OnPaint();
}
}
}
}
왜? 필요할때만 OnPaint()를 호출하기 떄문에~
출처 : http://www.winapi.co.kr http://kentaro9.tistory.com/137
'Programming > MFC' 카테고리의 다른 글
CString를 char*로 바꾸기 (0) | 2012.04.25 |
---|---|
자식윈도우 Z-order 문제 (2) | 2012.03.30 |
VISUAL C++ 2008 MFC 윈도우 프로그래밍 247p 3번 (0) | 2012.02.16 |
RedrawWindow() (0) | 2012.02.13 |
0x8000 (0) | 2012.02.10 |