[Win32] 7. GDI 시스템 이해(3)
윈도우 좌표 구성에 대해
응용프로그램 내에 window영역에 자식 window를 만들어 추가가능
- 대화상자 버튼에서 대화상자의 버튼의 window임
- Client 좌표계 : 자신의 내부영역 기준으로 하는 좌표계
- Window 좌표계 : 부모 Window의 영역을 기준으로 하는 좌표계
좌표계의 종류와 좌표값을 변환하는 방법이 있음.
GetWindowRect() 윈도우 영역의 좌표를 얻는 함수
Window 좌표는 모니터화면을 기준으로 하는 절대 좌표계
- 윈도우영역 은 캡션과 테두리를 포함해서 좌표계산시 유의해야함.
(전체윈도우에서 현재 프로그램 화면의 전체좌표)
CRect r;
GetWindowRect(r); // 현재 윈도의 '윈도우 영역에 대한 좌표'를 구함
GetClientRect() 클라이언트 영역의 좌표를 언든 함수
클라이언트 영역은 개별 윈도우를 위한 상대적 좌표.
클라이언트 영역은 그냥 프로그램 내에 그 화면임.
CRect r;
GetClientRect(r); // 현재 윈도우의 '클라이언트 좌표'를 구함
자식 윈도우, 클라이언트 좌표
버튼을 윈도우에 생성했다치자.
그때 생기는 버튼도 윈도우좌표, 클라이언트 좌표가 생긴다.
- 이때 윈도우좌표 는 위와 같이 전체화면에 대한 좌표.
- 클라이언트 좌표는 위와 같이 현재 부모좌표에에서의 자신의 좌표가 된다.
WM_PAINT 메시지 처리 강제완료하기
전체영역이 무효화 됐을 때 다시 유효화 되었을 때 발생하는 메시지이다.
이때 BeginPaint(), EndPaint() 함수를 사용함.
- 근데 여기서 GDI 가 아닌 다른걸 사용하거나, BeginPaint()를 사용할 수 없는 경우가 생길수 있음
- 그때 사용하는 함수가
ValidateRect()
를 사용함.- GDI가 아니라 Direct2D를 사용하는 경우때도 사용함.
ValidateRect()
함수원형
BOOL ValidateRect(HWND hWnd, const RECT *lpRect);
이렇게 사용함.
// 유효화할 영역을 RECT 자료형으로 선언된 변수에 설정
REECT r = {50, 50, 200, 300};
// hWnd 윈도우의 r영역을 유효화 시킴
ValidateRect(hWnd, &r); // &r을 NULL로 하면 윈도우 전체영역을 의미함.
WM_PAINT에서 BeginPaint를 사용하지 않으려면
WM_PAINT 는 플래그성 메시지이다.
BeginPaint()를 쓰고 꼭 EndPaint()를 사용하는 등 DC에 비활성화 하게끔 설정을 해줬어야함.
근데 ValidateRect()를 사용하면 그냥 깔끔하게 WM_PAINT 메시지를 리셋시킬 수 있음.
사용자에게 상황을 알리고 싶을때 사용하는 창
WM_CLOSE 메시지 활용하기
프로그램 종료 확인창을 만들어보자.
프로그램의 X창을 누르면 WM_CLOSE메시지가 나옴.
이메시지가 DefWindowProc에 전달되지 않게 해야 윈도우가 닫히는걸 막을 수 있음.
else if (uMsg == WM_CLOSE) {
int check =MessageBox(hWnd, L"프로그램을 종료하시겠슴미깡?",
L"Sihwan Window 종료 확인!", MB_ICONQUESTION | MB_OKCANCEL);
if (IDCANCEL == check) return 0;
}
else if (uMsg == WM_DESTROY) PostQuitMessage(0);
제발..
놀지말자시환
WM_MOVING 메시지 사용하기
Author And Source
이 문제에 관하여([Win32] 7. GDI 시스템 이해(3)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@psh4204/Win32-7.-GDI-시스템-이해3저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)