[Win32] 7. GDI 시스템 이해(3)

Sireal·2022년 4월 6일
0

C++/Win32/MFC

목록 보기
12/12
post-thumbnail

윈도우 좌표 구성에 대해

응용프로그램 내에 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 메시지 사용하기

  • 갑자기 C#을 해야해서 C#하러 감. 시간나면 다시시작하자.
profile
🚄계속 앞으로🚄

0개의 댓글